📕 flex 容器:gap

gap 说是 flex 容器,是不太严谨地说法,只能说 gap 是写在 flex 容器中,用于控制 flex 元素之间的间距的。是的,gap 在 CSS 属性中的作用主要就是元素之间的间距控制。所以,很显然这个间距必定是列与行的间距。

  • row-gap
  • column-gap

换句话说,gaprow-gapcolumn-gap 的简写方式,即,gap 有两个属性值。

div {
  /* 代表:
  	 row-gap: 10px;
  	 column-gap: 20px;
  */
  gap: 10px 20px;
}

属性值介绍

间距的属性值比较简单,只要是一个长度值+单位就可以了,当然了,也是可以通过 calc() 来计算。

默认属性值是 normal

结合实例看一下效果

/*
  file: flex_0078.css
  使用 gap 属性让 flex item 元素产生间距
*/
.demo {
  border: 1px solid #000;
}

.demo {
  /* 在 flex 容器超过一行的 flex 元素换行显示 */
  flex-wrap: wrap;
  padding: 10px;
  gap: 10px;
}

.item {
  flex: 1 20%;
}

在这里,我们给外层 .demo 增加了一个 gap: 10px; 的同时,还加了 padding: 10px;。至于为什么呢,我们先看一下目前现在这个 demo 的效果。

如没有 gap 属性的话,我们要写这个间距,可能就是要用 margin 结合 :nth-child() 方式来控制。在 demo_0070 中我们是用了 border 的方式来处理的。总之,相对比较折腾,而 gap 就很好地帮我们解决了这个问题。

那么回到前面的问题,为什么要有 padding 这个属性值呢。其实主要是因为 gap 的作用是元素与元素之间的间距,而不是元素与容器之间的间距。所以,当我们没有 padding 值顶开容器与元素的间距,那么就变成这样了。

显然这跟我们想要的还是有差距的。所以,要记住一点:gap 的作用是元素与元素之间的间距

该属性值有长度值+单位,所以,我们也是可以使用百分比来实现,这样结合 flex 的弹性布局,不是更美哉!想想就开心的感觉,对吧。

/*
  file: flex_0079.css
  使用 gap 属性让 flex item 元素产生间距,使用百分比作为单位
*/
.demo {
  /* ......省略部分代码...... */
  /* 这里将原来的 10px 改为 10% */
  gap: 10%;
}

好像哪里不对,元素与元素上下之间的间距怎么不见了?莫非 gap: 10%; 的作用于 gap: 10px; 作用是不同的?

但是从这里来看,并没有任何问题,row-gap 中已经有 10% 这个值了。那是为什么呢?对于百分比而言,都是有一个相对的值来做比较的,在这个 flex 弹性布局中,gap: 10%; 中的百分比所比较的值分别是:

  • row-gap -> height
  • column-gap -> width

而我们现在使用的是 flex 布局,并未设置任何宽高。既然如此,那么我们增加一个 height 看看就知道了。

/*
  file: flex_0080.css
  使用 gap 属性让 flex item 元素产生间距,使用百分比作为单位
  增加 height 看一下 gap 效果;
*/
.demo {
  /* ......省略部分代码...... */
  gap: 10%;
  /* 这里增加一个 height,看看 row-gap 效果是否改变 */
  height: 200px;
}

鉴于现在我们使用的 height 是固定值,所以,当我们改变 flex 容器宽度时,会发现 column-gap 的值是在不断变化,而 row-gap 则是不会变,永远就是 200px * 10% = 20px 的这个结果。

那么问题又来了,如果改变了 flex-direction 的话,会不会同时改变了 row-gapcolumn-gap 的方位呢?

/*
  file: flex_0081.css
  使用 gap 属性让 flex item 元素产生间距,使用百分比作为单位
  增加 height 看一下 gap 效果;
  改变 flex-direction 后看看 gap 的效果;
*/
.demo {
  /* ......省略部分代码...... */
  gap: 10%;
  height: 200px;
  /* 新增一个 flex-direction 的值看效果 */
  flex-direction: column;
}

看这个结果,改变的只是 flex 元素的变化,但 gap 该怎么体现的,还是继续怎么体现。

小结

  • gap 是处理元素与元素之间的间距;
  • 当使用百分比作为单位时,注意 flex 容器的宽高值;

gap 这个属性可以让我们在 flex 弹性布局中快速去处理每个 flex 元素的间距问题,不用再去考虑加 margin 后元素的样式处理,整体效果还是很赞的。但,有一个很现实的问题是我们必须要去面对的,是的,兼容性这个问题我们是无法逃避的。

那么我们看一下 gap 属性在 flex 布局中的兼容性情况。

看到 WD 这两个字母,再看看那么多红色的小方块,想想也就只是一个期待了。看到 iOS 和 Android 的兼容性后,也就没什么好期待的了,毕竟现在主要还是在移动端去使用 flex 布局居多。