一.简述
flexbox是 flexible box 的简称,是 css3引入的新的布局模式。它决定了元素如何在页面上排列,使它们能在不同的屏幕尺寸和设备下可预测地展现出来。它之所以被称为 Flexbox ,是因为它能够扩展和收缩 flex 容器内的元素,以最大限度地填充可用空间。是一种自适应布局方式。其强大之处在于:
- 在不同方向排列元素
- 重新排列元素的显示顺序
- 更改元素的对齐方式
- 动态地将元素装入容器
虽然 flexbox 非常适合缩放,对齐和重新排序元素,但以下情况应该尽量避免使用 Flexbox 布局:
- 整体页面布局
- 完全支持旧浏览器的网站
二.详介
flexbox是一个模块,而不是一个单一的属性。其中有一些是容器上的属性(父元素,也被称为“flex container”),而有一些是容器子元素上的属性(常称为“flex iterm”)。
基本上,Flex项目是沿着main axis
(从main-start
向main-end
)或者cross axis
(从cross-start
向cross-end
)排列。
- main axis: flex容器的主轴,主要用来配置flex项目。note:它不一定是水平,这主要取决于
flex-direction
属性。 - main-start | main-end:flex项目的配置从容器的主轴起点边开始,往主轴终点边结束。
- main size:flex项目在主轴方向的宽度或高度就是项目的主轴长度,flex项目的主轴长度属性是
width
或height
属性,由其对着主轴方向决定。 - cross axis:与主轴垂直的轴称作侧轴,是侧轴方向的延伸。
- cross-start | cross-end:伸缩行的配置从容器的侧轴起点边开始,往侧轴终点边结束。
- cross size:flex项目在侧轴方向的宽度或高度就是项目的侧轴长度,flex项目的侧轴长度属性是
width
或height
属性,由其对着侧轴方向决定。
1.flex容器属性
定义一个flex容器:
.flex-container { display: flex; }默认情况下,所有直接子元素被认为是flex项,从左至右依次排列为一行。若 flex 项的宽度总和大于容器,那么 flex 项将按比例缩小,直到它们适应 flex 容器宽度。
(1)flex-direction:用来创建主轴,从而定义flex项目在flex容器中放置的方向。flexbox是一种单方向的布局概念。认为flex项目主要排列方式要么是水平排列,要么是垂直列排列。
属性值 | 含义 |
row(默认值) | (水平方向)如果书写方式是ltr ,那么flex项目从左向右排列;如果书写方式是rtl ,那么flex项目从右向左排列 |
row-reverse | (反向水平)如果书写方式是ltr ,那么flex项目从右向左排列;如果书写方式是rtl ,那么flex项目从左向右排列 |
column | (垂直方向)从上到下排列 |
column-reverse | (反向垂直)从下到上排列 |
的属性值来改变,在其排列不下时,决定元素如何换行。(
换行:指定伸缩项目是否沿着侧轴排列)
属性值 | 含义 |
nowrap(默认值) | 单行显示,如果书写方式是ltr ,flex项目从左向右排列,反之rtl ,从右向左排列 |
wrap | 多行显示,如果书写方式是ltr ,flex项目从左向右排列,反之rtl ,从右向左排列 |
wrap-reverse | 多行显示,如果书写方式是ltr ,flex项目从右向左排列,反之rtl ,从左向右排列 |
(3)flex-flow:flex-direction和flex-wrap的简写
(4)justify-content:伸缩项目在主轴上对齐方式。这一行为会在所有可伸缩长度及所有自动边距均被解释后进行。当一行上的所有伸缩项目都不能伸缩或可伸缩但是已经达到其最大长度时,这一属性才会对多余的空间进行分配。当项目溢出某一行时,这一属性也会在项目的对齐上施加一些控制。
属性值 | 含义 |
flex-start(默认值) | 伸缩项目向一行的起始位置靠齐。该行的第一个伸缩项目在主轴起点边的外边距与该行在主轴起点的边对齐,同时所有后续的伸缩项目与其前一个项目对齐。 |
flex-end | 伸缩项目向一行的结束位置靠齐。该行的最后一个伸缩项目在主轴终点边的外边距与该行在主轴终点的边对齐,同时所有前面的伸缩项目与其后一个项目对齐。 |
center | 伸缩项目向一行的中间位置靠齐。该行的伸缩项目将相互对齐并在行中居中对齐,同时第一个项目与该行在主轴起点的边的距离等同与最后一个项目与该行在主轴终点的边的距离(如果剩余空间是负数,则保持两端溢出的长度相等)。 |
space-around | 伸缩项目会平均地分布在行里。如果剩余空间是负数,或该行只有一个伸缩项目,则此值等效于flex-start 。在其它情况下,第一个项目在主轴起点边的外边距会与该行在主轴起点的边对齐,同时最后一个项目在主轴终点边的外边距与该行在主轴终点的边对齐,而剩下的伸缩项目在确保两两之间的空白空间相等下平均分布。 |
space-between | 伸缩项目会平均地分布在行里,两端保留一半的空间。如果剩余空间是负数,或该行只有一个伸缩项目,则该值等效于center 。在其它情况下,伸缩项目在确保两两之间的空白空间相等,同时第一个元素前的空间以及最后一个元素后的空间为其他空白空间的一半下平均分布。 |
网上找到一个图片更好说明justify-content的表现:
(5)align-items:伸缩项目在交叉轴的对齐方式。
属性值 | 含义 |
flex-start(默认值) | 伸缩项目在侧轴起点边的外边距紧靠住该行在侧轴起始的边。 |
flex-end | 伸缩项目在侧轴终点边的外边距靠住该行在侧轴终点的边 。 |
center | 伸缩项目的外边距盒在该行的侧轴上居中放置。(如果伸缩行的尺寸小于伸缩项目,则伸缩项目会向两个方向溢出相同的量)。 |
stretch | 如果侧轴长度属性的值为auto ,则此值会使项目的外边距盒的尺寸在遵照min/max-width/height 属性的限制下尽可能接近所在行的尺寸。 |
baseline | 如果伸缩项目的行内轴与侧轴为同一条,则该值和flex-start 等效。其它情况下,该值将参与基线对齐。所有参与该对齐方式的伸缩项目将按下列方式排列:首先将这些伸缩项目的基线进行对齐,随后其中基线至侧轴起点边的外边距距离最长的那个项目将紧靠住该行在侧轴起点的边。 |
网上找到一个图片更好说明align-items的表现:
(6)align-content:指定伸缩项目行在侧轴的对齐方式。
网上找到一个图片更好说明align-content的表现:
2.flex项目属性
(1)flex-grow:当有多余空间时,设定项目的放大比例。它接受一个没有单位的值作为一个比例系数。它可以使用Flex项目完全占用Flex容器可用的空间。
如果所有flex项目的flex-grow
设置为0
,表示flex容器中的flex项目不放大。如果所有flex项目的flex-grow
设置为1
,表示flex容器中的flex项目具有相等的尺寸。如果你给其中一个flex项目设置flex-grow
的值为2
,那么这个flex项目的尺寸将是其他Flex项目两倍(其他flex项目的flex-grow
值为1
)。
note:注意:flex-grow取负值将失效。
(2)flex-shrink:当空间不足时,设定元素的缩小比例。
如果所有flex项目的flex-shrink
设置为0
,表示flex容器中的flex项目不缩小。如果所有flex项目的flex-shrink
设置为1
,表示flex容器中的flex项目等比缩小。
note:注意:flex-shrink取负值将失效。
(3)flex-basis:(元素在主轴上的占据空间)定义了flex项目在分配flex容器剩余空间之前的一个默认尺寸。main-size
值使它具有匹配的宽度或高度,不过都需要取决于flex-direction
的值。
(4)flex是flex-grow,flex-shrink
和flex-basis
三个属性的缩写。第二个和第三个参数是可选值。其默认值是0 1 auto。
flex常见值:
flex: 0 auto
,flex: initial
与flex: 0 1 auto
相同。(这也就是初始值。)根据width
/height
属性决定元素的尺寸。(如果项目的主轴长度属性的计算值为auto
,则会根据其内容来决定元素尺寸。)当剩余空间为正值时,伸缩项目无法伸缩,但当空间不足时,伸缩项目可收缩至其最小值。网页作者可以用对齐相关的属性以及margin
属性的auto
值控制伸缩项目沿着主轴的对齐方式。
flex: auto
与flex: 1 1 auto
相同。根据width
/height
属性决定元素的尺寸,但是完全可以伸缩,会吸收主轴上剩下的空间。如果所有项目均为flex: auto
、flex: initial
或flex: none
,则在项目尺寸决定后,剩余的正空间会被平分给是flex: auto
的项目。
flex: none
与flex: 0 0 auto
相同。根据width
/height
属性决定元素的尺寸,但是完全不可伸缩。其效果与initial
类似,但即使在空间不够而溢出的情况下,伸缩项目也不能收缩。
(5)align-self:定义伸缩项目自身的对齐方式。(对于匿名伸缩项目,align-self的值永远与其关联的伸缩容器的align-items的值相同。)
属性值 | 含义 |
flex-start(默认值) | 伸缩项目在侧轴起点边的外边距紧靠住该行在侧轴起始的边。 |
flex-end | 伸缩项目在侧轴终点边的外边距靠住该行在侧轴终点的边 。 |
center | 伸缩项目的外边距盒在该行的侧轴上居中放置。(如果伸缩行的尺寸小于伸缩项目,则伸缩项目会向两个方向溢出相同的量)。 |
stretch | 如果侧轴长度属性的值为auto ,则此值会使项目的外边距盒的尺寸在遵照min/max-width/height 属性的限制下尽可能接近所在行的尺寸。 |
baseline | 如果伸缩项目的行内轴与侧轴为同一条,则该值和flex-start 等效。其它情况下,该值将参与基线对齐。所有参与该对齐方式的伸缩项目将按下列方式排列:首先将这些伸缩项目的基线进行对齐,随后其中基线至侧轴起点边的外边距距离最长的那个项目将紧靠住该行在侧轴起点的边。 |
(6)order:(默认情况,Flex项目是按文档源的流顺序排列。)在Flex容器中可以通过order属性来控制flex项目的顺序源。有最小(负值最大)order的伸缩项目排在第一个。若有多个项目有相同的
order
值,这些项目照文件顺序排。这个步骤影响了伸缩项目生盒树成的盒子的顺序,也影响了后面的演算法如何处理各项目。