← 🧲 Flexbox · 简写语义与对齐边界 / gap:项之间的固定间距,以及在缝里画线 待审核 9 / 14
gap · 间距与装饰

gap:项之间的固定间距,以及在缝里画线

gap(及 row-gap / column-gap)在 flex / grid 的项之间开一道固定间距:只落在缝里、不碰首尾不参与剩余空间分配(先扣掉间距再让 grow/shrink 分配 free)。比起以往用 margin 拼间距,它省去了「最后一项多一截」的修补。本页先实测 gap 与 margin 的差别,再看 CSS Gaps Module Level 1 的新能力——gap decorations:直接在这些缝里画分隔线(column-rule / row-rule)。

1 · gap vs margin:间距落在哪里

两条轨道相同项数、相同间距值:上轨用 gap,下轨用 margin 拼。观察 margin 轨如何把首尾也推离容器内边(还需容器负 margin:first/:last-child 修补),而 gap 轨首尾正好贴边。

三条容易踩的点。 其一,gaprow-gap column-gap 的简写,单值时两轴相同;flex 多行时 row-gap 管行间、column-gap 管项间。其二,gap 不参与 justify-content 的剩余空间分配——它叠加在对齐之上space-between 再加 gap 仍生效)。其三,normal 在 flex/grid 解析为 0,在 multicol 才是 1em

2 · gap decorations:在缝里画分隔线

CSS Gaps Module Level 1 把 multicol 时代的 column-rule 扩展到 flex / grid,并补上 row-rule:在 gap 中线绘制分隔线,纯视觉、不占布局(不挤动任何项),从此无需 border::after 伪元素拼分隔线。column-rule-*row-rule-*各自独立的 longhand(rule / rule-style 等简写只是一次写两轴),因此列线与行线的 style / width / color 可以不一致。下面先选「编辑哪一轴」再调 style / width / color,另有容器 gap、用 repeat()column-rule-width 逐缝变化(分组线),以及 gap-rule-paint-order 决定行线列线在交点谁压上。下方 lab 顶部横幅标明本浏览器走原生绘制还是 JS 模拟绘制

3 · gap decoration 属性一览

属性 取值 初始 说明
column-rule / row-rule <width> <style> <color> medium none currentcolor 简写,分别画列间(竖)与行间(横)分隔线;rule 一次设两者。
*-rule-style none / solid / dashed / dotted / double / … none border-style 同族;默认 none 即不画。
*-rule-width <line-width> medium 线宽。
*-rule-color <color> currentcolor 线色。
*-rule-break none / normal / intersection normal 遇到跨多轨的项时是否断线。flex 下 normal 等同 none(不断);grid 才有 T / 十字交点的断法。
*-rule-inset-{cap,junction}-{start,end} <length-percentage> / overlap-join 0 线段端点的内缩量,分别针对非交点端 (cap)交点端 (junction) 的起 / 止;overlap-join 让相邻线段在交点无缝相接。规范由早期单一 *-rule-outset 重构为这一组,Chrome 早期实现仍用 outset
rule-visibility-items 可见性关键字 (item 之间 / 容器边缘缝) 控制装饰画在哪些缝:仅 item 之间,还是也画到贴容器内边的边缘缝
rule-overlap 重叠行为关键字 相邻装饰在交点处的重叠 / 合并行为。
gap-rule-paint-order row-over-column / column-over-row row-over-column 行线与列线在交点处谁压在上面 (本页 lab 可切换实测)。

repeat() 让 rule 成为图案。 width / style / color 都接受 repeat(),可按缝逐条变化:例如 column-rule-width: repeat(2, 1px) 4px repeat(2, 1px) 画出「细细粗细细」的分组线(数独九宫格那种)。这把以往需要逐个 ::after 才能做的分组分隔线压成一行声明。

支持状态(截至 2026)。 gap decorations 仍是实验特性:Chrome / Edge 139+ 需在 chrome://flagsExperimental Web Platform Features 旗标。lab 顶部横幅以当前浏览器实测为准;若未原生支持,上面的演示改用 JS 在 gap 中线绘制等效线段(getBoundingClientRect 定位),仅作效果示意。这类需求在原生落地前的传统解法(border / ::after)也见于 滚动容器丢 padding 一页。

4 · 🔗 延伸

  • CSS gap decorations · developer.chrome.com — Chrome 团队对 column-rule / row-rule / repeat() 的介绍与示例(数独九宫格分组线)。
  • CSS Gaps Module Level 1 · W3C / CSSWG — gap 间距与 gap decorations 的规范全文:rule-break、rule-outset、rule-inset、paint-order 的精确语义。
  • MDN · gap · developer.mozilla.org — gap / row-gap / column-gap 在 flex / grid / multicol 的取值与 normal 解析。