我有一些动态文本包含在一个div中,这个div的大小由用户在文本框中输入的内容来决定。如果文本不能适应这个div,现在它会被截断在边缘,所有超出边界的文本都不可见。我想要截断文本,使其适合盒子内,并在结尾加上省略号(...)。例如:
|----div width------|
Here is some sample text that is too long.
Here is some sam...
显然,在这个例子中很容易,因为code标签使用的是等宽字体,所以只需数字符号即可。我使用的是变宽字体,所以如果他们输入“WWWWWWWWWWW”,它将比“................”少用许多字符。怎么做才是最好的?我在这里找到了一个简单找到文本实际像素宽度的潜在解决方案:http://www.codingforums.com/archive/index.php/t-100367.html 但即使有这样的方法,实现省略号还是有点棘手。例如,如果有20个字符而我发现它不适合,则必须截断到19个字符,添加省略号,然后再次检查是否适合。 然后截断到18(加上省略号)并再次尝试。反复以上步骤,直到它适合为止。 有更好的方法吗?
编辑:根据答案,我已决定采用我的原始方法,但我试图改进上面链接中的解决方案,不创建单独的td元素进行测量,这感觉像一个hack。
这是我的代码:
<div id="tab" class="tab">
<div id="tabTitle" class="tabTitle">
<div class="line1">user-supplied text will be put here</div>
<div class="line2">more user-supplied text will be put here</div>
</div>
</div>
还有样式:
.tab {
padding: 10px 5px 0px 10px;
margin-right: 1px;
float: left;
width: 136px;
height: 49px;
background-image: url(../images/example.gif);
background-position: left top;
background-repeat: no-repeat;
}
.tab .tabTitle {
height: 30px;
width: 122px;
overflow: hidden;
text-overflow: ellipsis;
font-size: 12px;
font-weight: bold;
color: #8B8B8B;
}
.tab .tabTitle .line1, .tab .tabTitle .line2 {
display:inline;
width:auto;
}
以及截断文本并添加省略号的 JavaScript 代码:
function addOverflowEllipsis( containerElement, maxWidth )
{
var contents = containerElement.innerHTML;
var pixelWidth = containerElement.offsetWidth;
if(pixelWidth > maxWidth)
{
contents = contents + "…"; // ellipsis character, not "..." but "…"
}
while(pixelWidth > maxWidth)
{
contents = contents.substring(0,(contents.length - 2)) + "…";
containerElement.innerHTML = contents;
pixelWidth = containerElement.offsetWidth;
}
}
该函数接受“line1”和“line2” div作为参数。 当单词输入像“WWWWWWWWWWWWWWWWW”时,它能正常工作,但是当多个单词输入像“WWWWW WWWWW WWWWW”时就不行了,因为它只添加了换行符,并将文本的宽度测量为“WWWWW”的宽度。
是否有一种方法可以解决这个问题而不需要将文本复制到隐藏的测量元素中?某种方式来设置行div的样式,使其不换行?