前端新人必看:CSS文本溢出变省略号的正确姿势(单行多行全搞定)
- 前端新人必看:CSS文本溢出变省略号的正确姿势(单行多行全搞定)
- 先给省略号起个“身份证”——它到底是个啥?
- 单行省略:三行代码封神,但少一行就翻车
- 多行省略:WebKit 私有属性救场,但别忘了 Firefox 还在喘
- 万一老古董 Firefox 也不认?Fallback 方案走起
- 实战场景 1:卡片标题
- 实战场景 2:商品描述(固定 2 行)
- 实战场景 3:评论摘要 + “展开全文”
- 五个“省略号不显示”的体检清单
- 中文英文混排,换行差异能把人逼疯
- Flex 里直接套省略号?小心被“撑开”
- 骚操作:CSS 自定义属性动态控制行数
- 响应式省略:监听 resize 也算一种“温柔”
- 真·大坑:table-cell 里搞省略号
- 伪元素里自己画 `content: "…"`?兄弟,那是假省略!
- 老年人模式:字一大,你的省略号就“消失术”
- 测试 checklist:上线前撸一遍,少加一次班
- 收个尾:省略号不是万能的,该折叠就折叠,该按钮就按钮
前端新人必看:CSS文本溢出变省略号的正确姿势(单行多行全搞定)
“哥,我明明 copy 了网上的三行代码,怎么省略号还是不出来?”
“别急,先把 width 写上,再把 white-space 写上,再把 overflow 写上……哎,你 float 咋还挂着呢?”
微信群里的这段对话,我平均每周要重复一次。今天干脆一次性把话撂这儿:省略号这玩意儿,看起来比 Hello World 还简单,真踩坑的时候能让你把键盘啃出牙印。下面这段超长语音转文字,就当我请全群喝奶茶,一口气把单行、多行、兼容性、暗坑、骚操作、以及“老年人模式”全部讲透。代码管饱,注释管够,土味吐槽随时出没,准备好就往下划。
先给省略号起个“身份证”——它到底是个啥?
很多人以为“…”是字符,NO!它本质上是渲染阶段的视觉效果。
浏览器在渲染到边界时发现“哎,放不下了”,才掏出一个小点阵画三个点。
所以——“字符串里有没有 …”跟“页面有没有 …”八竿子打不着。
别再用 JSsubstr(0, 20) + '...'了,人家 CSS 原生就带手术刀,干嘛拿菜刀?
单行省略:三行代码封神,但少一行就翻车
先上“圣经”:
.ellipsis-1{width:300px;/* 1. 宽度必须!auto 会无限撑开,省略号永远不出来 */white-space:nowrap;/* 2. 不换行,让它在一行里憋死 */overflow:hidden;/* 3. 把憋出来的尾巴切掉 */text-overflow:ellipsis;/* 4. 切掉的地方补三个点 */}就这四行,99% 的人抄作业只抄最后两行,结果省略号死活不现身。
width 是爹,white-space 是妈,overflow 是接生婆,text-overflow 是取名登记处。
少一个,娃就上不了户口。
再来个真实惨案:
/* 同学 A:我写了啊! */.ellipsis-1{text-overflow:ellipsis;}/* 浏览器:你宽度呢?你 nowrap 呢?你 overflow 呢? */多行省略:WebKit 私有属性救场,但别忘了 Firefox 还在喘
需求升级——“三行再省略”。
早年唯一靠谱方案是-webkit-line-clamp,后面那串英文看着唬人,其实就三句话:
.ellipsis-3{display:-webkit-box;/* old flexbox syntax,别和 new flex 搞混 */-webkit-box-orient:vertical;-webkit-line-clamp:3;/* 第 4 行开始省略 */overflow:hidden;}真香警告:
- 只在Blink + WebKit管用(Chrome、Edge、Safari)。
- Firefox直到 2022 年底才认
line-clamp,不带前缀,写法如下:
@supports(line-clamp:3)or(-webkit-line-clamp:3){.ellipsis-3{line-clamp:3;/* 标准语法,未来通用 */-webkit-line-clamp:3;/* 照顾老家伙 */}}- 如果还要兼容IE11?——兄弟,直接上 JS 兜底吧,别折磨自己。
万一老古董 Firefox 也不认?Fallback 方案走起
思路:用 max-height 硬裁剪 + 相对定位伪元素遮尾巴。
.ellipsis-3-fallback{position:relative;line-height:1.5;max-height:calc(1.5em * 3);/* 3 行高度 */overflow:hidden;}.ellipsis-3-fallback::after{content:'...';position:absolute;right:0;bottom:0;padding-left:20px;background:linear-gradient(to right,transparent,#fff 35%);}解释:
- max-height 把容器卡死;
- 伪元素绝对定位到右下角,用白色渐变遮掉半截字,制造“好像被省略”的假象。
缺点:背景如果是花纹、图片,就穿帮;移动端换行字号一变,高度要重新算。
所以——能 line-clamp 就 line-clamp,不能再用这招补锅。
实战场景 1:卡片标题
设计稿给的卡片宽度是弹性-flex,标题字数从 12 到 50 不等,还要适配 320px 老爷机。
直接上“单行省略 + 最小宽度 0”组合拳:
.card-title{flex:1;/* 占据剩余空间 */min-width:0;/* 关键!让 flex-item 可以被压缩 */white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}重点:min-width: 0不写,Flex 子项默认min-width: auto,会被内容撑开,省略号瞬间罢工。
这条暗坑我踩了 3 年,谁用谁知道。
实战场景 2:商品描述(固定 2 行)
需求:两行半最舒服,第三行开始省略。
直接-webkit-line-clamp: 2,再给 Firefox 兜底:
.desc{line-height:1.6;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;}别忘了给容器写死一个max-height,防止 clamp 失效时内容炸开:
@supportsnot((line-clamp:2)or(-webkit-line-clamp:2)){.desc{max-height:calc(1.6em * 2);/* 再加伪元素兜底亦可 */}}实战场景 3:评论摘要 + “展开全文”
这种场景不建议纯 CSS,因为需要动态切换“收起 / 展开”,还得算实际行数。
思路:CSS 负责样式,JS 负责行数计算 + 按钮显隐。
.review{line-height:1.5;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;transition:all .3s;}.review--3{-webkit-line-clamp:3;}.review--auto{-webkit-line-clamp:unset;}// 伪代码,别直接粘functionclampIfNeeded(el){consttotalH=el.scrollHeight;constlineH=parseFloat(getComputedStyle(el).lineHeight);constlines=Math.round(totalH/lineH);if(lines>3){el.classList.add('review--3');button.style.display='inline-block';}}button.addEventListener('click',()=>{el.classList.toggle('review--3');el.classList.toggle('review--auto');});五个“省略号不显示”的体检清单
- 父容器没宽度
width / max-width / flex 子项没写min-width:0,内容一路撑到南沙群岛。 - display: inline
inline 元素无法设置 width,先改成inline-block或block。 - white-space: normal
默认换行,内容自动折行,永远达不到“溢出”条件。 - 子元素飘了 float
float 会脱离文档流,父元素高度塌陷,overflow 裁剪了个寂寞。 - transform: translateZ(0)
某些老 WebKit 内核,GPU 层导致合成错位,省略号偶尔闪现,重启手机就好——别问,问就是玄学。
中文英文混排,换行差异能把人逼疯
中文:一柱擎天,没有空格,浏览器想在哪断就在哪断。
英文:单词中间断?除非加hyphens: auto或者word-break: break-all。
于是出现一种奇观——英文段落把容器撑开,省略号被挤到下一行,看上去就像“消失术”。
解法:
.mixed{word-break:break-word;/* 优先在单词边界断,实在不行再劈腿 */overflow-wrap:anywhere;/* 新语法,未来主流 */}Flex 里直接套省略号?小心被“撑开”
Flex 容器默认align-items: stretch,子项高度互相攀比。
如果左侧头像 80px,右侧文字想省略,结果:
.text{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}还是不生效?
检查左侧头像是不是写了min-width: 80px;flex 子项的最小尺寸会把剩余空间吃得干干净净。
口诀:
“flex 想省略,先给兄弟写min-width:0,再给自己写min-width:0。”
骚操作:CSS 自定义属性动态控制行数
:root{--lines:3;}.dynamic{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:var(--lines);line-clamp:var(--lines);}// 用户拖动滑块改行数slider.addEventListener('input',e=>{document.documentElement.style.setProperty('--lines',e.target.value);});一行 JS 不用改 DOM,CSS 变量直接响应,逼格瞬间拉满。
响应式省略:监听 resize 也算一种“温柔”
有时候设计稿 375px 只要 2 行,414px 给 3 行,768px 直接不省略。
配合ResizeObserver动态改类名即可:
constro=newResizeObserver(entries=>{for(constentryofentries){constwidth=entry.contentRect.width;constel=entry.target;el.classList.toggle('ellipsis--2',width<400);el.classList.toggle('ellipsis--3',width>=400&&width<768);el.classList.toggle('ellipsis--off',width>=768);}});ro.observe(document.querySelector('.review'));真·大坑:table-cell 里搞省略号
有人把display: table-cell当 flex 用,结果text-overflow: ellipsis死活不出来。
原因:table-cell 的宽度默认由内容撑开,除非给 table 加table-layout: fixed并且写死宽度。
解决方案:
.table{table-layout:fixed;width:100%;}td.ellipsis{width:30%;/* 必须! */white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}伪元素里自己画content: "…"?兄弟,那是假省略!
用伪元素硬堆三个点,看上去像那么回事,实际:文字到底被截在哪,完全对不上。
更别说背景透明、夜间模式、字体替换,分分钟穿帮。
结论:除非做 fallback,否则别拿伪元素当主方案。
老年人模式:字一大,你的省略号就“消失术”
系统字体放大 1.5 倍后,原本 2 行的空间变成 2.3 行,-webkit-line-clamp: 2直接裁到半个字,用户只见半撇捺,省略号无影无踪。
对策:
- 用相对单位
em计算max-height; - 在 DevTools 里切Large Text模式自测;
- 实在不行,按钮给个“展开全文”,别让老家伙们眯着眼猜。
测试 checklist:上线前撸一遍,少加一次班
- 375px、414px、768px、1440px 各看一遍;
- Chrome 手机模拟器切“大字体”+“最小字号 16px”;
- Firefox 开
about:config把layout.css.line-clamp.enabled关掉测 fallback; - 找产品小姐姐用 12 级超大字体真机复测;
- 让后端灌 500 字超长希腊文,看会不会把卡片撑到月球。
收个尾:省略号不是万能的,该折叠就折叠,该按钮就按钮
CSS 再骚,也有天花板。
遇到富文本带图片、带表情的评论区,或者敏感词中间截断这种需求,就别死磕纯样式了,交给 JS 计算行高 + 字符截断,甚至后端直接给摘要字段,才是负责任的做法。
毕竟——“用户体验” 这口锅,CSS 不背,JS 不背,最后还得你来背。
好了,奶茶喝完,代码管饱。
下回再有人嚷嚷“省略号不出来”,直接把这篇甩过去,让他自己对照 checklist 打钩,少来群里嚎。
祝你每次上线都稳如老狗,周末不再被产品 @ 回滚。
欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
推荐:DTcode7的博客首页。
一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟!
| 专栏系列(点击解锁) | 学习路线(点击解锁) | 知识定位 |
|---|---|---|
| 《微信小程序相关博客》 | 持续更新中~ | 结合微信官方原生框架、uniapp等小程序框架,记录请求、封装、tabbar、UI组件的学习记录和使用技巧等 |
| 《AIGC相关博客》 | 持续更新中~ | AIGC、AI生产力工具的介绍,例如stable diffusion这种的AI绘画工具安装、使用、技巧等总结 |
| 《HTML网站开发相关》 | 《前端基础入门三大核心之html相关博客》 | 前端基础入门三大核心之html板块的内容,入坑前端或者辅助学习的必看知识 |
| 《前端基础入门三大核心之JS相关博客》 | 前端JS是JavaScript语言在网页开发中的应用,负责实现交互效果和动态内容。它与HTML和CSS并称前端三剑客,共同构建用户界面。 通过操作DOM元素、响应事件、发起网络请求等,JS使页面能够响应用户行为,实现数据动态展示和页面流畅跳转,是现代Web开发的核心 | |
| 《前端基础入门三大核心之CSS相关博客》 | 介绍前端开发中遇到的CSS疑问和各种奇妙的CSS语法,同时收集精美的CSS效果代码,用来丰富你的web网页 | |
| 《canvas绘图相关博客》 | Canvas是HTML5中用于绘制图形的元素,通过JavaScript及其提供的绘图API,开发者可以在网页上绘制出各种复杂的图形、动画和图像效果。Canvas提供了高度的灵活性和控制力,使得前端绘图技术更加丰富和多样化 | |
| 《Vue实战相关博客》 | 持续更新中~ | 详细总结了常用UI库elementUI的使用技巧以及Vue的学习之旅 |
| 《python相关博客》 | 持续更新中~ | Python,简洁易学的编程语言,强大到足以应对各种应用场景,是编程新手的理想选择,也是专业人士的得力工具 |
| 《sql数据库相关博客》 | 持续更新中~ | SQL数据库:高效管理数据的利器,学会SQL,轻松驾驭结构化数据,解锁数据分析与挖掘的无限可能 |
| 《算法系列相关博客》 | 持续更新中~ | 算法与数据结构学习总结,通过JS来编写处理复杂有趣的算法问题,提升你的技术思维 |
| 《IT信息技术相关博客》 | 持续更新中~ | 作为信息化人员所需要掌握的底层技术,涉及软件开发、网络建设、系统维护等领域的知识 |
| 《信息化人员基础技能知识相关博客》 | 无论你是开发、产品、实施、经理,只要是从事信息化相关行业的人员,都应该掌握这些信息化的基础知识,可以不精通但是一定要了解,避免日常工作中贻笑大方 | |
| 《信息化技能面试宝典相关博客》 | 涉及信息化相关工作基础知识和面试技巧,提升自我能力与面试通过率,扩展知识面 | |
| 《前端开发习惯与小技巧相关博客》 | 持续更新中~ | 罗列常用的开发工具使用技巧,如 Vscode快捷键操作、Git、CMD、游览器控制台等 |
| 《photoshop相关博客》 | 持续更新中~ | 基础的PS学习记录,含括PPI与DPI、物理像素dp、逻辑像素dip、矢量图和位图以及帧动画等的学习总结 |
| 日常开发&办公&生产【实用工具】分享相关博客》 | 持续更新中~ | 分享介绍各种开发中、工作中、个人生产以及学习上的工具,丰富阅历,给大家提供处理事情的更多角度,学习了解更多的便利工具,如Fiddler抓包、办公快捷键、虚拟机VMware等工具 |
吾辈才疏学浅,摹写之作,恐有瑕疵。望诸君海涵赐教。望轻喷,嘤嘤嘤
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。愿斯文对汝有所裨益,纵其简陋未及渊博,亦足以略尽绵薄之力。倘若尚存阙漏,敬请不吝斧正,俾便精进!