近期在做移动端的项目过程中,经常听到有人说用弹性盒布局来写比较快,因为我一直用的是传统的百分比布局(好吧,不敢否认我还是喜欢用拿手的,但是不要鄙视我对新技术的热情),因此一直也想抽空学习下弹性盒布局,看看他到底是何方神圣,能够用到哪些场合,还有浏览器兼容性到底怎么样
一、语法
应用flex布局,首先要设定一个flex容器(flex container),它的子元素就自动成为flex容器的成员,称为flex项目(flex item)。
.flex_container{ display:flex; /* 块元素 */ display:inline-flex; /* 行内元素 */ display:-webkit-flex; /* safari */ }
注意:处于flex布局内的成员其clear、float、vertical-align属性将失效
(在此借用阮大神的一张图):
1.设置在父容器上的六大属性
1) flex-direction:决定了主轴的方向
.flex_container { flex-direction: row | row-reverse | column | column-reverse;}
row
(默认值):主轴为水平方向,起点在左端。row-reverse
:主轴为水平方向,起点在右端。column
:主轴为垂直方向,起点在上沿。column-reverse
:主轴为垂直方向,起点在下沿。
2) flex-wrap:决定了项目在轴上一行排列不下时是否换行
.flex_container{ flex-wrap: nowrap | wrap | wrap-reverse; }
- nowrap:默认不换行,所有项目在一行显示
- wrap:一行显示不完则换行显示,第一行在最上面
- wrap-reverse:第一行开始在最下方
3)flex-flow:flex-direction和flex-wrap两属性的简写,默认值为row no-wrap
.flex_container { flex-flow:|| ;}
4)justify-content:定义了项目在主轴上的对齐方式
.flex_container { justify-content: flex-start | flex-end | center | space-between | space-around; }
flex-start
(默认值):左对齐flex-end
:右对齐center
: 居中space-between
:两端对齐,项目之间的间隔都相等。space-around
:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
5)align-items:定义项目在交叉轴上如何对齐
.flex_container{ align-items: flex-start | flex-end | center | baseline | stretch;}
flex-start
:交叉轴的起点对齐。flex-end
:交叉轴的终点对齐。center
:交叉轴的中点对齐。baseline
: 项目的第一行文字的基线对齐。stretch
(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
6)align-content:定义了项目在多根轴线上的对齐方式(如果一根轴线不起作用)
.flex_container { align-content: flex-start | flex-end | center | space-between | space-around | stretch; }
flex-start
:与交叉轴的起点对齐。flex-end
:与交叉轴的终点对齐。center
:与交叉轴的中点对齐。space-between
:与交叉轴两端对齐,轴线之间的间隔平均分布。space-around
:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。stretch
(默认值):轴线占满整个交叉轴。
2.项目的六大属性
1)order:定义了项目的排列顺序,数值越小排列越靠前,默认为0.
2)flex-grow:定义了项目的放大比例,默认为0,即存在剩余空间也不放大
.item { flex-grow:; /* default 0 */ }
注意:如果所有项目的flex-grow:1,则他们将等分剩余空间;如果一个项目的flex-grow
属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。
3)flex-shrink:定义了项目的缩小比例,默认为1,即如果空间不足,将缩小适应空间
.item { flex-shrink:; /* default 1 */}
注意:如果所有项目的flex-shrink
属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink
属性为0,其他项目都为1,则空间不足时,前者不缩小
4)flex-basis:定义在分配剩余空间之前,项目所占据的主轴空间。浏览器根据此特性计算主轴是否有剩余空间,默认值为auto,即项目本来大小
.item { flex-basis:| auto; /* default auto */ }
注意:若项目设为固定宽高,则占据固定空间,如200px||20%
5)flex:flex-grow、flex-shrink、flex-basis三个属性的缩写,默认值为0 1 auto,后两个属性可选
.item { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] }
注意:none代表(0 0 auto), auto代表(1 1 auto)
6)align-self:允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items
属性。默认值为auto
,表示继承父元素的align-items
属性,如果没有父元素,则等同于stretch
。
.item { align-self: auto | flex-start | flex-end | center | baseline | stretch; }
二、布局
了解了flex的基本语法之后,究竟怎样用好这些语法进行布局了。自己为了练习写出了一个非常不好看low逼的导航条,但是基本的语法都用上了
.flex_container{ display: flex; flex-grow:row wrap; justify-content:space-between; width:640px; height:50px; margin:10% auto; background-color:#ccc; li{ display: flex; flex:1; align-items: stretch; justify-content: center; background-color:black; list-style:none; a{ flex:1; text-align: center; line-height: 50px; color:white; text-decoration: none; } } li:last-child{ flex:2; }}
注意:代码并没有做兼容性处理,可以自己写或者用autoprefixer工具来处理
具体详细布局策略移步至阮大神教程:
三、兼容性
浏览器一共支持三个不同版本的语法:
- 新规范:最新版本的语法,即“display:flex”
- 中间版本:2011年非官方规范,即“display:flexbox”
- 老规范:2009年官方规范,即“display:box”
从表中可以看出弹性盒布局在移动端的支持性还是比较好的,不过为了兼容不同的浏览器,建议还是用autoprefixer工具自动补全其不同的前缀。