群里同学问了这个有意思的问题,写了段简单的代码,基本思路是在一个高度为 auto 的容器中逐个插入字符,每次插入后检查容器高度,如果高度增加了,说明产生了换行。
(function ($) {
var global = this;
global.lineBreakDetection = function (text, width) {
var firstInLine = [],
height = 0,
$div;
$div = $('<div/>').css('width', width).appendTo(global.document.body);
$.each(text, function (i, char) {
$div.text($div.text() + char);
if ($div.height() > height) {
firstInLine.push(i);
height = $div.height();
}
});
$div.remove();
return firstInLine;
};
}.call(this, jQuery));这段代码在实际使用中还有三个问题要解决:
- 这个方法只能处理单个字符的语言,对于英文这样以单词为基本单位的还需要修改
- 文字宽度会受样式的影响,所以应该将文字插入实际上要检测的容器中
- 代码中逐个插入字符非常低效,应优化算法减少dom操作次数(比如先计算出每行平均字数,再做处理)
标签:JavaScript
Posted on 2012-03-08