1. 什么是Flex弹性盒子布局
Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。它是一种一维的布局模型(只能实现一种方向,要么是垂直方向,要么是水平方向),它给flexbox的子元素之间提供了强大的空间分布和对齐能力(就是依赖于2根轴,分别是主轴和交叉轴,交叉轴始终与主轴垂直)。
注意:任何一个容器都可以指定为 Flex布局,行内元素也可以使用 Flex布局。
2. 给父级设置display: flex | inline-flex;
那么设置这个盒子就是flex容器,它里面的元素就叫flex元素,也叫项目。
注意:设置了display:flex | inline-flex;之后,columns属性就失效了(在伸缩容器上没有效果),同时子元素的float、clear和vertical-align属性也失效了(即在伸缩项目上没有效果)
3. Flex布局由什么组成
Flex布局是由:flex元素和flex容器组成的。
4. flex元素的初始默认效果
因为所有css属性都会有一个初始值,所以flex容器中的所有flex元素都会有初始默认效果:
- 主轴水平从左到右。元素排列为一行(flex-direction属性的初始效果为row);
- 元素从左边起始线开始(justify-content:flex-start)。元素从主轴的起始线开始;
- 默认不拉伸(flex-grow:0),所谓的不拉伸是指:当子元素宽度加起来没有容器大时,子元素宽度是多少就是多少,不会被拉伸的。但是会压缩(flex-shrink:1),不换行(flex-wrap:nowrap);
- 不设置高时flex元素充满flex容器(align-item:stretch)。元素被拉伸来填充交叉轴大小。
5. flex容器属性(6种)
- flex-direction设置flex容器主轴的方向;
row(默认值):主轴为水平方向,起点在左端。
row-reverse:主轴为水平方向,起点在右端。
column:主轴为垂直方向,起点在上沿。
column-reverse:主轴为垂直方向,起点在下沿。
- flex-wrap控制flex容器是单线还是多线,以及新线的堆叠方向;
nowrap(默认):不换行。
wrap:换行,第一行在上方。
wrap-reverse:换行,第一行在下方。
- flex-flow: flex-direction flex-wrap;它的使用率比较低,因为它是flex-direction和flex-wrap的复合写法,默认值为row nowrap。
- justify-content项目在主轴上的对齐方式;
flex-start(默认值):左对齐。
flex-end:右对齐。
center: 居中。
space-between:两端对齐,项目之间的间隔都相等。
space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
- align-items项目在交叉轴上的对齐方式;
flex-start:交叉轴的起点对齐。
flex-end:交叉轴的终点对齐。
center:交叉轴的中点对齐。
baseline: 项目的第一行文字的基线对齐。
stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
- align-content多根轴线的对齐方式,如果项目只有一根轴线,该属性不起作用。
flex-start:与交叉轴的起点对齐。
flex-end:与交叉轴的终点对齐。
center:与交叉轴的中点对齐。
space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
stretch(默认值):轴线占满整个交叉轴。
6. flex元素属性(6种)
- flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间;
- flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大;
- flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小;
- flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选;
注意:该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。
- align-self属性是单个项目在交叉轴上的对齐方式;
auto:默认值。
flex-start:交叉开始齐平。
flex-end:交叉结尾齐平。
center:居中。
baseline:第一行文字。
stretch:设置高度时,该元素高度为flex容器高度。
- order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。
下面我用画图的形式来重点讲解一下flex-grow拉伸比例如何分配,以及flex-shrink压缩比例如何分配。
flex-grow拉伸比例如何分配:
拉伸之前:

拉伸之后:

flex-shrink压缩比例如何分配:
压缩前:

压缩后:

如果大家对拉伸和压缩感兴趣的话,可以在自己的编辑器中进行尝试其他的比例值,然后在浏览器中看看相应的效果图。