这可能有点晚了,但我一直在寻找解决方案,一位同事提出了一个非常优雅的解决方案,我将分享。它需要一些 JS,但不是很多。
假设您有一个div,您需要将标签放入其中:
<div style="width: 200px; overflow: hidden"></div>
现在,你有一个函数,它需要两个参数:一个带有标签的字符串,以及一个 DOM 元素(这个div)来适应它:
function setEllipsisLabel(div, label)
你要做的第一件事是用这个标签创建一个span,并将它放入div:
var span = document.createElement('span');
span.appendChild(document.createTextNode(label));
span.style.textOverflow = 'ellipsis';
span.style.display = 'inline-block';
div.appendChild(span);
我们将text-overflow 属性设置为“省略号”,以便在文本被截断时,在末尾添加一个漂亮的“...”来说明这一点。我们还将display 设置为“inline-block”,以便这些元素具有我们以后可以操作的真实像素尺寸。到目前为止,没有什么是我们用纯 CSS 做不到的。
但是我们想要中间的省略号。首先,我们应该确定是否需要它...这可以通过比较 div.clientWidth 和 span.clientWidth 来完成 - 仅当 span 比 div 宽时才需要省略号。
如果我们确实需要省略号,让我们首先说我们希望在单词末尾显示固定数量的字符 - 比如说 10。所以让我们创建一个仅包含标签最后 10 个字符的跨度,并坚持将其放入 div:
var endSpan = document.createElement('span');
endSpan.style.display = 'inline-block';
endspan.appendChild(document.createTextNode(label.substring(label.length - 10)));
div.appendChild(endSpan);
现在,让我们覆盖原来的 span 的宽度以适应新的宽度:
span.style.width = (div.clientWidth - endSpan.clientWidth) + 'px';
因此,我们现在有一个看起来像这样的 DOM 结构:
<div style="width: 200px; overflow: hidden">
<span style="display: inline-block; text-overflow: ellipsis; width: 100px">
A really long label is shown in this span
</span>
<span style="display: inline-block"> this span</span>
</div>
因为第一个span 有text-overflow 设置为“省略号”,所以它会在末尾显示“...”,然后是第二个跨度的10 个字符,导致省略号大约显示在中间div.
您也不需要硬编码 endSpan 的 10 个字符长度:这可以通过计算 span 的初始宽度与 div 的初始宽度的比率来近似,从长度中减去适当的比例标签和除以二。