也许没有好的方法可以完全达到我追求的目标。但是,如果放弃“实际上将其添加到页面的DOM中”的部分,下面的函数似乎可以实现我的目标。
function bboxText( svgDocument, string ) {
var data = svgDocument.createTextNode( string );
var svgElement = svgDocument.createElementNS( svgns, "text" );
svgElement.appendChild(data);
svgDocument.documentElement.appendChild( svgElement );
var bbox = svgElement.getBBox();
svgElement.parentNode.removeChild(svgElement);
return bbox;
}
编辑:
关于高度的计算说明:返回的bbox高度,即bbox.height
,总是字形的完整高度,例如a
和A
的高度相同。我无法找到更精确计算它们的方法。
但是,可以计算大写带重音符号的高度,例如Ä
。这只需要 bbox 的 y 坐标的负值,即-bbox.y
。
使用这个方法可以计算一些垂直对齐的坐标。例如,为了模拟设置为 text-before-edge
、text-after-edge
和 central
的 dominantBaseline
属性,可以进行如下计算:
text-before-edge
: dy = -bbox.y
text-after-edge
: dy = -bbox.height -bbox.y
central
: dy = -bbox.y -bbox.height/2
其中,dy
是垂直偏移量。这可以用来解决某些应用程序不支持通过属性设置这些对齐方式的限制。
H<tspan style="baseline-shift:sub;font-size:5px">2</tspan>O
的能力。因此,这个解决方案似乎行不通。 - Daniel