我在 div 中包含一些动态文本,该文本设置为用户在文本框字段中输入的任何内容。如果文本不适合 div,那么现在它只会在边缘被切断,并且所有超出边界的文本都不可见。我想截断文本,使其适合框内并在末尾附加省略号 (...)。例如:
|----div width------|
Here is some sample text that is too long.
Here is some sam...
显然,在示例中这很容易,因为代码标签使用了固定宽度的字体,所以就像计算字符一样简单。我有一个可变宽度字体,所以如果他们输入“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 的样式,以便它们不换行?