# 弹性布局 flex

# 特性

  • 任何容器都可以使用 flex 布局

  • 行内元素也可以使用 flex

# 概念

  • 使用 Flex 布局的元素 称为 Flex 容器,它所有的成员称为 Flex 项目(item)

# 容器属性

  • flex-direction 决定主轴的方向 即 项目 的排列方向
.box {
  flex-direction: row | row-reverse | column | column-reverse;
}
1
2
3

TIP

row(默认值):主轴为水平方向,起点在左端。
row-reverse:主轴为水平方向,起点在右端。
column:主轴为垂直方向,起点在上沿。
column-reverse:主轴为垂直方向,起点在下沿。

  • flex-wrap 默认 项目 排在一条轴线上,该属性定义如果一条轴线排不下如何换行
.box{
  flex-wrap: nowrap | wrap | wrap-reverse;
}
1
2
3
  • flex-flow flex-direction 属性和 flex-wrap 属性的简写形式
.box {
  flex-flow: <flex-direction> || <flex-wrap>;
}
1
2
3
  • justify-content 项目在主轴上的对其方式
.box {
  justify-content: flex-start | flex-end | center | space-between | space-around;
}
1
2
3
  • align-items 项目在交叉轴上的对齐方式
.box {
  align-items: flex-start | flex-end | center | baseline | stretch;
}
1
2
3
  • align-content 定义多条轴线的对齐方式,只有一条轴线则不起作用
.box {
  align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
1
2
3

# 项目属性

TIP

order
flex-grow
flex-shrink
flex-basis
flex
align-self

  • order 定义项目排列顺序 数值越小 排列越靠前 默认为 0
<div class='flex'>
  <div class='box mr20' style='order: 1'>111</div>
  <div class='box mr20' style='order: 0'>222</div>
</div>
1
2
3
4
111
222
  • flex-grow 定义项目的放大比例 默认 0 (即使有剩余空间 也不放大)
.item {
  flex-grow: <number>; /* default 0 */
}
1
2
3

TIP

如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。

<div class='flex'>
  <div class='box mr20 flex-grow-1'>111</div>
  <div class='box mr20 flex-grow-2'>222</div>
  <div class='box flex-grow-1'>111</div>
</div>
1
2
3
4
5
111
222
111
  • flex-shrink 定义 项目 的缩小比例 默认为1,即如果空间不足,该项目将缩小
.item {
  flex-shrink: <number>; /* default 1 */
}
1
2
3

TIP

如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。

  • flex-basis 定义在分配多余空间之前 项目占据的主轴空间(main-size 宽高)
.item {
  flex-basis: <length> | auto; /* default auto */
}
1
2
3

TIP

它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。

  • flexflex-grow flex-shrink flex-basis 的缩写,默认为 0 1 auto

TIP

该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)

  • align-self 允许单个项目与其他项目不一样的对齐方式,可覆盖 align-items 属性
.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
1
2
3
<div class='flex align-item-center'>
  <div class='box mr20 '>111</div>
  <div class='box mr20 align-self-end'>222</div>
  <div class='box'>333</div>
</div>
1
2
3
4
5
111
222
333