刚入行前端的时候,我一度觉得CSS文本溢出变成省略号这事没什么好学的,无非就是三行代码的事。直到后来在真实项目里接二连三地踩坑——表格列死活不显示省略号、flex布局里文字把布局撑爆、多行省略在安卓低版本上完全不生效——我才意识到,这个看似基础的知识点,恰恰是前端开发里最容易翻车的细节之一。尤其是现在前端面试题里,文本溢出省略号的出镜率一直很高,从手写单行省略到追问多行方案,再到深挖浏览器兼容和flex布局下的失效场景,层层递进。这篇文章就把我在实际项目中积累的写法、原理和避坑经验一次性讲清楚,包括单行、多行、兼容处理以及各种复杂布局下的正确姿势,帮你彻底搞定这块内容。
1. 单行省略号:最基础,也最容易出错
1.1 三件套写法的原理拆解
先放最标准的单行文本溢出省略号的写法,也是面试里最常见的答案:
css复制.ellipsis-single {
width: 200px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
很多新人能默写出来,但理解得并不深。这三行属性各有各的职责,缺一不可,而且顺序很重要。
先说 white-space: nowrap。默认情况下,文本在碰到容器边界时会自动换行,这本来是浏览器的善意。但我们要的是“溢出”而不是“换行”,所以第一步就是禁止换行,让文本老老实实待在一行里,哪怕撑破容器也在所不惜。这一步的意义在于,它把“文本正常流动”变成了“文本强制单行”,为后续的溢出处理提供了前提。如果不加这行,文本会换行,整个容器被撑高,后面的省略号设置也就无从谈起了。
然后是 overflow: hidden。这一行是真正干“裁切”这个活的。它把超出容器范围的内容直接隐藏掉,让内容乖乖地待在容器内部。注意这里隐藏的是内容,但文本还占着位置,只是看不到了。如果没有这一行,文本虽然不换行、超出的部分却依然会显示出来,视觉上直接冲破容器,非常难看。
最后是 text-overflow: ellipsis。这一行其实是整个方案的核心视觉呈现——它负责在内容被裁切的位置加上省略号。但这里有个关键点:text-overflow 只有在 overflow 的值不是 visible 时才会生效,这就是为什么必须把 overflow 设置为 hidden。它本身不做任何裁切动作,只是告诉浏览器:“如果用省略号来替代被裁掉的内容,应该长什么样。”
理解了这三者的关系之后,你就能明白为什么有些人写的时候会自动在 text-overflow: ellipsis 前面加上 overflow: hidden,但往往漏掉 white-space: nowrap,结果就是文本依然换行,省略号完全没出现。这个坑在实战里出现频率极高。
1.2 宽度条件与块级元素的隐性要求
单行省略号有一个容易被忽略的先决条件:元素必须有明确的宽度约束。
很多新手在 <span> 上直接写这三行,发现没效果,一脸懵。原因就是 <span> 是行内元素,它的宽度由内容撑开,浏览器根本不知道它的边界在哪里。文本永远在“自己的宽度”内部,自然没有溢出可言。解决方法有两种:一是给 <span> 加上 display: inline-block,把它变成可以设定宽度的行内块元素;二是直接用 display: block 让它撑满父容器,然后配合父容器的宽度来约束。
还有一种情况是元素没有显式设置宽度,但是它是块级元素,默认宽度是父容器的100%。这种情况下省略号通常是有效的,因为宽度约束来自父容器。但一旦父容器本身宽度不固定,比如在 flex 布局中,问题就来了。
举个例子,一个需求是左侧头像、右侧用户名和描述信息的卡片布局,右侧区域设置单行省略号。很多人在右侧的 div 上直接加三件套,发现不管用,文字照样把容器撑得老宽。这是因为 flex 布局下,子项的默认设置 min-width: auto 会让它有一个“最小内容尺寸”,也就是内容有多宽它就能撑多宽,本来设定的 width 或 flex 尺寸根本约束不住它。
解决方式也很经典:
css复制.card-right {
min-width: 0; /* 关键!允许 flex 子项收缩到小于内容宽度 */
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
这个 min-width: 0 在 flex 布局中出现的频率极高,不仅是省略号问题,很多自适应布局的 BUG 都和它有关。后面我会在实战坑的部分再详细展开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 多行省略号:-webkit-line-clamp 的正确打开方式
2.1 核心写法与实际应用场景
单行省略号满足不了所有需求。移动端的新闻列表、商品卡片描述、动态文案摘要,往往需要最多显示两行或三行,超出部分再显示省略号。如果只用单行方案,信息密度太低,用户体验很差。
多行省略号的经典写法如下:
css复制.ellipsis-multi {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
核心是 -webkit-line-clamp: 2,这一行指定了最多显示的行数。它的实现原理和常规文本布局完全不同:display: -webkit-box 把元素切换成老式 WebKit 弹性盒模型,-webkit-box-orient: vertical 让盒子的主轴线垂直排列,也就是内容从上往下排列,-webkit-line-clamp 再限制盒子的行数上限。超出部分配合 overflow: hidden 被裁切,并在末尾自动生成省略号。
这个方案的实际应用场景非常多。比如资讯类 App 首页的标题卡片,标题最长显示两行;购物 App 的商品简介,最多三行;社交平台的内容摘要,两行截断加省略号。此外,个人博客的文章列表也会用这个方案,保证不同长度的标题在列表页保持视觉上的一致——这一点其实很关键,因为如果标题显示行数不统一,整个列表的卡片高度会参差不齐,页面看起来非常乱。
这里也提一句,-webkit-line-clamp 生效时,文本末尾的省略号是浏览器自动生成的,不需要也不应该手动拼接字符。手动加省略号的方案(比如用 JS 截取字符串后加 "...")在动态数据下非常容易翻车——英文单词被切成一半、中英文混排时截取位置错误、标点符号处理不当,这些都是常见问题。浏览器原生方案能自动处理文字排版和断行逻辑,尽可能规避这些问题。
2.2 兼容性隐患与降级方案
很多人在使用多行省略号时踩的第一个坑,就是生产环境下代码被压缩工具处理之后,-webkit-box-orient: vertical 这一行莫名其妙消失了。
这其实是压缩工具(比如某些版本的 autoprefixer 或 cssnano)在清理代码时,误以为 box-orient 是过时的、可删除的旧属性而产生的误判。解决方法是给这一行加上注释:
css复制.ellipsis-multi {
display: -webkit-box;
/* autoprefixer: off */
-webkit-box-orient: vertical;
/* autoprefixer: on */
-webkit-line-clamp: 2;
overflow: hidden;
}
autoprefixer 是这个问题的重灾区,而且它对 -webkit-box-orient 的处理在不同版本里行为不一致。如果你用的构建工具链是 PostCSS + autoprefixer,建议直接在配置里把这个属性的清理关掉,或者通过注释控制。
但有个现实问题是:-webkit-line-clamp 在部分非 WebKit 内核浏览器中可能不生效。虽然现在主流浏览器对它的支持已经相当广泛,但如果你的产品需要兼容较老的浏览器或某些小众内核,就必须准备降级方案。
最稳妥的降级方案是:在不支持多行省略号的浏览器中,退而求其次使用单行省略号,保证业务可用性。实现方式有几种,这里推荐一个简洁的 CSS 方案:
css复制.ellipsis-multi {
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
@supports not ((display: -webkit-box) and (-webkit-line-clamp: 2)) {
.fallback-single {
white-space: nowrap;
text-overflow: ellipsis;
}
}
@supports 是 CSS 特性检测,它可以在浏览器支持特定属性组合时应用样式,不支持则应用另一套样式。这样既不浪费多行省略号的优雅效果,也能在老旧环境中保证最基本的可用性。
2.3 纯CSS实现多行省略的另一种思路
除了 -webkit-line-clamp,还有没有纯粹用 CSS 实现多行省略的办法?其实有一个“土办法”,用负边距和伪元素模拟,但效果并不完美。
方案大致是在容器底部放一个绝对定位的伪元素,用渐变背景把最后一行的文本“遮”一下,再在右上角显示一个省略号。但这只是视觉上的“假省略”,本质上只是遮住了溢出内容,文本依然可以通过选择框选中或复制出来。在某些场景下这个行为反而有用,比如需要保留完整文本的复制场景,但如果是纯展示需求,灵活性和维护成本都不如 text-overflow 和 line-clamp。
我的建议是,优先使用 -webkit-line-clamp,因为它是目前最优雅、最省事的方案。只有在你明确需要支持非常老旧的浏览器、且视觉降级不可接受时,才去考虑 JS 方案。
3. 实战中的那些坑:flex布局、padding与省略号打架
3.1 flex布局下的省略号失效问题
前面提过 flex 子项需要 min-width: 0 才能正常实现省略号。这里再深入聊聊为什么。
flex 布局的默认逻辑是,子项能多宽就多宽,因为 min-width 的默认值是 auto,而在 flex 上下文中,auto 的实际语义是“最小内容尺寸”,也就是内容有多宽,元素至少要保持多宽。这意味着,一段很长的文本在 flex 子项中,会把子项撑到文本那么宽,哪怕你给子项设置了 flex: 1 或 width: 200px。
这时候加上 min-width: 0,就是告诉浏览器:“你可以把子项压缩到比内容更窄的尺寸,不用管内容长什么样。”这样一来,子项的实际宽度就会被 flex 容器的剩余空间或指定宽度约束,文本才有可能超出容器、触发省略号。
来看一个我实际项目里经常遇到的结构:
html复制<div class="list-item">
<span class="avatar"></span>
<div class="info">
<p class="name">张三</p>
<p class="desc">这是很长很长的一段用户描述信息,用来测试文本溢出省略号在不同布局下的表现效果</p>
</div>
</div>
css复制.list-item {
display: flex;
align-items: center;
padding: 12px;
}
.avatar {
width: 40px;
height: 40px;
border-radius: 50%;
background: #ddd;
flex-shrink: 0;
}
.info {
flex: 1;
margin-left: 10px;
}
.desc {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
没有 min-width: 0 的情况下,这段代码的 desc 文本会把整个 .info 撑开,进而把 .list-item 撑出屏幕。加上之后,.info 会老老实实受限于 flex 容器剩余宽度,.desc 的省略号立刻生效。这个坑我在很多培训社群和面试题里都看到过,属于高频考点加高频坑点。
还要注意一处:.avatar 上我加了 flex-shrink: 0,防止头像被压缩变形。实际项目中,图标、标签这类固定尺寸的元素都建议加上这个属性,避免 flex 布局在宽度不够时把非文本元素压扁。
3.2 padding引发的高度与宽度异常
单行省略号的另一个常见问题,是元素设置了 padding 之后,省略号出现的位置和预期不符,甚至直接换行。
原因还是老一套:默认 box-sizing 是 content-box,所以 width: 200px 加上 padding: 0 20px 之后,元素的真实渲染宽度变成了 240px。如果你的布局刚好在计算 flex 宽度或百分比宽度,这个多出来的 20px 甚至可能把容器撑爆。
解决方案很简单,全局统一使用 box-sizing: border-box。这也是为什么很多团队会在 CSS 重置文件里加上这一句:
css复制*,
*::before,
*::after {
box-sizing: border-box;
}
对于省略号场景,border-box 还有一个额外的好处:当你给一个元素同时设置 width 和 padding 时,内容区会自动收缩,文本可用宽度变小,省略号的出现时机反而更加可预期。如果不用,你会发现同样的代码,在不同容器宽度下省略号的表现千奇百怪。
另外还有一个细节:如果省略号元素本身有 padding-right,而且容器背景色或边框和页面背景色有差异,省略号可能会被 padding 区域“顶”到可视区域之外,导致你只看得到文本被裁切,却看不到省略号的三个点。这通常表现为“文本截断了但没省略号”。排查的时候先检查 padding 是不是过大,再检查容器宽度是否足够。
3.3 表格单元格里的省略号
表格是另一个省略号经常失效的高频场景。HTML 表格的布局算法比较特殊,默认的 table-layout: auto 会根据内容自动调整列宽,这意味着单元格宽度的计算是“内容优先”的——内容很长时,列会被撑宽,省略号自然无法触发。
要让表格中的单元格支持省略号,需要两步:
css复制.table {
table-layout: fixed; /* 第一步:固定表格布局,列宽由表头/第一行决定 */
width: 100%;
}
.table td {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
table-layout: fixed 的作用是让浏览器不再根据内容动态计算列宽,而是按照表头或第一行的宽度设置来分配各列宽度。这样单元格宽度变确定后,省略号才能正常工作。
这里有个小技巧:如果你设计了用 table-layout: fixed,但希望某一列(比如操作按钮列)不参与裁切,那一列的 td 不要加省略号三件套就行,它的宽度依然由表格布局分配。如果列特别多,也可以用 col 元素显式指定每一列的宽度,减小表格布局的不可控性。
4. 进阶场景与封装方案
4.1 用 SCSS 封装单行和多行省略号
在实际项目里,省略号用到的频率非常高,如果每个地方都手写一遍三件套,代码冗余不说,万一以后要调整方案,还得全局搜替换。更合理的做法是封装成 SCSS mixin,提高复用性。
单行省略号的 mixin 可以这样写:
scss复制@mixin ellipsis-single($width: 100%) {
width: $width;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
多行省略号更灵活一些,需要把行数作为参数传进去:
scss复制@mixin ellipsis-multi($line-clamp: 2) {
display: -webkit-box;
/* autoprefixer: off */
-webkit-box-orient: vertical;
/* autoprefixer: on */
-webkit-line-clamp: $line-clamp;
overflow: hidden;
}
使用的时候直接传参:
scss复制.card-title {
@include ellipsis-multi(2);
}
.nav-item {
@include ellipsis-single(120px);
}
封装之后,整个项目里所有省略号需求都可以通过简单的 mixin 引用来实现,代码风格统一,后期如果要换实现方案(比如兼容性调整),只需要改动 mixin 内部,不需要每个调用点都改一遍。这一点在团队协作时尤其重要,新同学看到 mixin 名字就知道用途,不用反复解释省略号的写法细节。
4.2 鼠标悬浮显示完整文本的方案选择
文本截断之后,用户想看完整内容怎么办?最常见的两个方案是 title 属性和自定义 Tooltip。
先说 title 属性。它的优点是实现成本极低,一行 HTML 属性就能搞定:
html复制<p class="ellipsis-single" title="这是完整的超长文本内容,鼠标悬停后可以查看全部">这是完整的超长文本内容,鼠标悬停后可以查看全部</p>
但它的缺点也很明显:出现延迟高、样式不可定制、移动端基本不生效。所以它更适合后台管理系统、内部工具这类不追求视觉细节的场景。
如果产品面向 C 端用户,体验要求高,建议自己做 Tooltip。方案不外乎几种:纯 CSS 用 hover 加绝对定位容器、用 Vue/React 生态的弹出层组件、或者用 Element 等组件库的 Tooltip 组件。这里不展开 Tooltip 的具体实现,只说一个结合省略号的关键点:Tooltip 的内容最好用 JS 从真实文本节点中读取,不要依赖 title 属性。因为 title 属性和 DOM 文本是两份数据,一旦后台文案更新而属性没跟着更新,就会出现“显示的标题和悬浮提示对不上”的尴尬情况。
另外一个性能相关的细节:如果一个列表页有几十上百条文本都设置了 title,浏览器在渲染时不会有明显问题,但如果大量使用第三方 Tooltip 组件(尤其是每次都实时计算位置的),滚动时可能出现卡顿。遇到这种情况,可以等鼠标移到对应条目上时再创建 Tooltip,不用一开始就全部初始化。
4.3 响应式布局中的省略号调整策略
响应式场景下,容器的宽度在不同断点下变化很大。同样是标题,在手机上是两行省略,到了桌面上可能就一行显示得下了。有人会写三套媒体查询来切换省略方式,但更优雅的做法是结合容器宽度动态决定。
方案一:用 CSS 变量配合断点切换。
css复制.card-title {
--max-lines: 2;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: var(--max-lines);
overflow: hidden;
}
@media (min-width: 768px) {
.card-title {
--max-lines: 1;
white-space: nowrap;
display: block;
text-overflow: ellipsis;
}
}
注意从多行切到单行时,display 要从 -webkit-box 换回 block,因为 -webkit-box 下的 white-space 处理逻辑和普通块元素不一样,直接套用单行省略号的写法可能不生效。
方案二:使用容器查询(Container Queries)。如果你的项目已经切到现代浏览器且不太需要考虑老版本,可以基于容器宽度而不是视口宽度来控制省略行数。这在卡片组件被复用到不同布局区域时特别有用——同样的组件,放在侧边栏里显示一行,放在主内容区显示三行,容器查询能自动适配,不需要外部知道它当前在哪个容器里。
css复制.card-title {
container-type: inline-size;
overflow: hidden;
}
@container (max-width: 300px) {
.card-title {
white-space: nowrap;
text-overflow: ellipsis;
}
}
@container (min-width: 301px) {
.card-title {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
}
}
容器查询的思路是“组件自适应”,而不是“页面断点驱动组件”。对于组件库开发者或者追求高复用性的团队来说,这个是更值得投入的方向。
4.4 动态行数控制的 JS 补充方案
虽然 CSS 方案覆盖了绝大多数场景,但有一种情况 CSS 解决不了:行数需要根据文本长度动态计算。
例如搜索结果页,短标题显示两行、长标题显示三行,而且要保证所有卡片高度一致。或者某个活动页,只允许标题撑满一行,如果太长,自动换行显示两行,同时缩小字号——这种“动态字号+动态行数”的组合,纯 CSS 很难优雅实现。
这时候可以借助 JS 辅助。思路是:渲染后测量元素的实际高度和滚动高度,判断是否溢出,溢出则加类名启用省略样式,没有溢出则保持完整显示。
javascript复制const title = document.querySelector('.card-title');
if (title.scrollHeight > title.clientHeight) {
title.classList.add('truncated');
}
css复制.card-title.truncated {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
这个方案的优点是灵活,但缺点是依赖 JS 在渲染后执行,可能会有闪烁(FOUC)。处理方法是在内容挂载时同步调用判断逻辑,或者先给元素加一个默认的 overflow: hidden 保证布局稳定,JS 判断完再加 line-clamp。
对于动态行数需求,还有一个思路是结合容器高度去计算。如果卡片高度固定,而 line-clamp 的行数是由行高决定的,你可以先测出单行高度,然后用容器高度除以单行高度,得到最多能容纳的行数,再设置 line-clamp。这套逻辑在实际项目里并不少见,但要注意 line-height 必须是固定值(比如 1.5 的数字单位或者带 px 的固定值),否则计算会出错。
5. 常见问题与排查技巧实录
5.1 高频问题速查表
这里把我在实际开发和答疑过程中遇到最多的问题整理成一张表,方便你直接查阅。
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 单行省略号不生效,文本直接溢出 | 缺少 white-space: nowrap |
补上 white-space: nowrap,确认三件套齐全 |
| 单行省略号不生效,文本被裁切但无省略号 | overflow 为 visible 或 text-overflow 拼写错误 |
确认 overflow: hidden,检查属性名 |
| flex 子项文本撑破容器 | 缺少 min-width: 0 |
flex 子项加 min-width: 0 |
| 多行省略号不生效,只显示一行且无省略号 | display: -webkit-box 缺失或 -webkit-box-orient 被压缩工具清理 |
补全属性,并按需添加 autoprefixer 注释 |
| 多行省略号在某些浏览器不生效 | 浏览器内核不支持 -webkit-line-clamp |
使用 @supports 提供降级方案 |
| 表格单元格文本溢出但不省略 | 表格默认 table-layout: auto,列宽按内容分配 |
设置 table-layout: fixed |
| 省略号被 padding 区域遮挡,看不见三个点 | padding 过大或 box-sizing 未正确设置 | 检查 box-sizing,统一使用 border-box |
| 文本末尾出现“......”或“. . .” | 数据本身带了省略号字符,叠加 CSS 省略号 | 清理数据文案,或要求后端处理 |
| 多行省略号在部分安卓 WebView 中失效 | 低版本 WebView 内核不支持 | 降级为单行省略号,或用 JS 方案 |
这张表里的问题,几乎每个我都在真实项目中遇到过。尤其是 flex 子项和表格这两类,属于最容易踩但又最难一眼看穿的坑,一旦理解背后的布局机制,下次再遇到就能秒定位。
5.2 实战排查思路:三步定位省略号失效
如果遇到省略号不生效,别急着往上堆属性,按下面的步骤来排查,能省很多时间。
第一步,检查布局类型。先看这个元素是块级、行内还是 flex 子项,以及它的父容器是什么布局。如果是 flex 子项,先加 min-width: 0 试试;如果是表格单元格,检查 table-layout 是不是 fixed;如果是行内元素,确认是否设置了 display: inline-block 或 block。
第二步,检查宽度约束。用开发者工具看元素的盒模型,确认它的宽度是不是确定的。如果宽度是 auto 且父容器宽度也不确定,那就先解决宽度问题。宽度不确定,省略号基本没戏。
第三步,逐条核对三件套。white-space: nowrap 是否设置、overflow: hidden 是否被其他样式覆盖、text-overflow: ellipsis 是否是最后一个生效的属性。这里特别提醒:overflow: hidden 可能被类名冲突或选择器优先级覆盖掉,用浏览器开发者工具检查计算后的样式是最高效的方式。
5.3 两个容易忽略的隐藏问题
第一个是 word-break 和 word-wrap 对省略号的影响。在中文文本中,默认断行规则通常没有大问题,但如果文本里混有长英文单词或 URL,white-space: nowrap 下它们会被整体溢出,而 word-break: break-all 可能会在字母中间断行,导致省略号的位置看起来比较奇怪。解决办法是给文本容器加上 overflow-wrap: break-word 或 word-break: break-word(不同浏览器支持程度不同),让浏览器在单词过长时先考虑断行再考虑溢出。这样省略号出现时,文本不会被一个超长的无空格单词推得乱糟糟。
第二个是 direction 属性对省略号的影响。当网页涉及阿拉伯语、希伯来语等从右向左排版的语言时,text-overflow: ellipsis 的省略号默认出现在左侧,而不是右侧。如果你的产品有国际化需求,这一点需要提前考虑。CSS 的 text-overflow 对 RTL 文本的省略号位置遵循 direction 属性,所以实现多语言支持时,不能假设省略号永远在右边。
5.4 经验之谈:善用浏览器工具验证
在写完一段省略号样式后,建议养成一个习惯:在浏览器里手动改一下容器的宽度,看看不同宽度下省略号的表现是否符合预期。
我一般在 Chrome DevTools 的 Elements 面板里选中对应元素,在 Styles 面板里临时修改 width 值,把它从 150px 拉到 500px,观察文本从“正常显示”到“溢出省略”的过渡是否平滑。如果某个宽度下省略号突然失效,或者文本被截断的位置不对,说明样式里还有没考虑到的边界情况。
同时也可以配合 DevTools 的 Rendering 面板打开 “Show paint flashing” 来观察元素的渲染区域,尤其是在排查 padding 遮挡省略号的问题时非常直观。当你看到省略号实际渲染出来但被 padding 白色区域盖住时,问题起因基本就浮出水面了。不要小看这个检查步骤,很多时候项目里“偶尔出现”的样式异常,就是这些边界情况造成的。
6. 结尾
省略号这个知识点,单独看很小,但它横跨了 CSS 基础语法、盒模型、flex 布局、表格布局、浏览器兼容性和工程化封装多个层面。我见过不少前端新人在面试时能脱口而出三行代码,却解释不清楚为什么 flex 子项里省略号会失效;也见过有几年经验的人,处理多行省略时还在用 JS 截字符串。想把这些东西掌握扎实,最好的方式就是在真实页面里多改、多调试、多对比各种布局下的表现差异。只有亲手踩过坑,理解每个属性背后的布局机制,你才能在各种复杂的业务场景里快速写出正确的方案。
我自己最常用的一套组合是:全局统一 box-sizing: border-box,单行省略用封装好的 mixin,多行省略用带 autoprefixer 注释的 -webkit-line-clamp,碰到 flex 必定检查 min-width。这套组合在各类中后台系统、移动端 H5、可视化大屏项目里都稳定运行了很久。最后再留一个小建议:拿到设计稿时,如果看到“超出部分显示省略号”的需求,先问清楚最多显示几行、有没有悬浮查看完整内容的需求、需不需要兼容老浏览器。这三个问题决定了你用哪种方案,也决定了你后续是否要返工。实用至上,这就是文本溢出省略号的全部学问。
