列间距错乱源于Less编译与浏览器解析的双重失配,需从percentage()精度、calc()单位缺失、栅格生成逻辑三处同步校准:统一用round(percentage(1/@grid-columns),4)控制精度;calc()变量必须显式带单位;各断点独立定义列数并匹配偏移公式;浮动布局应改用flex/grid+gap。
列间距错乱不是 CSS 渲染 bug,而是 Less 编译期计算 + 浏览器运行时解析的双重失配导致的。核心得从 percentage() 精度、calc() 单位缺失、以及栅格类生成逻辑三处同时校准。
Less 的 percentage() 对小数不友好:比如 percentage(1/12) 输出 8.333333333333334%,12 个相加实际是 100.00000000000002%,浏览器 layout 阶段截断后可能变成 99.999%,最后一列被迫换行。这不是视觉误差,是真实宽度溢出。
round(percentage(1 / @grid-columns), 4) 强制保留 4 位小数,再参与后续乘法width: (100% / @cols) * @i —— 先算基准单列宽:@col-width: round(percentage(1 / @grid-columns), 4),再写 width: ~"(@{col-width} * @{i})"
@grid-columns: 12,禁止硬编码 12 或 1/12
编译后出现 calc(100% - 24) 这种无单位表达式,浏览器直接忽略整条声明。根源是变量定义没带单位,比如 @gutter: 24 而不是 @gutter: 1.5rem。
calc() 的变量必须显式带单位:@gutter: 1.5rem,不能靠后期拼接.gutter-calc(@val) when (unit(@val) = rem) { width: calc(100% - @val); }
.gutter-calc(1.5rem),避免裸值入参偏移和推拉不是单纯加 margin-left 或 left,它依赖当前断点下的列宽基准。用 xs 断点的 @grid-columns-xs: 12 算出的 .col-md-offset-3,宽度必然不对 —— 因为 md 断点可能用的是 @grid-columns-md: 16。
@grid-columns-sm: 12; @grid-columns-md: 16;
margin-left: (100% / @grid-columns-md) * @n + @grid-gutter-width / 2(补半边槽宽,抵消 .row 负 margin).push-* 必须配合 position: relative 容器,单独使用无效;且必须和列宽类共存,如 .col-md-6.col-md-push-3
浮动布局中所谓“列间距”,本质是靠 margin-right 模拟的视觉假象。一旦子项高度不一致,右侧就会出现不可控空白——这不是 margin 错了,是浮动流断裂了。
:not(:last-child) 清除末项冗余:.item:not(:last-child) { margin-right: 12px; }
width: calc(33.333% - 12px),不能写 33.33%
overflow: hidden 或 display: flow-root,否则负 margin 会被吞掉display: flex; gap: 12px; 或 display: grid; gap: 12px; 天然抗高度差异最常被忽略的一点:栅格系统里的“间距”从来不是独立属性,它必须和列宽、断点、容器行为捆绑校准。少校准其中一环,错乱就藏在看似正常的代码里。