长文本折断(多行省略)与强制换行是两类独立问题,必须分离处理:多行省略依赖 -webkit-line-clamp 三件套(display: -webkit-box、-webkit-box-orient: vertical、明确 width/max-width)并用 @supports 检测;强制换行首选 overflow-wrap: break-word,纯数字串才用 word-break: break-all;SCSS 封装时须严格区分逻辑、单位(推荐 em)及降级路径,否则在 Safari/Firefox/旧 WebView 必然失效。
直接给结论:长文本折断(多行省略)和强制换行是两类问题,不能混用同一套 CSS 逻辑;SCSS 封装时必须拆开处理 -webkit-line-clamp、overflow-wrap 和降级路径,否则在 Safari、Firefox 或旧 Android WebView 上必然失效。
很多人把 -webkit-line-clamp 当成独立属性直接写,结果在 Safari 不生效、Firefox 完全没反应——根本原因不是漏了 overflow: hidden,而是它依赖三件套同时存在:
display: -webkit-box 必须显式声明,display: flex 或 block 会直接让机制失效-webkit-box-orient: vertical 缺一不可,漏掉会导致单行或文字错位width 或 max-width,否则换行点算不准@supports (-webkit-line-clamp: 1) 检测比 UA 判断可靠得多,覆盖 Chrome/Safari/新版 Edge@supports (line-clamp: 2) or (-webkit-line-clamp: 2),且 line-clamp 必须带前缀才生效word-break: break-all 是暴力方案,会在任意字符处打断(比如把 100px 拆成 100 和 px),而 overflow-wrap: break-word(推荐写法,word-wrap 是别名)只在必要时才断单词,语义更干净:
overflow-wrap: break-word
word-break: break-all
white-space: pre-wrap 适合保留源码换行+自动折行,但会保留所有空格和制表符word-break: break-all 和 overflow-wrap: break-word 效果接近,但前者仍可能破坏语义分词降级方案靠 max-height + line-height 控制行数,这里最容易出错:
立即学习“前端免费学习笔记(深入)”;
line-height 必须是数值(如 1.5)或带 em 单位(如 1.5em),禁用 rem 或混用无单位数字max-height = line-height × 行数,例如 line-height: 1.5em 限 3 行 → max-height: 4.5em
max-height: none 必须写在 @supports 块内,否则 WebKit 会先按 max-height 截一次、再按 line-clamp 截一次,导致半行文字被切掉flex: 1 但外层没设 max-width),iOS Safari(尤其 12–14)下 -webkit-line-clamp 会因 rem 动态变化而计算失准,建议固定用 em 单位 + font-size: 1
用 ::after 在右下角叠加渐变遮罩模拟省略号,看似优雅,但实际限制极多:
position: relative,否则伪元素无法精确定位到底部右角vmin 或 clamp() 动态调整,伪元素尺寸很难同步最易被忽略的一点:所有截断方案都要求父容器宽度可控。很多问题不是 SCSS 写错了,而是外层布局没约束好宽度,导致 -webkit-line-clamp 在 iOS Safari 下反复计算失准。