Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性
任何一个容器都可以指定为 Flex 布局
行内元素也可以使用 Flex 布局
.box{
display: inline-flex;
}
Webkit 内核的浏览器,必须加上-webkit前缀。
.box{
display: -webkit-flex; /* Safari */
display: flex;
}
注意,设为 Flex 布局以后,子元素的float、clear和vertical-align属性将失效。
采用 Flex 布局的元素,称为Flex 容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。
在伸缩布局中,默认情况下水平方向是主轴,默认情况下主轴的起点在伸缩容器的最左边,默认情况下所有的伸缩项是从主轴的起点开始排版的
可以通过flex-direction来修改主轴起点的位置
flex-direction:row | row-reverse | column | column-reverse;
注意点:在伸缩布局中,主轴方向和侧轴方向永远都是垂直交叉的,只要主轴的方向发生了改变,侧轴的方向也会改变
在对齐的时候是做了两件事:
1.先按照主轴起点的位置进行排版
2.排版好了再按照设置好的方式进行对齐
justify-content: flex-start | flex-end | center | space-between | space-around;
一次性控制所有伸缩项的对齐方式
align-items: flex-start | flex-end | center | baseline | stretch;
baseline对齐图示:一行文字中最短的底部就是baseline
默认情况下,如果伸缩容器的一行放不下所有的伸缩项,那么系统会自动等比压缩所有的伸缩项(使得一行能放下)
flex-wrap属性定义,如果一条轴线排不下,如何换行
flex-wrap: nowrap | wrap | wrap-reverse;
属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用(只有在多行的时候才牵扯多行之间的对齐方式,一行的时候使用align-items就ok了)
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
先来看上面例子在设置了flex-wrap:wrap;后的效果
flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap
align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
align-self: auto | flex-start | flex-end | center | baseline | stretch;
默认情况下每一个伸缩项都有一个order属性,用于决定排序的先后顺序,数值越小,排列越靠前,默认为0。
当所有伸缩项的宽度小于伸缩容器的宽度时该属性才有效
flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
flex-grow:0;(默认值)
在伸缩项中有一个属性,用于控制当所有伸缩项的宽度总和大于伸缩容器宽度时如何缩小自己,以便于所有伸缩项宽度的总和能够填满伸缩容器(默认取值为1,表示当所有伸缩项宽度总和大于伸缩容器时等比缩放伸缩项来填满伸缩容器)
flex-shrink:1;(默认值:等比缩小填满伸缩容器)
如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
负值对该属性无效
flex=shrink缩小值得计算方式
1.计算溢出的总宽度
2.计算权重值
每个项目flex-shrink的值 * 当前伸缩项的宽度 累加求和
3.计算每个伸缩项需要缩小的范围
溢出的总宽度 * 当前伸缩项的宽度 * 当前伸缩项flex-shrink的值 / 权重值
4.最终伸缩项的宽度 = 设置的宽度 - 需要缩小的值
1.如果没有指定flex-grow的值或者flex-grow的值为0,那么当前伸缩项不会被扩充
2.如果flex-shrink的值为0,那么当前伸缩项不会被缩小
3.注意点:
前面说的都是扩充或者缩小宽度,这种说法不严谨,也可能是扩充和缩小高度,到底是宽度还是高度由主轴方向决定(扩充和缩小的是主轴方向上的值)
如果主轴方向是水平方向,那么扩充和缩小的就是宽度
如果主轴方向是垂直方向,那么扩充和缩小的就是高度
1.在伸缩布局中,可以通过flex-basis来设置伸缩项的宽度
(只有在伸缩布局中flex-basis才有效)
2.在伸缩布局中,如果通过flex-basis设置了宽度,再通过width设置会无效(flex-basis的优先级高于width)
3.特殊情况:如果同时通过flex-basis和width设置了宽度,一个值是auto,一个是具体值,那么会按照具体值来设置
宽度是100px
.box{
width:100px;
flex-basis:auto;
}
宽度是100px
.box{
flex-basis:100px;
width:auto;
}
若都设置了auto,那么宽度是内容的宽度
.box{
width:auto;
flex-basis:auto;
}
flex: 0 1 auto;(默认值)
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)(细品这两个取值)
建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值