用 @mixin 封装 column-count 和 column-gap 是解决多列布局重复代码、维护困难的最优解,需设默认参数、避免与 column-width 混用、响应式嵌套 @media、慎用 column-span、限制使用范围以防性能问题。

用 @mixin 封装 column-count 和 column-gap 组合
直接写多列布局时,column-count、column-gap、column-rule 这几个属性经常成组出现,而且不同区块的列数和间隙还常不一致。硬编码容易漏配、难维护。用 Sass @mixin 把它们打包成一个可复用单元是最直接的解法。
实操建议:
- 定义带默认参数的 mixin,比如
@mixin columns($count: 3, $gap: 1rem, $rule: none) - 在 mixin 内部统一处理浏览器前缀(现代项目可省略,但若需兼容旧版 Safari 或 Firefox,
-webkit-column-count等仍可能触发渲染差异) - 避免把
column-width和column-count混在同一 mixin 里——二者互斥,强行共存会导致列数失效 - 示例:
@mixin columns($count: 3, $gap: 1rem) { column-count: $count; column-gap: $gap; } .article-text { @include columns(2, 1.25rem); }
响应式分栏必须用 @media 嵌套而非重复 @include
很多人会为每个断点单独写一遍 @include columns(...),结果是 CSS 体积膨胀、逻辑分散。Sass 支持在 mixin 内部嵌套 @media,让响应式逻辑收口到一处。
实操建议:
- 把断点变量(如
$sm、$md)提前定义好,再在 mixin 中引用 - 优先使用
min-width断点,避免小屏设备意外触发多列(文字过窄时分栏反而降低可读性) - 注意:Sass 编译后,嵌套的媒体查询会生成独立规则块,不会合并选择器——这点和 CSS @layer 不同,别误以为能“压缩”输出
- 示例:
@mixin responsive-columns($base-count: 2) { column-count: $base-count; @media (min-width: $md) { column-count: $base-count + 1; } }
慎用 column-span: all 配合 Sass 动态生成标题类
想让标题横跨所有栏?column-span: all 是唯一方案,但它在 Safari 旧版本中支持极差,且一旦父容器未设 column-count,该声明会被静默忽略。用 Sass 自动生成对应 class 时,很容易忽略这些前提条件。
实操建议:
- 不要单独定义
.section-title { column-span: all; },而应限定作用域,例如.article-content .section-title,确保父级已启用分栏 - 若需批量生成(如
.h1-colspan、.h2-colspan),用@each循环时务必同步注入父选择器约束 - 测试时重点看 Safari 14–15 的表现:这些版本对
column-span的重排行为不稳定,有时需强制触发重绘(如加transform: translateZ(0))
性能陷阱:避免在大量元素上启用 columns
分栏不是“免费”的布局方式。浏览器要重新切分内容流、计算每栏高度、处理跨栏断行,DOM 节点越多,重排成本越高。Sass 能帮你写得更整齐,但不能绕过这个底层限制。
实操建议:
- 只对纯文本容器(如
<article></article>、<section></section>)启用分栏,避开含交互组件(按钮、表单、iframe)的区域 - 如果用
@include columns()应用于列表项(li)或卡片集合,实际生效的是每个子项单独分栏——这通常不是你想要的,应检查选择器是否误用了后代关系 - Chrome DevTools 的 “Rendering” 面板里勾选 “Layer borders”,能快速识别哪些区域被强制建层(分栏容器常触发新图层),帮助定位卡顿源头
@mixin 写得再漂亮,也救不了错误的布局决策。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











