在学 CSS 的时候偶尔都会碰到 flex 布局,由于一直以来都使用传统的 display ,float ,以及 position 来实现基本的布局,因此对 flex 布局没有过多的了解。但对于一些特殊的布局,flex 布局会相对友好些。于是在网上查了资料学习后,也用这篇文章来记录下。

首先要了解下什么是 flex 布局,来看下 MDN web docs 对其的解释:

Flexible Box 模型,通常被称为 flexbox,是一种一维的布局模型。它给 flexbox 的子元素之间提供了强大的空间分布和对齐能力。

当我们需要给容器设置 flex 布局时,只需添加如下代码:

1
2
3
4
body{
display: -webkit-flex; /* webkit 内核的浏览器适配 */
display: flex;
}

了解 flex 布局,首先是两根轴线–主轴以及交叉轴,主轴有 flex-direction 定义,另一轴垂直于它。其次是下面这 6 个属性:

1
2
3
4
5
6
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content

  1. flex-direction 有 4 个取值,row | row-reverse | column | column-reverse
    row | row-reverse 表示主轴沿着横排的方向也就是 inline 方向延伸,reverse 表示起点从右端开始,默认在左端
    column | column-reverse 表示主轴沿着竖排方向也就是 block 方向延伸,reverse 表示起点从下开始,默认在上
  2. flex-wrap 定义如何换行,有 3 个取值 nowrap | wrap | wrap-reverse
    nowrap 为不换行,wrap 为换行,wrap-reverse 也为换行,但是从下往上排
  3. flex-flow flex-direction 与 flex-wrap 的简写,默认值为 row nowrap
  4. justify-content 定义在主轴上的对齐方式。有 5 个值 flex-start(左对齐) | flex-end(右对齐) | center(居中) | space-between(两端对齐) | space-around(两侧间距相等);
  5. align-items 定义在交叉轴上的对齐方式,有 5 个值 flex-start(起点对齐) | flex-end(终点对齐) | center(居中) | baseline(第一行文字的基线对齐) | stretch(默认值,占满容器高度)
  6. align-content 定义多根轴线在交叉轴的对齐方式,如果只有一根轴线,该属性不起作用,有 6 个值
    flex-start:起点对齐。
    flex-end:终点对齐。
    center:与交叉轴的中点对齐。
    space-between:轴两端对齐,轴线之间的间隔平均分布。
    space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
    stretch(默认值):轴线占满整个交叉轴。

除此之外,还有其它一些属性值得了解。

  • order属性-优先级
    定义项目的排列顺序。数值越小,排列越靠前。
  • flex-grow-放大
    定义项目的放大比例,默认为 0 。如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。
  • flex-shrink-缩小
    定义项目的缩小比例,默认为 1。如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
  • flex-basis
    定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。
  • flex
    flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
  • align-self
    允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

    参考资料: flex布局的基本概念
    语法篇 - 阮一峰的网络日志