1. flex布局是什么?
flex 是 flexible box 的缩写, 意为”弹性布局”, 作用是为盒状模型提供最大的灵活性.
任何一个容器都可以设置为flex布局: .container{ display: flex; }
行内元素(inline)也可以使用flex布局: .container { display: inline-flex; }
2. 基本概念
container: 采用 Flex 布局的元素, 称为 Flex 容器(flex container), 简称”容器”.
item: 容器的所有子元素自动成为容器成员, 称为 Flex 项目(flex item), 简称”项目”. items 默认沿主轴排列。
容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis), 即横轴和纵轴.
3. container的属性
container的属性有6个, 即
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
3.1 flex-direction
(1) 作用
改变items流动方向(也是主轴的流动方向).
(2) 语法
(3) 取值.container{
flex-direction: row | row-reverse | column | column-reverse ;
}
row (默认值) : 主轴为水平方向, 起点在左端.
row-reverse: 主轴为水平方向, 起点在右端.
column: 主轴为垂直方向, 起点在上端.
column-reverse: 主轴为垂直方向, 起点在下端.
3.2 flex-wrap
(1) 作用
指定换行的方式.
默认情况下, item都排在一条线(又称”轴线”)上. flex-wrap属性用于指定, 当一条轴线排不下时, 如何换行.
(2) 语法
.container{
flex-wrap: nowrap | wrap | wrap-reverse ;
}
(3) 取值
- nowrap (默认):不换行, 即所有item都在一行上.
- wrap:换行, 第一行在上方.
- wrap-reverse:换行, 第一行在下方.
3.3 flex-flow
flex-flow属性是flex-direction属性和flex-wrap属性的简写形式, 默认值为row nowrap.
(1) 语法
.container {
flex-flow: <flex-direction> || <flex-wrap>;
}
(2) 举例
.container {
flex-flow: column wrap;
}
3.4 justify-content
(1) 作用
设置item在主轴上的对齐方式. (注: 默认主轴是横轴, 除非改变了flex-direction方向)
(2) 语法
.container{
justify-content: flex-start| flex-end| center| space-between| space-around| space-evenly
}
(3) 取值
具体对齐方式与轴的方向有关. 默认主轴为横轴, 其方向为从左至右.
flex-start(默认值): 从主轴行首开始排列;
flex-end: 从主轴行尾开始排列;
center: 居中;
space-between: 两端对齐, item之间的间距都相等.
space-around: 每个item两侧的间距相等. 所以, item之间的间距比item与边框的间距大一倍.
space-evenly: 间距(space)均匀地分布, 即
相邻item的间距 = 主轴起始位置到第一个item的间距 = 主轴结束位置到最后一个item的间距.
3.5 align-items
(1) 作用
设置item在交叉轴(cross axis)上的对齐方式. 默认交叉轴是纵轴.
(2) 语法
.container{
align-items: flex-start | flex-end | center | baseline | stretch;
}
(3) 取值
flex-start: 交叉轴的起点对齐.
flex-end: 交叉轴的终点对齐.
center: 交叉轴的中点对齐.
baseline: item的第一行文字的基线对齐.
stretch(默认值): 如果item未设置高度或设为auto,item将被拉伸到与容器相同的高度.
3.6 align-content
align-content属性很少用到.
(1) 作用:
设置多根轴线(轴线是指item所排列的线)的对齐方式。如果item只有一根轴线(即container只有一行items),
那么该属性不起作用。
(2) 语法
.container {
align-content: flex-start| flex-end| center| space-between| space-around| stretch;
}
(3) 取值
flex-start: 与交叉轴的起点对齐.
flex-end: 与交叉轴的终点对齐.
center: 与交叉轴的中点对齐.
space-between: 与交叉轴两端对齐,轴线之间的间隔平均分布.
space-around: 每根轴线两侧的间隔都相等. 所以, 轴线之间的间隔比轴线与边框的间隔大一倍.
stretch(默认值): 轴线占满整个交叉轴.
4. item的属性
item的属性有6个, 即
- order
- flex-grow
- flex-shrink
- flex-basis
- flex
- align-self
4.1 order
(1) 作用
设置item的排列顺序. 数值越小, 排列越靠前.
默认为0, 即不重新排序.
数值只能取整数, 可以是正整数, 也可以是负整数.
(2) 语法
(3) 举例.item { order: <integer>; }
.item {
order: 5;
}
4.2 flex-grow
(1) 作用
设置item的放大比例. 默认为0, 即如果存在剩余空间, 也不放大. 负数无效.
(2) 语法
.item {
flex-grow: <number>; /* default 0 */
}
(3) 举例
如果所有item都将flex-grow的值设置为1, 则container中的剩余空间将平均分配给所有item;
如果其中一个item将flex-grow的值设置为2, 其他item都设置为1, 则前者占据的剩余空间将是其他item的2倍.
4.3 flex-shrink
(1) 作用
设置item的缩小比例. 默认值是1, 即如果空间不足, 该item将缩小. 负数无效.
(2) 语法
.item {
flex-shrink: <number>; /* default 1 */
}
(3) 举例
如果所有item的flex-shrink属性都为1, 当空间不足时, 都将等比例缩小;
如果一个item的flex-shrink属性为0, 其他item都为1, 则空间不足时, 前者不缩小.
4.4 flex-basis
(1) 作用
设置基准宽度. 默认值为auto.
(2) 语法
.item{
flex-basis: <length> | auto; /* default auto */
}
(3) 取值
它可以设为跟width或height属性一样的值(比如100px, 20%等),则item将占据固定空间。
4.5 flex
flex属性是flex-grow, flex-shrink, flex-basis的简写, 默认值为 0 1 auto. 后两个属性可选.
(1) 语法
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'> || <'flex-basis'> ]
}
(2) 快捷值
该属性有两个快捷值: auto (1 1 auto) 和 none (0 0 auto).
4.6 align-selff
(1) 作用
该属性允许单个item有与其他item不一样的对齐方式, 可覆盖align-items属性.
默认值为auto, 表示继承父元素的align-items属性, 如果没有父元素, 则等同于stretch.
(2) 语法
.item{
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
注意: 该属性是items的属性, 不是container的属性.
5. 常用的flex属性
常用的flex属性代码如下:
- display: flex;
- flex-direction: row / column;
- flex-wrap: wrap;
- justify-content: center / space-between;
- align-items: center;
6.flex实践
6.1 不同布局
- 用flex做两栏布局;
- 用flex做三栏布局;
- 用flex做四栏布局;
- 用flex做平均布局;
-
6.2 经验
不要把width和height写死, 除非特殊说明;
- 使用min-width / max-width / min-height / max-height;
- flex和margin-xxx: auto 配合使用有意外效果;
说明:
- 写死
width: 200px;
- 不写死
width: 25%
max-width:1024px
width: 30vw
min-width:80%
特点: 不使用px, 或者加min, max前缀.