结论:应使用 column-count 或 column-width 实现多列文字排版,二者不可强设冲突;column-width 优先级更高,column-count 是目标值而非强制值;需配合 column-gap、媒体查询及 column-span: all 等确保可读性与兼容性,避免在含交互元素区域滥用。
直接说结论:用 column-count 或 column-width,别写 HTML 标签切列,也别硬套 display: grid 或 float —— 那不是多列文字排版,那是手动分块。
column-count 和 column-width 不能同时强设浏览器会优先满足 column-width(最小列宽),再尽可能接近 column-count(目标列数)。比如设了 column-width: 16rem 且容器只有 30rem 宽,那最多只能出 1 列,column-count: 3 就被无视了。
column-count,但要接受内容少时也撑出空白列column-width,配合 column-gap 和媒体查询动态调列数columns: 3 16rem 这种简写——可读性差,调试时难定位是宽度还是数量在起作用break-inside: avoid 为什么经常失效它只对块级元素生效,且部分旧 Safari(iOS 14 以下)需加前缀。更关键的是:如果父容器用了 column-span: all(比如标题横跨),那该标题内部的子元素就不再受 break-inside 约束。
h2, h3, img, blockquote 等div 包裹段落——每层都可能成为断点,不如直接给 p 加样式display: inline-block 或 transform,这些会让 break-inside 失效小屏下 column-count: 3 是最常见翻车点:列宽跌破 120px,字挤成一团,行高崩坏。这不是 bug,是没做响应式兜底。
立即学习“前端免费学习笔记(深入)”;
@media (max-width: 768px) { .content { column-count: 1; } }
column-fill: balance —— 兼容性极差,Chrome/Firefox 表现不一致,实际几乎不用will-change: contents 前要实测:仅当滚动卡顿明显时加,否则可能引发额外重绘::first-line 和 ::first-letter 只在第一列生效,正常吗完全正常,这是 CSS 多列规范明确规定的,不是渲染缺陷。伪元素只作用于整个容器的“视觉首行/首字”,而多列布局中,只有第一列的开头才算“首”。
text-indent 控制段落首行,比模拟首字下沉靠谱得多column-span: all 横跨,但注意它只对 display: block 元素有效,inline 元素得先转块真正容易被忽略的,是判断「这里到底适不适合用多列」:长文本正文可以,但含交互元素(按钮、输入框、下拉菜单)的区域,一旦套上 column-count,焦点顺序、键盘导航、屏幕阅读器行为都会异常——这时候就得退回到 grid 或 flex。