约 6 分钟读完 · 更新于 2026-10-21 · 文中每条都能在下面的配套工具里动手验证
单行截断是固定搭配,少任何一个属性都会失效。口诀:不换行、藏溢出、显省略。另外元素必须有可计算的宽度约束(块级或定宽),否则文本会把容器撑开,永远轮不到截断。
.ellipsis {
white-space: nowrap; /* 禁止换行 */
overflow: hidden; /* 裁掉溢出内容 */
text-overflow: ellipsis; /* 裁切处显示省略号 */
max-width: 100%; /* 约束宽度,避免撑开父容器 */
}多行截断目前事实标准仍是 -webkit-line-clamp。名字带 -webkit 但 Chrome、Firefox、Safari、Edge 全部支持,生产环境可放心使用。注意四个属性是一个整体,且必须配合标准 line-clamp 属性写在前面,未来标准落地时无需改动。
.clamp-2 {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2; /* 保留的行数 */
line-clamp: 2; /* 标准属性,向后兼容占位 */
overflow: hidden; /* 同样不能少 */
}「写了 ellipsis 却不显示」几乎都能归到下表的一行里:
| 症状 | 根本原因 | 一行修复 |
|---|---|---|
| 文本直接撑开容器,无省略号 | 元素没有宽度约束,inline 或宽度随内容 | 改为块级并加 max-width / width |
| 表格 td 里省略号失效 | table 布局按内容分配宽度 | table 加 table-layout: fixed,td 加 max-width 或定宽 |
| Flex 子项里失效 | 子项 min-width 默认 auto,拒绝收缩 | 子项加 min-width: 0 |
| Grid 子项里失效 | 同上,grid 轨道被子项撑开 | 子项加 min-width: 0 或 overflow: hidden |
| 省略号出现在中间或错位 | 父级有 letter-spacing 或写作方向影响 | 检查 direction / writing-mode,保持默认 ltr |
| 完全不显示任何文字 | overflow: hidden 后高度为 0 或行高塌陷 | 给元素显式设置 height 或 line-height |
表格默认布局算法下,td 宽度由内容决定,文本永远「装得下」,省略号自然不触发。把表格切成固定布局后,列宽由首行或指定宽度决定,td 内的截断才有意义。注意 td 上的 white-space: nowrap 要挂在内部元素或 td 本身均可。
table {
table-layout: fixed; /* 列宽不再随内容增长 */
width: 100%;
}
td.ellip {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}弹性布局的子项默认 min-width: auto,含义是「宽度不能小于内容宽度」。长文本因此拒绝收缩,把父容器或轨道撑开,截断条件永远不成立。给截断元素(或其父链上的子项)加 min-width: 0,允许它收缩到比内容窄,省略号立即出现。
.row { display: flex; gap: 12px; }
.title {
flex: 1;
min-width: 0; /* 关键:允许收缩 */
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.action { flex-shrink: 0; } /* 按钮不被压缩 */省略号本质是三个条件同时满足后的结果,按顺序验证比乱改属性快得多:
功能对了,体验未必对。这两点决定省略号是否「好用」:
把三个场景的写法固化下来,遇到截断需求直接取用:
缺前提条件。单行截断需要 white-space: nowrap、overflow: hidden、text-overflow: ellipsis 三者同时存在,且元素有确定的宽度约束。任意一项缺失,浏览器都会回退为普通裁切或不裁切。
可以。-webkit-line-clamp 虽带前缀,但 Chrome、Firefox、Safari、Edge 均已稳定支持多年,配合 display: -webkit-box 与 overflow: hidden 使用即可。建议同时声明标准 line-clamp 属性以便未来平滑切换。
表格默认按内容分配列宽,td 永远能装下文字。给 table 加 table-layout: fixed 并设定 width,让列宽脱离内容,再在 td 上应用三件套。若列宽仍不对,可给关键 td 指定百分比或固定宽度。
给截断元素加 min-width: 0。Flex 子项默认 min-width: auto,宽度不会小于内容,导致溢出条件永远不成立。加上后允许收缩,ellipsis 立即生效。Grid 子项同理。