前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库表格单元格 text-overflow 省略
CSS盒模型与排版

表格单元格里的长文本,为什么加了 text-overflow 还是不出省略号?

默认的自动表格布局会按内容撑宽列,文字不换行时单元格直接变宽,根本不会溢出,省略号自然出不来。给 table 加 table-layout: fixed 和明确宽度,让列宽不再由内容决定,再配上 overflow: hidden、white-space: nowrap 就行。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#盒模型与排版
先看核心答案读代码示例
理解线索

单元格出省略号的三个条件

  1. 宽度被锁住列宽不能跟着内容长,要靠 table-layout: fixed 或列宽设置
  2. 文字不换行white-space: nowrap 让文字只能往一行里挤
  3. 溢出被裁剪overflow: hidden 加 text-overflow: ellipsis 把多出的部分换成省略号

table-layout: fixed 下列宽取自第一行或 <col> 的宽度,后面行的内容再长也不会让列变宽,所以列宽要在表头上设好。

核心回答

先记住这个答案

普通 div 上写 overflow: hidden、white-space: nowrap、text-overflow: ellipsis 就能出省略号,因为 div 的宽度由父容器决定,文字超出就溢出。表格不一样,默认的自动表格布局会先量每个单元格内容的宽度,再按内容分配列宽。文字不换行时,最小宽度就是整行文字的长度,列会被直接撑宽,单元格根本没有溢出,省略号也就无从谈起。解决办法是让列宽不再跟着内容走:给 table 加 table-layout: fixed 和一个明确宽度,或者在单元格里包一层有固定宽度的块来做省略。

  • 省略号的前提是真的溢出,自动表格布局让单元格不溢出
  • 固定表格布局还需确定表格宽度
  • 单元格省略仍需单行和裁剪
  • 不想改布局,就在单元格里包一层 div 做省略

为什么同样的三行 CSS 在表格里失效

先看一个常见的失败写法,给 td 设了宽度和省略三件套,页面上还是一整行长文字把表格撑出了容器。

自动布局下 width 只是建议值HTML
<table style="width: 300px">
  <tr>
    <!-- 设了 width,但自动布局下它只是个最小建议 -->
    <td style="width: 100px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis">
      这是一段很长很长很长很长很长的商品名称
    </td>
    <td>价格</td>
  </tr>
</table>
<!-- 结果:第一列被撑到整段文字那么宽,表格超出 300px,没有省略号 -->

table-layout 的默认值是 auto。这种模式下浏览器要先读完整张表的内容,算出每一列的最小宽度和理想宽度,再决定列宽。单元格上写的 width 在这里更像下限:内容放不下时,列宽会继续往上长。nowrap 又让文字不能折行,于是最小宽度等于整段文字宽度,列被撑开,表格总宽也跟着超过设定的 300px。 对比普通块:块级元素的宽度由包含块往下传,内容再长也改变不了它,多出来的部分就是溢出,text-overflow 才有东西可处理。表格是反过来的,宽度是从内容往上算的,这就是两者的本质差别。

最常用的修法:table-layout: fixed

把表格切到固定布局,列宽就不看内容了。浏览器只看 table 的宽度、<col> 的宽度和第一行单元格的宽度,剩下的平均分,后面行的内容再长也不会让列变宽。

固定布局加省略三件套
table 上写 table-layout: fixed; width: 100%,表头的 th 上给每列设宽度,然后单元格统一加 overflow: hidden、white-space: nowrap、text-overflow: ellipsis。这时长文字超出列宽,就会正常显示省略号。 要注意 table-layout: fixed 必须配合 table 的明确宽度才生效,width 还是 auto 时浏览器会退回自动布局。另外列宽是从第一行读的,所以宽度要写在表头或 <col> 上,写在第十行的某个单元格上不起作用。 固定布局还有个附带好处:浏览器读到第一行就能确定列宽,不用等整张表加载完,大表格渲染会更快。代价是列宽不再自适应内容,短内容的列也会占着固定宽度。

不想改布局时的两种办法

有时候表格要保留自适应列宽,只希望某一列出省略号,这时可以用下面两种办法。

单元格里包一层块
在 td 里放一个 div,把宽度和省略三件套写在这个 div 上,比如 max-width: 200px。div 是普通块,宽度由自己的 max-width 限住,文字超出就溢出,省略号就能出来。表格量内容时,量到的是这个 div 的宽度,所以列也不会被撑开。这是组件库里最常见的做法。
max-width: 0 的技巧
另一个流传很广的写法是给 td 设 max-width: 0,再配合百分比 width。它让单元格对最小列宽的贡献变成 0,列宽改由剩余空间分配,在主流浏览器里能出省略号。不过 CSS 规范没有定义 min-width、max-width 作用在单元格上的效果,这个写法依赖的是浏览器的实现,项目里更推荐前两种。
回答前,多想一步

容易答错的地方

以为给 td 设 width 就够了
自动布局下单元格的 width 挡不住内容,列照样会被撑宽。要么切固定布局,要么在里面包一层块来限宽。
只加 table-layout: fixed 不给宽度
table 的宽度是 auto 时,固定布局不会生效,表现和原来一样。至少要给 table 一个 width,常见的是 100%。
漏掉 white-space: nowrap
不加 nowrap,文字会折成多行,不会在水平方向溢出,也就没有省略号。想要多行省略,要用 -webkit-line-clamp 那套写法,和单行省略是两回事。
试着用自己的话回答

面试官还会怎么问?

省略掉的完整内容怎么让用户看到?

最简单是给单元格加 title 属性,悬停时显示原生提示。组件库一般会判断 scrollWidth > clientWidth,只有真的被截断时才显示自定义的 Tooltip。

table-layout: fixed 下没设宽度的列怎么分?

浏览器先扣掉设了宽度的列,剩下的宽度平均分给没设宽度的列。所以一般只给固定内容的列设宽度,比如操作列、日期列,名称列留空让它吃掉剩余空间。

用 div 加 display: table-cell 模拟的表格也有这个问题吗?

有。display: table 和 display: table-cell 走的是同一套表格布局算法,同样需要 table-layout: fixed 加宽度,或者在单元格里包一层块。现在做这类布局更常用 Grid,列宽用 minmax(0, 1fr) 就能让长文字正常溢出。

从一道题,走向一组知识

把知识连起来

盒模型与排版

图片放进 div 里,底下为什么总多出几像素空白?

单元格里内容的上下对齐也靠 vertical-align,但它在 table-cell 上的含义和行内元素不一样。

盒模型与排版

上下两个 div 各设 20px 外边距,为什么间距只有 20px?

单元格上的 margin 不生效,外边距合并只发生在常规流的块之间,可以对照看表格布局和常规流的差别。

参考资料

  • text-overflow - MDN
  • table-layout - MDN

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 为什么同样的三行 CSS 在表格里失效
  3. 最常用的修法:table-layout: fixed
  4. 不想改布局时的两种办法
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