Flex 布局,真香!

409 阅读6分钟

前言

在日常开发中,我们经常会使用到 Flex 布局,对比其他布局方式,Flex 布局更加简便、完整,并且是响应式的,不得不说是真香啊!

但是 Flex 布局的相关属性却不怎么好记,学了又忘,忘了再学,反反复复。于是我决定自己总结一篇文章,加强记忆、加深理解,一举拿下 Flex 布局。

本文主要参考阮一峰的 Flex 布局教程 ,有兴趣的小伙伴可以去看下原文和阮老师的其他文章,写得极好。

废话不多说,我们进入正题。

Flex 布局是什么

Flex 是 Flexible Box 的缩写,意思就是“弹性布局”,可以为盒模型提供最大的灵活性。任何一个容器都可以指定为 Flex 布局:

.box {
    display: flex;
}

行内元素也可以使用 Flex 布局:

.box {
    display: inline-flex;
}

注意:设置 Flex 布局后,子元素的floatclearvertical-align属性将失效。

基本概念

采用 Flex 布局的元素,叫做 “Flex 容器”,它的所有子元素自动成为容器的成员,叫做 “项目”。

bg2015071004.png

容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end

项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size

上面的讲解一定要结合图片多看几遍,彻底看懂为止,这很重要!

容器的属性

以下6个属性设置在容器上:

  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-items
  • align-content

flex-direction

flex-direction属性是决定主轴方向的,即项目排列的方向:

.box {
    flex-direction: row | row-reverse | column | column-reverse;
}

bg2015071005.png

它有4个值:

  • row(默认值):主轴为水平方向,起点在左侧
  • row-reverse:主轴为水平方向,起点在右侧
  • column:主轴为垂直方向,起点在上方
  • column-reverse:主轴为垂直方向,起点在下方

flex-wrap

默认情况下,项目都排在一条线上。flex-wrap属性可以定义,如果一条线排不下,怎么换行:

bg2015071006.png

.box {
    flex-wrap: nowrap | wrap | wrap-reverse;
}

它有3个值:

  • nowrap(默认值):不换行

bg2015071007.png

  • wrap:换行,第一行在上方

bg2015071008.jpeg

  • wrap-reverse:换行,第一行在下方

bg2015071009.jpeg

flex-flow

flex-flow属性是flex-directionflex-wrap的简写形式,默认值是row nowrap

.box {
    flex-flow: <flex-direction> <flex-wrap>
}

justify-content

justify-content属性用来定义项目在主轴上的对齐方式:

.box {
    justify-content: flex-start | flex-end | center | space-between | space-around;
}

bg2015071010.png

它有5个值,具体对齐方式与轴的方向有关,下面假设主轴是从左到右:

  • flex-start(默认值):左对齐
  • flex-end:右对齐
  • center:居中
  • space-between:两端对齐,项目之间的间隔都相等
  • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍

align-items

align-items属性用来定义项目在交叉轴上如何对齐:

.box {
    align-items: flex-start | flex-end | center | baseline | stretch;
}

bg2015071011.png

它有5个值,具体对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下:

  • flex-start:交叉轴的起点对齐
  • flex-end:交叉轴的终点对齐
  • center:交叉轴的中点对齐
  • baseline:项目的第一行文字的基线对齐
  • stretch(默认值):如果项目未设置高度或设为 auto,将占满整个容器的高度

align-content

align-content属性用来定义多根轴线的对齐方式,如果只有一根轴线,该属性不起作用:

.box {
    align-content: flex-start | flex-end | center | space-between | space-around | stretch
}

bg2015071012.png

它有6个值:

  • flex-start:与交叉轴的起点对齐
  • flex-end:与交叉轴的终点对齐
  • center:与交叉轴的中点对齐
  • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布
  • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍
  • stretch(默认值):轴线占满整个交叉轴

项目的属性

以下6个属性设置在项目上:

  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • flex
  • align-self

order

order属性用来定义项目的排列顺序,数值越小排列就越靠前,默认为0:

.item {
    order: <integer>;
}

bg2015071013.png

flex-grow

flex-grow属性用来定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大:

.item {
    flex-grow: <number>; 
}

bg2015071014.png

如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果有一个项目的flex-grow为2,其他项目都为1,则前者占据的剩余空间将比其他项目多一倍。

flex-shrink

flex-shrink属性用来定义项目的缩小比例,默认为1,即如果剩余空间不足,该项目将缩小 :

.item {
    flex-shrink: <number>;
}

bg2015071015.jpeg

如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果有一个项目的flex-shrink属性为0,其他项目都为1,当空间不足时,前者不缩小。

flex-basis

flex-basis属性用来定义在分配多余空间之前,项目占据的主轴空间。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目本来的大小:

.item {
    flex-basis: <length> | auto;
}

它可以设为跟widthheight属性一样的值(例如 250px),使项目占据固定空间,flex-basis的优先级高于width(可以理解为直接覆盖)。

flex

flex属性是flex-growflex-shrink、和flex-basis的简写,默认值为0 1 auto,后两个属性可选:

.item {
    flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ];
}

该属性有两个快捷值:autonone,分别代表1 1 auto0 0 auto

建议优先使用flex属性,而不是单独写三个分离的属性,因为浏览器会自动推算相关值。

align-self

align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch

.item {
    align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

bg2015071016.png

该属性有6个值,除了auto,其他都跟align-items属性完全一致。

练习

强烈推荐阮一峰老师的 Flex 布局教程:实例篇,跟着里面的栗子敲一遍,想学不会都难~

最后

如果文中有错误或者不足之处,欢迎大家在评论区指正。

你的点赞是对我莫大的鼓励!感谢阅读~