弹性盒子布局
弹性盒子(Flexbox)是一种灵活的线性容器。如果希望元素在水平或垂直方向依次排列,并且能够根据容器尺寸自动调整元素位置和大小,可以使用弹性盒子布局。
弹性盒子布局包括两部分:flex容器和flex元素。如果一个元素的 display
属性是 flex
,它就成为flex容器,它的下级元素成为flex元素。flex容器是块元素,独占一行。如果不希望flex容器产生换行,可以将容器的 display
属性设置为 inline-flex
。
弹性盒子是一种线性容器,这条线叫做主轴。沿着主轴方向,flex元素在flex容器中依次排列。主轴方向由flex容器的 flex-direction
属性决定,值可以是
flex-direction | 排列方向 |
---|---|
row(默认值) | 左起水平向右 |
row-reverse | 右起水平向左 |
column | 上起垂直向下 |
column-reverse | 下起垂直向上 |
flex元素的宽度(高度)由flex元素的属性 flex-basis
(优先级高)或 width
( height
)决定。flex元素未必总能恰好排满主轴,通常需要处理“排不满”和“排不下”两种情况。
“排不满”有两种处理方法:一是拉伸元素覆盖剩余空间,二是用空白填充剩余空间。
处理方法 | 元素 | 属性值 |
---|---|---|
拉伸元素 | flex元素 | flex-grow: 1; |
填充空白-在终点填充 | flex容器 | justify-content: start; |
填充空白-在起点填充 | flex容器 | justify-content: end; |
填充空白-在两端填充 | flex容器 | justify-content: center; |
填充空白-在元素周围填充 | flex容器 | justify-content: space-betwwen; |
填充空白-在元素周围填充 | flex容器 | justify-content: space-around; |
填充空白-在元素周围填充 | flex容器 | justify-content: space-evenly; |
如果主轴没有排满,剩余空间按比例分配给各个flex元素,权重就是元素的 flex-grow
值。 flex-grow
默认值是0,表示不会为元素分配剩余空间。
如果采用填充空白的方法,需要设置flex容器的 justify-content
属性,取值如下:
justify-content | flex元素排列方式 |
---|---|
start(默认值) | 第一个在行首,紧邻排列。 |
end | 最后一个在行尾,紧邻排列。 |
center | 居中紧邻排列。 |
space-between | 第一个行首,最后一个行尾,均匀排列。 |
space-around | 均匀排列,元素之间距离相同,均是容器与(首尾)元素距离的2倍。 |
space-evenly | 均匀排列,元素之间、容器与(首尾)元素的距离相同。 |
“排不下”有五种处理方法:一是收缩元素适配主轴长度,二是换行,三是溢出,四是截断,五是使用滚动轴。
处理方法 | 元素 | 属性值 |
---|---|---|
收缩元素 | flex元素 | flex-shrink: 1; |
换行 | flex容器 | flex-wrap: wrap; |
溢出 | flex容器 | flex-wrap: nowrap; |
截断 | flex容器 | flex-wrap: nowrap; overflow: hidden; |
滚动轴 | flex容器 | flex-wrap: nowrap; overflow: scroll; |
flex-shrink
和 flex-grow
相对的属性,当主轴空间不足时,元素以 flex-shrink
为比例收缩。区别在于, flex-shrink
默认值是1,即在默认情况下,均匀收缩flex元素以适配主轴长度。 flex-wrap
属性用于控制换行方式,如果主轴排满了,后续元素会在新一行(列)上继续排列。新的一行(列)默认排列在原行(列)的下方(右侧),这个方向叫做交叉轴方向。交叉轴是与主轴垂直且向下或向右的方向。
值 | 说明 |
---|---|
wrap | 换行(列)。新行(列)沿交叉轴方向(下方/右侧)排列。 |
nowrap(默认值) | 不换行(列)。 |
wrap-reverse | 换行(列)。新行(列)沿交叉轴方向反向(上方/左侧)排列。 |
在不换行(列)的情况下,通过控制flex容器的 overflow
属性,可以实现溢出、截断或滚动轴效果。
visible(默认值) | 溢出。显示超出容器尺寸的内容,侵入其他元素的盒模型空间。 |
hidden | 截断。不显示超出容器尺寸的内容。 |
scroll | 滚动条。提供滚动条,拖动时显示超出容器尺寸的内容。 |
讲完了主轴上元素的排列方式,现在介绍元素在交叉轴方向的对齐方式,它由flex容器的 align-items
属性决定。
align-items | 说明 |
---|---|
start(默认值) | 按交叉轴起点对齐 |
end | 按交叉轴终点对齐 |
center | 按交叉轴居中对齐 |
baseline | 按文字基线对齐 |
stretch | 拉伸元素,填充容器高度 |
如果某个flex元素希望拥有独立的对齐方式,可以使用flex元素的 align-self
属性,它会在flex元素中覆盖flex容器的 align-items
属性。两个属性取值是一样的。
flex元素默认按照元素在HTML文档中的顺序排列。调整 order
属性可以修改flex元素顺序,越大越靠后,默认值是0。
为了简化编码,CSS提供了关于flex的缩写。
元素 | 缩写 | 值 | 含义 |
---|---|---|---|
flex元素 | flex: 2; | 单值,无单位数字 | flex-grow |
flex: 30px; | 单值,距离 | flex-basis | |
flex: 1 30px; | 双值 | flex-grow flex-shrink | |
flex: 2 2 10%; | 三值 | flex-grow flex-shrink flex-basis | |
flex容器 | flex-flow: row; | 单值 | flex-direction |
flex-flow: wrap; | 单值 | flex-wrap | |
flex-flow: column wrap; | 双值 | flex-direction flex-wrap |