Skip to content

Flex 布局新认知

2021-11-08-view(s)-comment(s)- min read

Preface

上次详细看了一波 Flex 布局之后,在项目中一直有使用 Flex 布局,但是过程中,对 justify-itemsjustify-contentalign-itemsalign-content 偶有困惑,于是针对着解了一把心结。

justify-items & justify-content

justify-items

简单来说(摘自developer.mozilla.org):

CSS 的 justify-items 属性为所有盒中的项目定义了默认的 justify-self , 可以使这些项目以默认方式沿适当轴线对齐到每个盒子。

而需要注意的是,在弹性盒子中,justify-items 属性会被忽略。

justify-content

有了对 justify-items 的上述认识后,justify-content 则很容易拎得清,但由于 flex-grow 默认都是 0,所以想要 justify-content 生效,还需要指定元素的 flex-grow,你比如:

html
<div
  style="display: flex; height: 50px; width: 400px; background-color: brown; justify-content: stretch;"
>
  <div
    style="height: 40px; flex-basis: 40px; background-color: rgb(182, 143, 143);margin: 5px; flex-grow: 2;"
  >
    1
  </div>
  <div
    style="height: 40px; flex-basis: 40px; background-color: rgb(182, 143, 143);margin: 5px; flex-grow: 1;"
  >
    2
  </div>
  <div
    style="height: 40px; flex-basis: 40px; background-color: rgb(182, 143, 143);margin: 5px;"
  >
    3
  </div>
  <div
    style="height: 40px; flex-basis: 40px; background-color: rgb(182, 143, 143);margin: 5px;"
  >
    4
  </div>
  <div
    style="height: 40px; flex-basis: 40px; background-color: rgb(182, 143, 143);margin: 5px;"
  >
    5
  </div>
</div>

效果如下:

1
2
3
4
5

align-items & align-content

在某个弹性盒子内,在设置了 flex-wrap: wrap 后,有多行 items,align-content 可用于决定在竖直方向如何分空间,可以是:

  • start - 多行都分布在盒子上方,不管剩余的空间
  • end - 多行都分布在盒子下方,不管剩余的空间
  • center - 多行都分布在盒子中间,不管剩余的空间
  • space-between - 剩余空间分布在多行之间,头、尾的上、下没有空间
  • space-around - 剩余空间分布在多行四周,头、尾的上、下也有空间
  • stretch - 各行均匀地吃掉剩余空间,这是默认效果

align-items 则决定了每一行在分到的空间内的对齐方式,可以是 start、end、center、stretch(默认)。由此可见,只有当 align-content 为 stretch 时,align-itemsflex-startcenterflex-end 效果才能出来。

有了以上认知,则可以很好理解为何:

html
<div
  style="display: flex; height: 200px; width: 400px; background-color: brown; flex-wrap: wrap; align-items: stretch; align-content: stretch;"
>
  <div
    style="flex-basis: 390px; min-height: 40px; background-color: rgb(182, 143, 143);margin: 5px;"
  >
    1
  </div>
  <div
    style="flex-basis: 390px; background-color: rgb(182, 143, 143);margin: 5px;"
  >
    2
  </div>
  <div
    style="flex-basis: 390px; background-color: rgb(182, 143, 143);margin: 5px;"
  >
    3
  </div>
</div>

长这样:

1
2
3

而:

html
<div
  style="display: flex; height: 200px; width: 400px; background-color: brown; flex-wrap: wrap; align-items: flex-end; align-content: stretch;"
>
  <div
    style="flex-basis: 390px; height: 40px; background-color: rgb(182, 143, 143);margin: 5px;"
  >
    1
  </div>
  <div
    style="flex-basis: 390px; background-color: rgb(182, 143, 143);margin: 5px;"
  >
    2
  </div>
  <div
    style="flex-basis: 390px; background-color: rgb(182, 143, 143);margin: 5px;"
  >
    3
  </div>
</div>

长这样:

1
2
3