Flex布局图文详解 看这一篇文章就够啦!(*╹▽╹*)

100 阅读7分钟

Flex 布局的基本概念和主要属性

Flex布局 是一种现代的前端布局模式,它用于在复杂的布局中轻松地对齐、分布和排序空间,特别是当屏幕大小或布局方向动态变化的场景。

基本概念

1. 容器 / 项目

使用 Flex 布局的元素(display: flex),称之为 Flex 容器(Flex Container),简称 "容器"。Flex 的布局发生在父容器和子容器之间,因此,元素一旦被申明为 Flex 布局后,它的所有子元素自动成为容器成员。通常,我们将容器内的成员统称为 Flex 项目(Flex item),简称 "项目"。

2. 主轴、交叉轴

容器中默认存在两条线轴,即:主轴(main axis)、交叉轴(cross axis)。主轴与交叉轴是垂直关系,值得注意的是主轴不一定是水平方向,而是由 flex-direction 属性所决定的。 * main axis:主轴。 * cross axis:交叉轴。

3. 轴线起始位置

主轴和交叉轴的起始位置,分别称为:main start、main end、cross start、cross end。

  • main start:主轴开始位置
  • main end:主轴结束位置
  • cross start:交叉轴开始位置
  • cross ennd:交叉轴结束位置

4. 主轴、交叉轴空间

项目(flex item)默认是沿主轴方向排列的,单个项目占据主轴的空间称之为 main size,占据交叉轴的空间称之为 cross size。

  • main size:占据主轴的空间
  • cross size:占据交叉轴的空间

基本概念间的相互关系如下图所示:

flex.png

容器 / 项目属性

1. 容器属性

容器的属性和取值如下表所示:

container_attribute.png

* flex-direction

flex-direction 属性,定义了在哪个方向上排列项目。flex-direction有四个取值,分别为:

取值说明
row从左到右(默认)
row-reverse从右到左
column从上到下。
column-reverse从下到上

属性实例如下图所示:

flex-direction.png

* flex-wrap

flex-wrap 属性,定义了项目在轴线上的排列方式,在默认情况下,项目都排列在一条线上,不会换行,可以通过 flex-wrap 来定义换行的方式。flex-wrap 有三个取值,分别为:

取值说明
nowrap不换行(默认)
wrap换行,第一行在上方
wrap-reverse换行,第一行在下方

属性实例如下图所示:

flex-wrap.png

* flex-flow

flex-flow 属性,是 flex-direction 属性和 flex-wrap 属性的简写形式,默认值为 row nowrap。

语法:flex-flow: flex-direction flex-wrap;

例子:

flex-flow: row nowrap (默认值,项目沿着主轴排列,不换行。)

flex-flow: column wrap-reverse(项目沿着交叉轴排列,反向换行)

* justify-content

justify-content 属性,定义了项目在主轴上的对齐方式,justify-content 有五个取值,分别为:

取值说明
flex-start左对齐
flex-end右对齐
center居中对齐
space-between两端对齐,项目之间的间隔相等
space-around每个项目两侧的间隔相等,所以项目之间的间隔比项目与边框的间隔大一倍

属性实例如下图所示:

justify-content.png

space-between 会使项目两端对齐,并且项目之间的间距相同。space-around 同样会是项目的间距相同,不同之处是与两端也会有间距。且项目与项目之间的距离是两端间距的2倍,可以理解为:margin-left、margn-right 设置了相同的值。

* align-items

align-items 属性,定义了项目在交叉轴上的对齐方式,align-items 有五个取值,分别为:

取值说明
flex-start顶部对齐
flex-end底部对齐
center居中对齐
baseline以项目中第一行文字基线对齐
stretch默认值,如果项目未设置高度或设为auto,将占满整个容器的高度
* align-content

align-content 属性,定义了多根轴线的对齐方式,如果项目只有一根轴线,该属性不起作用,align-content 有六个取值,分别为:

取值说明
flex-start与交叉轴起点对齐
flex-end与交叉轴终点对齐
center在交叉轴上居中对齐
space-between与交叉轴两端对齐,轴线之间的间隔平均分布
space-around轴线之间的间隔平均分布,包括两端
stretch默认值,轴线占满交叉轴

2. 项目属性

项目的属性和取值如下表所示:

属性默认值说明
order0定义项目的排列顺序,数值越小,排列越靠前,默认为0
flex-grow0定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大
flex-shrink1定义项目的缩小比例,默认为1,即如果空间不足,该项目将缩小
flex-basisauto定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间
flex0 1 autoflex-grow, flex-shrink 和 flex-basis 的简写,默认值为 0 1 auto。后两个属性可选。
align-selfauto允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性。默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch。

在学习这些具体的项目属性之前,我们需要先了解一个非常重要的概念 ——— 剩余空间。 如下图所示,将父容器的宽度设置为 800px,容器中 3 个项目宽度分别为 100px、200px、300px。

remaining-space.png

那么,剩余空间 就是:

200px = 800px - (100px + 200px + 300px)

而 flex-grow、flex-shrink 和 flex-basis 都是围绕如何分配剩余空间展开的。

* order

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

.item { order: <integer> }

如下图所示:

order.png

* flex-grow

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

.item { flex-grow: <number> }

如下图所示:

flex-grow.png

* flex-shrink

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

.item { flex-shrink: <number> }

如下图所示:

flex-shrink.png

* flex-basis

flex-basis 属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。

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

如下图所示: 理解这段话的重点两个字就是 "之前"

我们将 3 个 item 宽度分别设置为 100px、200px、300px,并且将第 3 个项目的 flex-basis 设置为 400px。可以看出,效果如下图所示。

flex-basis.png

* flex

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

.item { flex: <flex-grow> <flex-shrink> <flex-basis> }
* align-self

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

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

align-self 有 6 个可能值,除了 auto(继承父元素的 align-items 属性),其他都与 align-items 的取值相同。

取值说明
auto继承父元素的 align-items 属性
flex-start与交叉轴的起点对齐
flex-end与交叉轴的终点对齐
center在交叉轴上居中对齐
baseline以项目中第一行文字基线对齐
stretch默认值,如果项目未设置高度或设为auto,将占满整个容器的高度

相信通过这篇文章,应该对 Flex 布局有了更深的了解和认识,欢迎评论探讨~
如果觉得对你有所帮助,麻烦点个小爱心❤️ !啾咪!ღ( ´・ᴗ・` )比心!