我面前有这种独特的情况,我想要创建一个只显示8行文字的功能。该网站响应迅速。这是我尝试过的:
var fontSize = $target.css("font-size").match(/\d/g).join(""),
lineWidth = $target.width(),
totalLetters = $target.text().length,
lettersPerLine = (totalLetters * fontSize) / lineWidth,
numOfLines = Math.round(totalLetters/lettersPerLine);
问题:
<p>
宽度为600px,那么显然900字不适合一行......浏览器会将文本换行到新行..但是浏览器做了什么来实现这一点,是吗?插入换行符\n
?答案 0 :(得分:3)
在想要知道这几次之后,我想出的一个灵魂就是通过渲染它们来预先计算角色的高度和宽度,缓存它并产生查找功能。
只要呈现body > span
,以下工作即可。参数是可选的,默认为body > span
的样式和字体的第一个255
字符。
function charSizes(numChars, cssFont) {
var span = document.createElement('span'),
text = document.createTextNode(''),
uia, i, j;
span.appendChild(text);
if (cssFont) span.style.font = cssFont;
span.style.padding = span.style.margin = 'none';
document.body.appendChild(span);
numChars = (numChars || 255);
uia = new Uint32Array(numChars * 2);
for (j = i = 0; i < numChars; j = 2 * ++i) {
text.data = String.fromCharCode(i);
uia[j] = span.offsetWidth;
uia[j + 1] = span.offsetHeight;
}
// free memory
document.body.removeChild(span);
span = text = numChars = cssFont = null;
// output lookup function
return function (c) {
var i = c.charCodeAt(0) * 2;
return {
width: uia[i],
height: uia[i + 1]
};
};
}
var arial12 = charSizes(0xFF, '12px Arial');
现在您可以轻松查找字符
arial12('a'); // {width: 7, height: 15}
arial12('-'); // {width: 5, height: 15}
答案 1 :(得分:1)
简单的css解决方案是将容器的高度设置为8em
并将溢出设置为hidden
。
在实践中,我发现这是不准确的。这是一个jQuery解决方案(假设我有div
,其id为bozo
):
function getFontHeight(className) {
$testdiv = $('<div stlye="white-space:nowrap;">jgpqAZ</div>');
if (className) $testdiv.addClass(className);
$('body').append($testdiv);
var height = $testdiv.innerHeight();
$testdiv.remove();
return height;
}
$('#bozo').height(getFontHeight() * 8);
#bozo {
overflow: hidden;
width:100%;
}