布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。
2009年,W3C提出了一种新的方案—-Flex布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。
1. flex布局是什么?
Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。CSS3中为display新增了两个属性值,分别为flex、inline-flex。
- 任何一个容器都可以指定为Flex布局。
.box{
display: flex;
}
- 行内元素也可以使用Flex布局。
.box{
display: inline-flex;
}
- Webkit内核的浏览器,必须加上-webkit前缀。
.box{
display: -webkit-flex; /* Safari */
display: flex;
}
2. 容器的属性
| 属性值 | 描述 |
|---|---|
| flex-direction | 决定主轴的方向(即项目的排列方向) |
| flex-wrap | 定义如果一条轴线排不下,如何换行 |
| flex-flow | flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap |
| justify-content | 定义了项目在主轴上的对齐方式 |
| align-items | 定义项目在交叉轴上如何对齐 |
| align-content | 定义了多根轴线的对齐方式,如果项目只有一根轴线,该属性不起作用 |
容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。
项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。
2.1 flex-direction属性
| 属性值 | 描述 |
|---|---|
| row(默认值) | 主轴为水平方向,起点在左端 |
| row-reverse | 主轴为水平方向,起点在右端 |
| column | 主轴为垂直方向,起点在上沿 |
| column-reverse | 主轴为垂直方向,起点在下沿 |
2.2 flex-wrap属性
| 属性值 | 描述 |
|---|---|
| nowrap(默认) | 换行,等比例缩小 |
| wrap | 换行,第一行在上方 |
| wrap-reverse | 换行,第一行在下方 |
2.3 justify-content属性
| 属性值 | 描述 |
|---|---|
| flex-start | 向主轴开始位置对齐 |
| flex-end | 向主轴结束位置对齐 |
| center | 主轴居中对齐 |
| space-between | 等间距对齐,两端不留空 |
| space-around | 等间距对齐,两端留空,每个元素左间距与右间距大小相等 |
2.4 align-items属性
| 属性值 | 描述 |
|---|---|
| flex-start | 向垂直轴开始位置对齐 |
| flex-end | 向垂直轴结束位置对齐 |
| center | 垂直轴居中对齐 |
| baseline | 项目的第一行文字的基线对齐 |
| stretch(默认值) | 如果项目未设置高度或设为auto,将占满整个容器的高度 |
2.5 align-content属性
| 属性值 | 描述 |
|---|---|
| flex-start | 向主轴开始位置对齐 |
| flex-end | 向主轴结束位置对齐 |
| center | 主轴居中对齐 |
| space-between | 等间距对齐,两端不留空 |
| space-around | 等间距对齐,两端留空,每个元素上间距与下间距大小相等 |
| stretch(默认值) | 轴线占满整个交叉轴 |
3. 子元素属性
| 属性 | 描述 |
|---|---|
| order | 定义项目的排列顺序。数值越小,排列越靠前,默认为0 |
| flex-grow | 定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大 |
| flex-shrink | 定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小 |
| flex-basis | 定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小 |
| flex | flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto,后两个属性可选 |
| align-self | 允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch |
** 例如: order属性可用于设置子元素的位置,order的值越小排在越前面,默认为0,可以设置负值。 **
//设置第三个子元素的order为-1
.box-item3 {
background: green;
order:-1;
}
4. 总结
以前盒子的布局都是使用position、float、display啥啥的来布局,弹性布局(问号脸)?其实它相对来说是很方便的一种布局,当然了,需要完全理解弹性布局的内涵才能很好的应用它。此文到处摘抄网上的文章,如有侵权,请联系删除嗷~