乐闻世界logo
搜索文章和话题

使用 css 将文本长度限制为 n 行

9 个月前提问
5 个月前修改
浏览次数67

6个答案

1
2
3
4
5
6

要在 CSS 中将文本长度限制为 n 行,一种常见的做法是使用 line-clamp 特性,但需要注意的是,line-clamp 是一个现代浏览器支持的非标准特性,属于 CSS Overflow Module的一部分。这种方法的好处是它允许文本在达到指定的行数限制后显示省略号(...),这样可以向用户清晰地表明文本已被截断。

假设我们想将一个段落的文本限制为3行,我们可以使用以下 CSS 代码:

css
p { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; }

在这个例子中,先设置 display: -webkit-box 启用弹性盒子布局;接着,使用 -webkit-line-clamp: 3 来定义文本行数的最大限制为3行;然后,设置 -webkit-box-orient: vertical 让内容垂直展开;最后,设置 overflow: hiddentext-overflow: ellipsis 来确保超出部分被隐藏,并且在内容末尾显示省略号。

我在实际项目中曾使用过这种方法,以确保新闻摘要或用户评论在不同设备上具有一致的外观并且不会占用太多空间。这样的处理提升了页面布局的整洁性并改善了用户体验。不过,需要注意的是 -webkit-line-clamp 主要在基于 WebKit/Blink 的浏览器上工作(比如 Chrome、Safari),尽管如今大多数现代浏览器都支持这一特性,但在使用时仍需考虑向后兼容性。

2024年6月29日 12:07 回复

可以使用非官方的line-clamp语法来完成此操作,并且从 Firefox 68 开始,它适用于所有主要浏览器。

css
body { margin: 20px; } .text { overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; /* number of lines to show */ line-clamp: 2; -webkit-box-orient: vertical; } <div class="text"> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam consectetur venenatis blandit. Praesent vehicula, libero non pretium vulputate, lacus arcu facilisis lectus, sed feugiat tellus nulla eu dolor. Nulla porta bibendum lectus quis euismod. Aliquam volutpat ultricies porttitor. Cras risus nisi, accumsan vel cursus ut, sollicitudin vitae dolor. Fusce scelerisque eleifend lectus in bibendum. Suspendisse lacinia egestas felis a volutpat. </div>

除非你关心IE用户,否则没有必要使用 line-heightmax-height来实现需求。

2024年6月29日 12:07 回复

您可以执行以下操作:

shell
.max-lines { display: block;/* or inline-block */ text-overflow: ellipsis; word-wrap: break-word; overflow: hidden; max-height: 3.6em; line-height: 1.8em; } <p class="max-lines">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vitae leo dapibus, accumsan lorem eleifend, pharetra quam. Quisque vestibulum commodo justo, eleifend mollis enim blandit eu. Aenean hendrerit nisl et elit maximus finibus. Suspendisse scelerisque consectetur nisl mollis scelerisque.</p>

运行代码片段隐藏结果

展开片段

其中max-height:= line-height:×<number-of-lines>em.

2024年6月29日 12:07 回复

有效的跨浏览器解决方案

这个问题多年来一直困扰着我们大家。

为了在所有情况下提供帮助,我列出了仅 CSS 方法,以及 jQuery 方法,以防 css 警告出现问题。

这是我提出的一个仅 CSS 的解决方案,它适用于所有情况,但有一些小注意事项。

基础很简单,它隐藏跨度的溢出,并根据 Eugene Xa 的建议根据行高设置最大高度。

然后在包含 div 后面有一个伪类,可以很好地放置省略号。

注意事项

此解决方案将始终放置省略号,无论是否需要它。

如果最后一行以结束句结尾,您将得到四个点......

您需要对合理的文本对齐感到满意。

省略号将位于文本的右侧,这可能看起来很草率。

代码+片段

jsfiddle

