SVG、文本、固定宽度/高度的字体

Posted

技术标签:

【中文标题】SVG、文本、固定宽度/高度的字体【英文标题】:SVG, text , font with fixed width/height 【发布时间】:2010-12-16 11:31:37 【问题描述】:

我正在尝试让 SVG 'text' 元素适合 svg 'rect' 元素。例如在下面的示例中,我使用了 5 个字符的等宽文本,字体大小为 100px,并且我希望在文本附近有一个边界矩形。

但文字右侧有一个空白。

<svg xmlns="http://www.w3.org/2000/svg"  >
    <text x="10px" y="110px" style="font-family:monospace;font-size:100px;">HELLO</text>    
    <rect x="10px" y="10px"   style="stroke:blue;fill:none;"/> 
</svg>

我应该为“文本”元素使用哪些 CSS 选择器?

注意:我不想使用 text-on-a-path 方法。只是一个固定大小的字体。

谢谢;

【问题讨论】:

【参考方案1】:

字体的大小决定了它的高度,而不是它的宽度;而且字符很少是方形的。

据我所知,没有办法通过 CSS 可靠地确定等宽文本的宽度。

嗯,CSS3 有ch unit,这是0 字符的宽度。这适用于等宽文本。但 SVG 不支持它。

当然,您可以设置一个以像素为单位的固定宽度。 300 像素的宽度适合我。但是,如果其他人使用不同的等宽字体,则固定宽度可能会关闭。如果您在&lt;rect&gt; 上也添加font-family:monospace;font-size:100px;,您可以在ems 中设置矩形的宽度。但我不认为这更可靠。

但是,您可以使用脚本。您可以使用getComputedTextLength() 获取text element 的文本长度:

<script type="text/javascript">
document.getElementById('rect').setAttribute(
    'width',
    document.getElementById('text').getComputedTextLength()
);
</script>

在 SVG 末尾添加(并添加适当的元素 ID)至少在 Opera 10、Firefox 3.5 和 Safari 4.0 中有效。

当您使用它时,您也可以使用getBBox() 来获取文本元素的边界框,这样您就可以设置矩形的高度以匹配字体大小,以防您决定更改字体大小。

【讨论】:

以上是关于SVG、文本、固定宽度/高度的字体的主要内容,如果未能解决你的问题,请参考以下文章

如何使 SVG 宽度响应但保持 SVG 高度不变?

计算 SVG 文本高度和宽度的正确方法

如何在具有特定宽度和高度的矩形中获取 svg 文本元素?

iOS 文本字体的默认宽度和高度

如何在不改变高度的情况下让 SVG 具有流畅的宽度?

iOS 10中的UILabel,制作文字字体