我正在为一个SVG文件编写一些ECMAScript/JavaScript,需要获取text
元素的width
和height
,这样我就可以调整围绕它的矩形的大小。在HTML中,我可以使用元素的offsetWidth
和offsetHeight
属性,但这些属性似乎不可用。
这是我需要处理的一个片段,每当我改变文本时,我需要改变矩形的宽度,但是我不知道如何获得text
元素的实际width
(以像素为单位)。
<rect x="100" y="100" width="100" height="100" />
<text>Some Text</text>
有什么想法吗?
7条答案
按热度按时间rpppsulh1#
然后相应地设置rect的属性。
链接:SVG v1.1标准中的
getBBox()
。s1ag04yj2#
为我工作过
h4cxqtbf3#
关于文本的长度,链接似乎指示BBox和getComputedTextLength()可能返回略有不同的值,但彼此相当接近。
http://bl.ocks.org/MSCAU/58bba77cdcae42fc2f44
jtw3ybtb4#
这样的兼容性如何:
返回三种方法的所有有效结果的平均值,如果元素是文本元素,您可以对其进行改进以剔除异常值或使用
getComputedTextLength
。警告:正如评论所说,
getBoundingClientRect
是棘手的。要么从方法中删除它,要么只在getBoundingClientRect
将返回良好结果的元素上使用它,因此没有旋转,可能也没有缩放(?)fykwrbwg5#
不知道为什么,但是上面的方法对我都不起作用。我在画布方法上取得了一些成功,但是我不得不应用各种各样的比例因子。即使使用了比例因子,我在Safari、Chrome和Firefox之间的结果仍然不一致。
所以,我尝试了以下方法:
工作起来很棒,超级精确,但只在Firefox中。比例因子拯救了Chrome和Safari,但没有喜悦。原来Safari和Chrome错误与字符串长度或字体大小都不是线性的。
那么,第二种方法。我不太喜欢暴力破解的方法,但是在断断续续地挣扎了几年之后,我决定给予一下。我决定为每个可打印字符生成常量值。通常这会有点乏味,但幸运的是Firefox碰巧超级精确。下面是我的两部分暴力破解解决方案:
注意:上面的代码片段必须在Firefox中执行才能生成一个精确的数组值。另外,您必须在控制台日志中用空格宽度值替换数组项32。
我只需要复制Firefox屏幕上的文本,并将其粘贴到我的JavaScript代码中。现在我已经有了可打印字符长度的数组,我可以实现一个get width函数。
嗯,就是这样。蛮力,但它在所有三个浏览器中都非常准确,我的挫折感已经降到了零。不知道随着浏览器的发展,它会持续多久,但它应该足够长,我可以为我的SVG文本开发一个健壮的字体度量技术。
ua4mk5z46#
SVG规范具有返回此信息的特定方法:第一个月
mitkmikd7#
如果你正在使用NodeJS并且希望保持你的应用程序轻便(例如不使用无头浏览器),一个可以使用的解决方案是预先计算字体大小。
1.使用:https://github.com/nicktaras/getFontCharWidth可以确定字体中每个字符的宽度。
1.然后在一个节点js应用程序中,例如,您可以迭代每个字符来计算实际宽度。