shell
.text { position: relative; font-size: 14px; color: black; width: 250px; /* Could be anything you like. */ } .text-concat { position: relative; display: inline-block; word-wrap: break-word; overflow: hidden; max-height: 3.6em; /* (Number of lines you want visible) * (line-height) */ line-height: 1.2em; text-align:justify; } .text.ellipsis::after { content: "..."; position: absolute; right: -12px; bottom: 4px; } /* Right and bottom for the psudo class are px based on various factors, font-size etc... Tweak for your own needs. */ <div class="text ellipsis"> <span class="text-concat"> Lorem ipsum dolor sit amet, nibh eleifend cu his, porro fugit mandamus no mea. Sit tale facete voluptatum ea, ad sumo altera scripta per, eius ullum feugait id duo. At nominavi pericula persecuti ius, sea at sonet tincidunt, cu posse facilisis eos. Aliquid philosophia contentiones id eos, per cu atqui option disputationi, no vis nobis vidisse. Eu has mentitum conclusionemque, primis deterruisset est in. Virtute feugait ei vim. Commune honestatis accommodare pri ex. Ut est civibus accusam, pro principes conceptam ei, et duo case veniam. Partiendo concludaturque at duo. Ei eirmod verear consequuntur pri. Esse malis facilisis ex vix, cu hinc suavitate scriptorem pri. </span> </div>

运行代码片段隐藏结果

展开片段

jQuery 方法

我认为这是最好的解决方案,但并不是每个人都可以使用 JS。基本上,jQuery 将检查任何 .text 元素,如果字符数多于预设的最大变量,它将截断其余部分并添加省略号。

这种方法没有任何警告,但是这个代码示例只是为了演示基本思想 - 我不会在生产中使用它而不对其进行改进,原因有两个:

1)它将重写.text elems的内部html。无论需要与否。 2)它没有测试来检查内部 html 是否没有嵌套元素 - 所以你非常依赖作者正确使用 .text 。

已编辑

感谢您的关注@markzzz

代码和片段

jsfiddle

shell
setTimeout(function() { var max = 200; var tot, str; $('.text').each(function() { str = String($(this).html()); tot = str.length; str = (tot <= max) ? str : str.substring(0,(max + 1))+"..."; $(this).html(str); }); },500); // Delayed for example only. .text { position: relative; font-size: 14px; color: black; font-family: sans-serif; width: 250px; /* Could be anything you like. */ } <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <p class="text"> Old men tend to forget what thought was like in their youth; they forget the quickness of the mental jump, the daring of the youthful intuition, the agility of the fresh insight. They become accustomed to the more plodding varieties of reason, and because this is more than made up by the accumulation of experience, old men think themselves wiser than the young. </p> <p class="text"> Old men tend to forget what thought was like in their youth; </p> <!-- Working Cross-browser Solution This is a jQuery approach to limiting a body of text to n words, and end with an ellipsis -->

展开片段

2024年6月29日 12:07 回复

以下 CSS 类将文本限制为两行,并插入省略号以指示溢出的文本。

shell
.two-line-ellipsis { overflow: hidden; width: 100%; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } <div class="two-line-ellipsis">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ex sit amet diam efficitur pellentesque. Mauris posuere scelerisque libero, nec pretium mauris molestie non. Nulla aliquam sollicitudin egestas. Fusce aliquet elit vitae mi volutpat vehicula. Vestibulum vel sapien enim. Nulla eu volutpat ex, ac faucibus urna. Etiam mattis rutrum ullamcorper. Ut sagittis, erat sit amet vulputate commodo, nisl lacus aliquet magna, vel condimentum ante felis rutrum nibh. Suspendisse ut lorem rutrum, molestie velit eget, hendrerit lorem. Vivamus rutrum nunc elit, nec lacinia risus viverra ut.</div>
2024年6月29日 12:07 回复

据我所知,这只有使用才有可能,即使如此,最终height: (some em value); overflow: hidden也不会有什么花哨的。...

如果这不是一个选项,我认为没有一些服务器端预处理(很困难,因为文本流不可能可靠地预测)或 jQuery(可能但可能很复杂),这是不可能的。

2024年6月29日 12:07 回复

你的答案