跨浏览器多行文本溢出,在固定宽度和高度内附加省略号

IT技术 javascript jquery html css
2021-02-07 21:09:57

我为这个问题制作了一张图片,以便于理解。

是否可以在<div>具有固定宽度和多行的 a上创建省略号

文本溢出

我在这里和那里尝试了一些 jQuery 插件,但找不到我正在寻找的插件。有什么推荐吗?想法?

6个回答

只是一个快速的基本想法。

我正在使用以下标记进行测试:

<div id="fos">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nisi ligula, dapibus a volutpat sit amet, mattis et dui. Nunc porttitor accumsan orci id luctus. Phasellus ipsum metus, tincidunt non rhoncus id, dictum a lectus. Nam sed ipsum a lacus sodales eleifend. Vestibulum lorem felis, rhoncus elementum vestibulum eget, dictum ut velit. Nullam venenatis, elit in suscipit imperdiet, orci purus posuere mauris, quis adipiscing ipsum urna ac quam.</p>  
</div>

和 CSS:

#fos { width: 300px; height: 190px; overflow: hidden; }
#fos p { padding: 10px; margin: 0; }

应用此 jQuery 将实现所需的结果:

var $p = $('#fos p');
var divh = $('#fos').height();
while ($p.outerHeight() > divh) {
    $p.text(function (index, text) {
        return text.replace(/\W*\s(\S)*$/, '...');
    });
}

它反复尝试删除文本的最后一个单词,直到达到所需的大小。因为溢出:隐藏;该过程仍然不可见,即使关闭 JS,结果仍然“视觉上正确”(当然没有“...”)。

如果您将此与服务器端的合理截断相结合(只留下很小的开销),那么它会运行得更快:)。

同样,这不是一个完整的解决方案,只是一个想法。

更新:添加了一个jsFiddle 演示

虽然在这种情况下不太可能成为问题,但重复更新 DOM 和检查布局是一个坏主意,因为它可能会导致速度变慢。为了缓解这种情况,您可以使用类似于二分搜索的方法:测试文本块是否已经适合,否则将文本拆分为单词或字符并定义您的边界(下=1 个单词/字符,上=所有单词/字符) , while ((upper-lower)>1) {let middle=((lower+upper)/2)|0 /*|0 is quick floor*/; if (test(words.slice(0,middle)+'...')) {lower=middle;} else {upper=middle;}}. 正如@KrisWebDev 发现的那样,您还需要检查一个大词。
2021-03-13 21:09:57
很棒的解决方案@bazmegakapa ...但我在尝试将其适应我的情况时遇到了一些问题。我有各种各样的li,每个里面都有一个.block和一个.block h2,我需要将它应用到h2内部,.block但我无法让它工作。如果不止一个有什么不同.block h2吗?
2021-03-19 21:09:57
这个解决方案很棒。就我而言,我需要跟踪原始文本,以便我可以响应地截断全文值。因此,当页面加载时,我将原始文本存储在一个变量中,并且在运行此逻辑之前,我确保使用原始文本值“刷新”元素。添加去抖动功能,效果非常好。
2021-03-22 21:09:57
我对这个脚本无限循环不好的体验,因为文本只包含一个很长的单词,所以替换正则表达式从未匹配过。为避免这种情况,请在该while之后添加以下代码if(!$p.text().match(/\W*\s(\S)*$/)) break;
2021-03-31 21:09:57
在我的情况下,它只留下2 行文本,而应该有 3 行。显然我的容器比 line 小height*3几个像素。 简单的解决方法是简单地添加几个像素到divh
2021-04-04 21:09:57

试试jQuery.dotdotdot插件。

$(".ellipsis").dotdotdot();
我已经试过了,它工作正常。应该是公认的答案
2021-03-19 21:09:57
你会怎么发音?点点点点?
2021-03-25 21:09:57
用>600行js解决一个应该用css解决的问题真的很烂
2021-03-30 21:09:57
这是一个商业工具,单个站点的费用为 5 美元,多个站点的费用为 35 美元。许可将是一个痛苦。我认为它是免费的并且可以立即集成,但事实并非如此!
2021-04-04 21:09:57
可行,但请确保使用 window.loaded 事件而不是 $(document).ready(),因为字体和其他外部资源可能会影响 HTML 的布局。如果 dotdotdot 在这些资源加载之前执行,文本将不会在正确的位置被截断。
2021-04-09 21:09:57

用于“线夹”的 Javascript 库

请注意,“线夹”也称为“多线块上的省略号”或“垂直省略号”。


github.com/BeSite/jQuery.dotdotdot


github.com/josephschmitt/Clamp.js


这里还有一些我还没有研究过:


用于线夹的 CSS 解决方案

有一些 CSS 解决方案,但最简单的用途-webkit-line-clamp是浏览器支持不佳jsfiddle.net/AdrienBe/jthu55v7/上查看现场演示

为了仅使用 CSS 实现这一点,许多人付出了巨大的努力。请参阅有关它的文章和问题:


我会推荐什么

把事情简单化。除非您有大量时间专门用于此功能,否则请选择最简单且经过测试的解决方案:简单的 CSS 或经过良好测试的 javascript 库。

选择一些花哨/复杂/高度定制的东西,你将为此付出代价。


别人做什么

像 Airbnb 那样淡出可能是一个很好的解决方案。它可能是基本的 CSS 加上基本的 jQuery。实际上,它似乎与CSSTricks上的这个解决方案非常相似

AirBnb“阅读更多”解决方案

哦,如果你寻找设计灵感:

您可以将-webkit-line-clamp属性与div.

-webkit-line-clamp: <integer>这意味着在截断内容之前设置最大行数,然后(…)在最后一行的末尾显示省略号

div {
  width: 205px;
  height: 40px;
  background-color: gainsboro;
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  
  /* <integer> values */
  -webkit-line-clamp: 2;
}
<div>This is a multi-lines text block, some lines inside the div, while some outside</div>

这种方法有几个缺点,使得使用此功能无效: - 这不适用于单个长词,例如“thisisoneverylonglongword”;- 如果行高不是容器高度的倍数,您仍然可以看到被截断的文本
2021-03-28 21:09:57
不知道为什么有人不赞成这个答案。截至 2020 年 3 月,浏览器支持相当不错 - 95% caniuse.com/#search=line-clamp
2021-04-02 21:09:57

Adrien Be 的回答中找到了这个仅使用CSS 的简短解决方案

.line-clamp {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical; 
  overflow: hidden; 
}

截至2020 年 3 月, 浏览器支持率为95.3%,IE 和 Opera Mini 不支持。适用于 Chrome、Safari、Firefox 和 Edge。