有几种方法可以切开这只猫。两个明显的问题很容易浮现在脑海中。
视野外标尺技术
这个是最简单的。只需在画布的 viewBox 之外创建一个文本元素,用您的字体信息和文本填充它,然后测量它。
// set it up -- put the variable somewhere globally or contextually accessible, as necessary
var textRuler = paper.text( -10000, -10000, '' ).attr( { fill: 'none', stroke: 'none' } );
function getTextWidth( text, fontFamily, fontSize )
{
textResult.attr( { text: text, 'font-family': fontFamily, 'font-size': fontSize } );
var bbox = textResult.getBBox();
return bbox.width;
}
无论如何,它都不优雅。但它会以相对较少的开销和不复杂的方式满足您的需求。
Cufonized 字体
如果您愿意考虑使用cufonized字体,您可以计算给定文本字符串的大小,而完全不需要弄乱 DOM。事实上,这大概就是 canvas 的 elementsmeasureText
方法在幕后所做的事情。给定一个导入的字体,你可以简单地做这样的事情(考虑这个 protocode!)
// font should be the result of a call to paper.[getFont][2] for a cufonized font
function getCufonWidth( text, font, fontSize )
{
var textLength = text.length, cufonWidth = 0;
for ( var i = 0; i < textLength; i++ )
{
var thisChar = text[i];
if ( ! font.glyphs[thisChar] || ! font.glyphs[thisChar].w )
continue; // skip missing glyphs and/or 0-width entities
cufonWidth += font.glyphs[thisChar].w / font.face['units-per-em'] * fontSize;
}
return cufonWidth;
}
我真的很喜欢使用 cufonized 字体——就它们以有趣的方式制作动画的能力而言,它们比文本更有用。但是第二种方法可能比您需要或想要的更复杂。