我从来没有尝试过这个,也许这很疯狂,但不是所有(不幸的是无益的)建议通过一遍又一遍地改变大小直到文本适合来解决这个问题,也许你可以只尝试两种非常不同的字体大小(使用 no-换行,当然),例如 10 和 100,然后假设关系应该几乎是线性的,然后插值或推断您的预期值?我不知道做这样的两个布局是否对你的瓶颈来说太贵了。如果是这样,我不确定你真的有什么希望,因为字体可能很棘手。但这可能会奏效。
更新:我使用这种技术创建了一个小提琴。它似乎工作得相当好。相关代码为:
var font_size_to_fit = (function() {
var $test = $("<span/>").appendTo("body").css({
visibility: "hidden",
border: 0,
padding: 0,
whiteSpace: "pre"
});
var minFont = 10, maxFont = 100;
return function(txt, fontFamily, size) {
$test.appendTo("body").css({fontFamily: fontFamily}).text(txt);
$test.css({fontSize: maxFont + "px"});
var maxWidth = $test.width();
$test.css({fontSize: minFont + "px"});
var minWidth = $test.width();
var width = (size - minWidth) * (maxFont - minFont) /
(maxWidth - minWidth) + minFont;
$test.detach();
return width + "px";
};
}());
这可能还需要一些错误检查以确保我们没有被零除,这会在 时发生minWidth == maxWidth
,很可能在提供的文本为空时发生。这留给读者作为练习。
另一个更新:这在某个时候坏了。我更新了小提琴以包含以下内容:
return (width - .1) + "px";
这修复了评论中指出的错误。但我不知道发生了什么变化使其介于两者之间。