gap

Baseline 已广泛支持

此功能已非常成熟,可在多种设备和浏览器版本上使用。自 2017 年 10 月以来,它已在各大浏览器中可用。

gap CSS 简写属性用于设置行与列之间的间隙(也称为)。此属性适用于多列弹性网格容器。

试一试

gap: 0;
gap: 10%;
gap: 1em;
gap: 10px 20px;
gap: calc(20px + 10%);
<section class="default-example" id="default-example">
  <div class="example-container">
    <div class="transition-all" id="example-element">
      <div>One</div>
      <div>Two</div>
      <div>Three</div>
      <div>Four</div>
      <div>Five</div>
    </div>
  </div>
</section>
#example-element {
  border: 1px solid #c5c5c5;
  display: grid;
  grid-template-columns: 1fr 1fr;
  width: 200px;
}

#example-element > div {
  background-color: rgb(0 0 255 / 0.2);
  border: 3px solid blue;
}

构成属性

此属性是以下 CSS 属性的简写:

语法

css
/* One <length> value */
gap: 20px;
gap: 1em;
gap: 3vmin;
gap: 0.5cm;

/* One <percentage> value */
gap: 16%;
gap: 100%;

/* Two <length> values */
gap: 20px 10px;
gap: 1em 0.5em;
gap: 3vmin 2vmax;
gap: 0.5cm 2mm;

/* One or two <percentage> values */
gap: 16% 100%;
gap: 21px 82%;

/* calc() values */
gap: calc(10% + 20px);
gap: calc(20px + 10%) calc(10% - 5px);

/* Global values */
gap: inherit;
gap: initial;
gap: revert;
gap: revert-layer;
gap: unset;

此属性通过一个 <'row-gap'> 值,后可选择性地跟一个 <'column-gap'> 值来指定。如果省略 <'column-gap'>,则其值会设置为与 <'row-gap'> 相同。<'row-gap'><'column-gap'> 都可以指定为 <length><percentage>

<length>

指定分隔列、弹性项、弹性行和网格线的槽宽度。

<percentage>

指定分隔列、弹性项、弹性行和网格线的槽宽度,相对于元素尺寸。

描述

此属性定义了 CSS 多列布局中列之间的间隙,CSS 弹性盒子布局中弹性项和弹性行之间的间隙,以及 CSS 网格布局中行和列之间的间隙。

生成的间隙会创建宽度或高度等于指定间隙大小的空白区域,很像一个空的项或轨道。元素之间的可见空间可能与提供的 gap 值不同,因为外边距、内边距和分布式对齐可能会在 gap 确定的基础上增加元素之间的间距。

在网格布局中,第一个值定义了行之间的槽,第二个值定义了列之间的槽。在网格和弹性布局中,如果只包含一个值,则该值用于两个维度。

对于弹性容器,第一个值是弹性项之间还是弹性行之间的间隙取决于方向。弹性项根据 flex-direction 属性的值以行或列的形式布局。对于行(row(默认)或 row-reverse),第一个值定义了弹性行之间的间隙,第二个值定义了每行内项之间的间隙。对于列(columncolumn-reverse),第一个值定义了弹性行内弹性项之间的间隙,第二个值定义了每个弹性行之间的间隙。

在多列容器中,第一个值定义了列之间的间隙。通过使用 column-rule-style 属性或 column-rule 简写,可以在原本的“空白空间”中添加分隔线。

百分比间隙值始终根据容器元素的内容框大小计算。当容器大小明确时,在所有布局模式下,行为都是明确且一致的。由于这三种布局模式(多列、弹性、网格)对循环百分比大小的处理方式不同,gap 也是如此。在网格布局中,循环百分比大小在确定固有大小贡献时解析为零,但在布局内容时解析为元素的内容框。以下两个示例演示了在示例部分中具有明确容器大小隐式容器大小的百分比间隙值。

规范的早期版本将此属性称为 grid-gap,为了保持与旧版网站的兼容性,浏览器仍然接受 grid-gap 作为 gap 的别名。

正式定义

初始值作为简写中的每个属性
应用于多列元素、弹性容器、网格容器
继承性
计算值作为简写中的每个属性
  • row-gap: 如指定,<length> 转换为绝对值,normal 计算为零,多列元素除外
  • column-gap: 如指定,<length> 转换为绝对值,normal 计算为零,多列元素除外
动画类型作为简写中的每个属性

正式语法

gap = 
<'row-gap'> <'column-gap'>?

<row-gap> =
normal |
<length-percentage [0,∞]>

<column-gap> =
normal |
<length-percentage [0,∞]>

<length-percentage> =
<length> |
<percentage>

示例

弹性布局

HTML

html
<div id="flexbox">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>

CSS

css
#flexbox {
  display: flex;
  flex-wrap: wrap;
  width: 300px;
  gap: 20px 5px;
}

#flexbox > div {
  border: 1px solid green;
  background-color: lime;
  flex: 1 1 auto;
  width: 100px;
  height: 50px;
}

结果

网格布局

HTML

html
<div id="grid">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>

CSS

css
#grid {
  display: grid;
  height: 200px;
  grid-template: repeat(3, 1fr) / repeat(3, 1fr);
  gap: 20px 5px;
}

#grid > div {
  border: 1px solid green;
  background-color: lime;
}

结果

多列布局

HTML

html
<p class="content-box">
  This is some multi-column text with a 40px column gap created with the CSS
  <code>gap</code> property. Don't you think that's fun and exciting? I sure do!
</p>

CSS

css
.content-box {
  column-count: 3;
  gap: 40px;
}

结果

百分比间隙值与显式容器大小

如果容器设置了固定大小,则间隙百分比值的计算基于容器的大小。因此,间隙行为在所有布局中都保持一致。在以下示例中,有两个容器,一个具有网格布局,另一个具有弹性布局。容器有五个红色的 20x20px 子元素。两个容器都使用 height: 200px 显式设置为 200px 高,并且间隙设置为 gap: 12.5% 0

html
<span>Grid</span>
<div id="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
</div>
<span>Flex</span>
<div id="flex">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
</div>
css
#grid {
  display: inline-grid;
  height: 200px;
  gap: 12.5% 0;
}

#flex {
  display: inline-flex;
  height: 200px;
  gap: 12.5% 0;
}

#grid > div,
#flex > div {
  background-color: coral;
  width: 20px;
  height: 20px;
}

现在使用Web Developer Tools 中的 Inspector 选项卡检查网格和弹性元素。为了查看实际间隙,请将鼠标悬停在检查器中的 <div id="grid"><div id="flex"> 标签上。您会注意到两种情况下的间隙都是相同的,即 25px。

百分比间隙值与隐式容器大小

如果容器上未显式设置大小,则百分比间隙在网格和弹性布局中行为不同。在以下示例中,容器未显式设置高度。

在网格布局的情况下,百分比间隙不计入网格的实际高度。容器的高度使用 0px 间隙计算,因此实际高度为 100px (20px x 5)。然后使用内容框的高度计算实际百分比间隙,间隙为 12.5px (100px x 12.5%)。间隙仅在渲染前应用。因此,网格保持 100px 高,但由于稍后在渲染前添加的百分比间隙而溢出。

在弹性布局的情况下,百分比间隙始终导致零值。

规范

规范
CSS Box Alignment Module Level 3
# gap-简写

浏览器兼容性

另见