text-overflow: ellipsis必须配合white-space: nowrap、overflow: hidden和明确width/max-width三者才生效;多行截断需用-webkit-line-clamp且仅限WebKit内核,Firefox需JS fallback。
只写 text-overflow: ellipsis 是没用的,它只对单行生效,且依赖另外两个前提条件。常见错误是漏掉 white-space: nowrap 或忘了设 overflow: hidden。
标准组合如下:
white-space: nowrap:强制不换行,让文字横向延伸overflow: hidden:隐藏超出容器的部分text-overflow: ellipsis:在被隐藏的末尾显示省略号三者缺一不可。如果父容器是 flex 且子项未设 min-width: 0,即使写了这三条,也可能因 flex 项目的默认最小尺寸导致截断失效。
-webkit-line-clamp
纯 CSS 实现两行或三行截断,目前最可靠的是 WebKit 系列方案,但有硬性约束:
立即学习“前端免费学习笔记(深入)”;
display: -webkit-box、-webkit-box-orient: vertical、-webkit-line-clamp: 2(数字按需改)width 或 max-width),否则在 flex 容器中可能不触发height 或 max-height,尤其在 iOS 某些版本中,否则截断可能不生效text-overflow: ellipsis 在这里只是“配合项”,真正起作用的是 -webkit-line-clamp
Firefox 完全不支持该方案,也没有对应的标准属性,强行使用只会让文字溢出或撑高容器。
当需要在 Firefox 或旧版 Edge 中也显示省略号时,CSS 方案直接失效,只能上 JS。关键不是简单截字符串,而是判断是否真实溢出:
element.scrollHeight > element.clientHeight 判断是否内容超出了可视区域.)、问号等,优先截到最近的标点后,提升可读性例如用 JSDOM 解析后再遍历文本节点裁剪,或用临时 div + innerHTML 自动修复再校验长度,都是为保标签闭合。
直接对带标签的 HTML 字符串做 str.substring(0, 160) 是危险的——可能把 <div> 截成 <code><di>,导致后续渲染错乱或 XSS 风险。<p>安全做法是借浏览器解析能力:</p><ul><li>创建临时 <code>div,把前 N 字符赋给 innerHTML
div.lastChild 再重取最终返回 div.innerHTML,确保所有标签成对、结构合法
这个细节容易被忽略:你以为截了 160 字符,实际输出可能是 165 字符且多了一个闭合标签——不验证就上线,会在某些 CMS 或 SSR 场景中引发 DOM mismatch。