本文中的技巧仍然非常巧妙,但现在有一种 标准化的方法 可以实现这一点,这可能是最好的选择。
如果要截断一行文本,则可以使用 相当直接的方法。截断多行文本则比较困难。仅使用 CSS(不使用 JavaScript 或服务器端操作)非常简单。近年来,由于 Firefox(从 68 版本开始)开始支持 非常奇怪的 -webkit-line-clamp
方法,因此对该方法的浏览器支持变得相当不错。
但是,还有一种方法非常巧妙,可以称之为真正的 CSS 技巧。我们在 关于行截断的规范文章 中没有很好地介绍它,因此我将在本文中介绍,然后将其添加到该文章中。我第一次看到这个技巧是在现已关闭的 Mobify 博客上,最近 由 Natalia Onischuk 在 HackingUI 上介绍。
技巧使用行高进行测量
这是一个重要的技巧。假设一个元素的 line-height
为 1.4rem
,并且您希望确保它只显示最多三行文本。如果将 max-height
设置为 1.4rem * 3
,那么您就完成了!
我不是特别喜欢统一的 line-height
,但是在这里,它对于进行计算是必要的。我也不喜欢在元素上反复设置它,因此让我们设置一个变量,稍后可以使用它,然后使用它来设置全局 line-height
。
html {
--lh: 1.4rem;
line-height: var(--lh);
}
设置该最大高度
截断就是这样发生的
.truncate-overflow {
--max-lines: 3;
max-height: calc(var(--lh) * var(--max-lines));
overflow: hidden;
}
实际上,您可以保留这种状态。如果您不关心省略号,这可能就足够了。
当您想要显示省略号时,技巧的其余部分就派上用场了
省略号(“…”)表示文本已截断,并且比显示的内容更长。在截断文本时使用省略号可能是一个不错的做法,这样内容就不会以突然的、奇怪的方式结束。(好吧,内容本身可能很奇怪,但是,您已经尝试过了。)
如果在元素上设置 position: relative
,则可以在右下角绝对定位省略号。
.truncate-overflow::before {
content: "...";
position: absolute;
bottom: 0;
right: 0;
}
我非常想,不是设置底部,而是设置顶部并使用 top: calc(var(--lh) * (var(--max-lines) - 1))
。我的想法是,您也可以将省略号放置在您需要的确切位置。如果文本太短,隐藏的溢出将将其截断。这样做的问题是,它没有解决“恰好为最大行数”问题。当文本与最大行数匹配时,省略号将显示出来——而不仅仅是在超过该空间时显示。
我们必须更加巧妙!
请注意,这种“在右下角设置内容”的方法非常适合从左到右的语言。我将使用 CSS 逻辑属性(例如 inset-inline-end
而不是 right
)来制作演示,以期使其更便于各种语言和流场景使用。
另一个限制是,省略号不会附加到最后一个单词,因为它是在绝对位置放置的。我们也不会解决这个问题。
如果文本太短,就隐藏省略号
这是技巧的第二部分。如果我们始终将绝对位置设置在文本的底部/末尾,那就没问题。但如果文本恰好等于 --max-lines
值或更短,我们希望将其隐藏。
技巧是,创建一个与背景相同的小方框,将其放在省略号上面将其覆盖。我们可以使用另一个伪元素来做到这一点
.truncate-overflow::after {
content: "";
position: absolute;
right: 0; /* note: not using bottom */
width: 1rem;
height: 1rem;
background: white;
}
我们在这里使用的另一个技巧是不设置底部 (inset-block-end
) 属性。这会将方框放置在内容底部,而不是相对父元素的底部,这非常有用。
我将方框设置为红色,以便您在这三个不同的示例中看到它们

--max-lines
的值完全相同,此系统也能正常工作。演示
我使用 想要使用 CSS 逻辑属性,因为浏览器支持已经非常不错了。如果您支持任何版本的 IE,则需要使用 bottom
和 right
。
这些浏览器支持数据来自 Caniuse,其中包含更多详细信息。数字表示浏览器从该版本及其更高版本开始支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
89 | 66 | 否 | 89 | 15 |
移动设备/平板电脑
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127 | 127 | 127 | 15.0-15.1 |
辅助功能问题
Joseph Scherben 提到
如果元素包含交互式元素,并且溢出是隐藏的(不是滚动),则这些元素将可聚焦,但在网站上不可见。这会导致键盘/辅助工具用户在隐藏的剪裁内容中迷失方向
这可能是由于我的高分辨率显示器,但在演示中,省略号只有半部分被白色方框遮盖。无论如何,您仍然只能将省略号定位在方框的角落,而不是紧跟在被截断的文本之后。我认为这是非常巧妙的 CSS 解决方案,在紧急情况下很有用,但最终应该有一个更好的规范来解决这个问题。
为了确保人们没有产生误解,“非常奇怪的
-webkit-line-clamp
方法”可能看起来很奇怪,但最近它已在所有现代浏览器中得到广泛支持,并且它能够正常工作(至少,我知道的没有重大问题)。不幸的是,现在一些
-webkit-
属性已经成为标准,但如果它们能完成工作,就没有理由避免使用它们。我在谈论它对该方法最近良好的浏览器支持时,在一句话中提到了它。
很酷的技巧!但是,像这样的事情让我感到困惑,为什么它如此复杂。我见过的所有解决方案都是基于行数的。
text-overflow: ellipsis;
无论被溢出的容器的宽度如何,都能正常工作。为什么没有针对多行的解决方案也能以相同的方式工作?如果我想让我的容器高度动态变化,并且还希望文本在溢出时在末尾显示省略号怎么办?在我看来,这个问题被过度设计了(不是您的解决方案,而是整个功能/问题)。想要 4 行文本?将父元素的高度设置为行高 4 倍。让文本截断/省略号根据可用高度和宽度动态变化。
我认为,将某事描述为“变得更容易”和“怪异”并不能说明它在所有主流浏览器中都能正常工作。
我和 Alex 遇到了一样的问题。我看到最后两段的省略号部分。我在 Win10 上使用 Firefox 68。
如果你也使用
text-align: justify
来对齐右边缘,那么右上角的省略号就不那么糟糕了。这在多年前可能是一个不错的技巧,但正如 Šime Vidas 所说,
-webkit-line-clamp
属性是更好的选择,并且得到了广泛的支持:https://caniuse.cn/#search=line-clamp.我认为你可以将行高单位去掉,只用 1rem 乘以结果。
至少我对 WebKit 行夹紧方法做了一些类似的事情。
我在读完这篇文章后不久听了 State of CSS Shop Talk Show 播客。它让我开始思考 CSS 排除,以及它们是否可以用来稍微改善这种效果。我在 IE11 和支持行夹紧的浏览器中很喜欢最终的效果:https://s.codepen.io/soluml/debug/KOKGmB/wQAPoNnKJxnr
我正在尝试这个很酷的技巧,但如果你需要设置最小高度(1.4rem * 3),而你只有一行内容,你会怎么做呢?
-webkit-box-orient 怎么样?
我可以使用它吗?或者它不支持?
我总是很挑剔,但这正是我。省略号是一个单独的字符,…,可以在 Mac 上输入为 ⌥.(Option+Period)。它看起来像三个点,但大多数字体在与三个点相比时会调整间距。上面的文章文本和 CSS 代码实际上只使用了三个点。使用实际的省略号字符将是一个微妙但优雅的触感,更有可能看起来像一个本机控件。