布局的传统解决方案,基于盒状模型,依赖display属性(如display: inline-block),position属性,float属性以及margin,padding,top等属性。它对于那些特殊布局非常不方便,比如垂直居中就不容易实现。
2009年,W3C 提出了一种新的方案——Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。
什么是flex布局
任何一个容器都可以指定为flex布局。
1 | .box{ |
Webkit 内核的浏览器,必须加上-webkit前缀。
1 | .box{ |
注意,设为 Flex 布局以后,子元素的float、clear和vertical-align属性将失效。
理论基础
采用 Flex 布局的元素,称为 Flex 容器(flex container),简称”容器”。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称”项目”。

这两个轴是之后flex容器的justify-content,align-items属性的基础。
flex容器的属性
一下六个属性设置在容器上。
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
flex-direction
flex-direction属性决定主轴的方向(即项目的排列方向)。比如,你要指定项目在水平方向上排列,那么main-axis就是水平的,且项目从左到右依次排列,这时flex-direction: row。
1 | .box{ |
- row: main-aix为水平方向,起点在左端
- row-reverse: main-axis为水平方向,起点在右端
- column: main-axis为垂直方向,起点在上面
- column-reverse: main-axis为垂直方向,起点在下面
flex-wrap
默认情况下,项目都排在一条线(又称”轴线”)上,因为flex-wrap默认为nowrap。
1 | .box{ |
(1) nowrap(default):不换行。
举个例子:比如容器宽度为300px,容器中有6个宽度为60px的项目,nowrap情况下,项目会强行等分容器宽度从而不换行,那么项目实际宽度也就只有50px了,而非我们自己设置的60px。
(2) wrap: 换行,第一行在上方

(3) wrap-reverse: 换行,第一行在下方

flex-flow
flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,可以不用考虑
justify-content
几个项目排列在main-axis上,但是它们之间的间距该如何设置呢?要设置justify-content属性。
justify-content属性定义了项目在主轴上的对齐方式。
1 | .box { |

- flex-start(default): 左对齐
- flex-end: 右对齐
- center: 居中
- space-between: 两端对齐,项目之间的间隔都相等。
- space-around: 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
align-items
确定了几个项目在main-axis上的对齐之后,它们在cross-axis上应该在什么位置呢?设置align-items属性。
align-items属性定义项目在交叉轴上如何对齐。
1 | .box { |

- flex-start: 在交叉轴的起点对齐
- flex-end: 在交叉轴的终点对齐
- center: 在交叉轴的中心点对齐
- baseline: 项目中的第一行文字的基线对齐
- stretch(default): 如果项目未设置高度或为auto,将占满整个容器的高度;
align-content
align-content属性定义了多行项目如何在cross-axis上划分屏幕空间。
1 | .box { |

stretch: (下面是的黑色div是固定大小的,里面的青色div也是固定大小的,采用stretch)

项目的属性
- order
- flex-grow
- flex-shrink
- flex-basis
- flex
- align-self
order
order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。

flex-grow
当一行项目在flex布局中并没有占据完空间的时候,flex-grow定义了项目该如何变大。
flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。当项目item2的flex-grow=2,item1的flex-grow=1,则item2增大的长度是item1增大的长度的2倍。

例如上图,前三个项目的定义的width分别为100,200,200,它们的margin都是10,黑色div的width是600,则还剩下40px的空间。由于第二个项目的flex-grow=1,第三个项目的flex-grow=2,则第二个项目增大13,第四个项目增大26。
flex-shrink
同flex-grow相似。
align-self
align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

该属性可能取6个值,除了auto,其他都与align-items属性完全一致。
/1.jpg)
/1.png)












































