列表标题太长撑破布局、文章摘要溢出容器——这是每个前端都遇到过的问题。用 CSS 让超长文本自动变成"省略号…"其实只需要几行代码,但单行和多行的写法完全不同,坑也不一样。本文一次讲清。
单行文本省略:三件套
单行省略是最经典的组合,三个属性缺一不可:
css
ellipsis-single.css
.title {
white-space: nowrap; /* 禁止换行 */
overflow: hidden; /* 溢出隐藏 */
text-overflow: ellipsis; /* 溢出部分显示省略号 */
}
原理很直白:文本不许换行,容器宽度固定,超出部分藏起来并用省略号标记。注意元素必须有确定的宽度(块级元素默认占满父宽即可)。
多行文本省略:line-clamp
想限制摘要只显示 2 行、3 行?用 -webkit-line-clamp:
css
ellipsis-multi.css
.summary {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3; /* 超过 3 行截断 */
overflow: hidden;
}
四个属性是一套固定组合:display: -webkit-box 开启盒模型,box-orient: vertical 指定纵向排列,line-clamp 写最大行数。改行数只需要动 3 这个数字。
💡 好消息:这个写法虽然带 -webkit- 前缀,但如今 Chrome、Edge、Firefox、Safari 全支持,已成为事实标准。CSS Overflow Level 4 规范还收录了无前缀版本
line-clamp,Firefox 134+ 已支持。稳妥起见,两个都写:
css
兼容写法
.summary {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3; /* 标准属性,新浏览器识别 */
overflow: hidden;
}
三个常见的"不生效"坑
坑一:元素是行内元素
text-overflow 和 line-clamp 对 inline 元素(如 <span>、<a>)不生效。给一个 display: block 或 inline-block 即可。
坑二:flex 子元素溢出
这是最高频的坑:省略号在 flex 布局里突然失效。因为 flex 子项默认 min-width: auto,内容再长也不肯收缩。必须手动加:
css
flex-fix.css
.row {
display: flex;
}
.row .title {
flex: 1;
min-width: 0; /* ★ 关键:允许子项收缩到内容宽度以下 */
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
坑三:line-clamp 和别的 display 冲突
-webkit-box 是一种古老的盒模型,和 flex / grid 不能共存。如果元素本身已经是 flex 容器,把省略样式下移到内部的文本节点上。
让省略号里藏着完整内容
截断后用户看不到全文,体验上应补一个悬停提示,纯 HTML 就能做:
html
tooltip.html
<div class="title" title="完整标题内容写在这里">
这是一段很长很长可能会被截断的标题文字
</div>
进阶提示
需要更精致的气泡提示时,可用
data-tip 属性 + CSS ::after 伪元素自制 tooltip,无需 JS。速查表
| 场景 | 方案 | 核心属性 |
|---|---|---|
| 单行截断 | 三件套 | nowrap + hidden + ellipsis |
| 多行截断 | line-clamp | -webkit-box + line-clamp: N |
| flex 内失效 | 补一行 | min-width: 0 |
| inline 元素 | 改 display | inline-block / block |
总结
单行用三件套,多行用 line-clamp,flex 里记得 min-width: 0——这三句话覆盖了 95% 的文本溢出场景。剩下的 5%,多半是忘了给元素定宽度。
把截断交给 CSS,把完整内容交给 title 属性。用户要多少,都能拿到多少。