文字超出显示省略号:单行 white-space 写法、多行 line-clamp 与表格单元格失效原因

text-overflow: ellipsis 看起来一行代码的事,实际有三种场景、三种写法,还有一堆「写了却不生效」的坑。本文给出单行截断的三件套写法、多行截断的 -webkit-line-clamp 现代方案,重点拆解表格单元格与 Flex/Grid 子项中省略号失效的根本原因(min-width: auto 与 table 布局的宽度算法),每个失效场景都配一行修复。

约 6 分钟读完 · 更新于 2026-10-21 · 文中每条都能在下面的配套工具里动手验证

单行省略号:三件套缺一不可

单行截断是固定搭配,少任何一个属性都会失效。口诀:不换行、藏溢出、显省略。另外元素必须有可计算的宽度约束(块级或定宽),否则文本会把容器撑开,永远轮不到截断。

标准单行截断
.ellipsis {
  white-space: nowrap;      /* 禁止换行 */
  overflow: hidden;         /* 裁掉溢出内容 */
  text-overflow: ellipsis;  /* 裁切处显示省略号 */
  max-width: 100%;          /* 约束宽度,避免撑开父容器 */
}

多行省略号:-webkit-line-clamp 仍是标准做法

多行截断目前事实标准仍是 -webkit-line-clamp。名字带 -webkit 但 Chrome、Firefox、Safari、Edge 全部支持,生产环境可放心使用。注意四个属性是一个整体,且必须配合标准 line-clamp 属性写在前面,未来标准落地时无需改动。

截断为 2 行
.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

表格单元格:table-layout: fixed 是关键

表格默认布局算法下,td 宽度由内容决定,文本永远「装得下」,省略号自然不触发。把表格切成固定布局后,列宽由首行或指定宽度决定,td 内的截断才有意义。注意 td 上的 white-space: nowrap 要挂在内部元素或 td 本身均可。

表格内截断的完整写法
table {
  table-layout: fixed;   /* 列宽不再随内容增长 */
  width: 100%;
}
td.ellip {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

Flex / Grid 子项:一行 min-width: 0

弹性布局的子项默认 min-width: auto,含义是「宽度不能小于内容宽度」。长文本因此拒绝收缩,把父容器或轨道撑开,截断条件永远不成立。给截断元素(或其父链上的子项)加 min-width: 0,允许它收缩到比内容窄,省略号立即出现。

Flex 行内标题截断
.row { display: flex; gap: 12px; }
.title {
  flex: 1;
  min-width: 0;             /* 关键:允许收缩 */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.action { flex-shrink: 0; } /* 按钮不被压缩 */

排查步骤:从条件到属性

省略号本质是三个条件同时满足后的结果,按顺序验证比乱改属性快得多:

  1. 确认宽度受限:在 DevTools 里看元素 computed width 是否为固定值;宽度随内容变化则先加宽度约束。
  2. 确认文本真的溢出:把 overflow: hidden 临时去掉,看文字是否真的超出边界;没溢出说明容器太宽或文本太短。
  3. 确认三件套齐全:white-space: nowrap(多行用 -webkit-box)、overflow: hidden、text-overflow: ellipsis 缺一不可。
  4. 确认不是在 table / flex / grid 特殊上下文里:是则补 table-layout: fixed 或 min-width: 0。

两个容易忽略的细节

功能对了,体验未必对。这两点决定省略号是否「好用」:

  • 可访问性:截断会静默丢掉文本,重要内容应提供 title 属性或点击展开,屏幕阅读器读不到被裁掉的部分。
  • 响应式:多行 clamp 的行数可在窄屏下用容器查询动态调整(如小屏 clamp 3 行、大屏 clamp 2 行),container query 兼容性已覆盖主流浏览器。

场景到写法的最终映射

把三个场景的写法固化下来,遇到截断需求直接取用:

  1. 单行:white-space: nowrap + overflow: hidden + text-overflow: ellipsis + 宽度约束。
  2. 多行:display: -webkit-box + -webkit-box-orient: vertical + -webkit-line-clamp: N + overflow: hidden。
  3. 特殊容器:表格先上 table-layout: fixed;Flex/Grid 子项先上 min-width: 0,再套用单行或多行写法。

常见问题

text-overflow: ellipsis 写了为什么不出省略号?

缺前提条件。单行截断需要 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 指定百分比或固定宽度。

Flex 布局里省略号失效怎么一行修复?

给截断元素加 min-width: 0。Flex 子项默认 min-width: auto,宽度不会小于内容,导致溢出条件永远不成立。加上后允许收缩,ellipsis 立即生效。Grid 子项同理。

📂

松开以自动格式化

支持 .json / .sql / .csv / .html / .css / .xml / .yaml 文件