弹性盒布局是一个用于页面布局的全新CSS3模块功能。弹性盒布局的定义中,它可以自动调整子元素的宽和高,来很好的填充任何显示设备中的可用显示空间,收缩内容防止内容溢出。
和块级元素基于垂直方向布局以及行内元素基于水平方向布局不同,弹性盒布局的算法是方向无关的。
最基本的用法如下:
div {
border:1px solid black;
}
#box1 {
display:flex;
width:120px;
height:120px;
}
<!--flex用法-->
<div id="box1"></div>
只需要将父元素的display属性设置为flex,其所有子元素都会变成弹性伸缩项目。
下面我们分别介绍flex的父元素的属性。
flex-direction
该属性决定子元素排列的方向。
其可以设置的属性值如下:
row | row-reverse | column | column-reverse
分别对应:
row(默认值):主轴在水平方向,起点在左端
row-reverse:主轴在水平方向,起点在右端
column:主轴在垂直方向,起点在上沿
column-reverse:主轴在垂直方向,起点在下沿
实例如下:
<!--flex-direction用法-->
<div id="box2">
<div id="box2-1">1</div>
<div id="box2-2">2</div>
<div id="box2-3">3</div>
</div>
<div id="box3">
<div id="box3-1">1</div>
<div id="box3-2">2</div>
<div id="box3-3">3</div>
</div>
<div id="box4">
<div id="box4-1">1</div>
<div id="box4-2">2</div>
<div id="box4-3">3</div>
</div>
<div id="box5">
<div id="box5-1">1</div>
<div id="box5-2">2</div>
<div id="box5-3">3</div>
</div>
#box2 {
display:flex;
flex-direction:row;/*主轴为水平方向,起点在左端1,2,3*/
}
#box2 div {
width:40px;
height:40px;
border:1px solid black;
}
#box3 {
display:flex;
flex-direction:row-reverse;/*主轴为水平方向,起点在右端3,2,1*/
}
#box3 div {
width:40px;
height:40px;
border:1px solid black;
}
#box4 {
display:flex;
flex-direction:column;/*主轴为垂直方向,起点在上端1,2,3*/
}
#box4 div {
width:40px;
height:40px;
border:1px solid black;
}
#box5 {
display:flex;
flex-direction:column-reverse;/*主轴为垂直方向,起点在下端3,2,1*/
}
#box5 div {
width:40px;
height:40px;
border:1px solid black;
}
效果如下:
flex-wrap
该属性决定如果一行放不下后,该如何换行。
其可以设置的属性值如下:
nowrap | wrap | wrap-reverse
分别对应:
nowrap(默认):不换行
wrap:换行,第一行在上方
wrap-reverse:换行,第一行在下方
实例如下:
<!--flex-wrap用法-->
<div id="clear"></div>
<div id="box6">
<div id="box6-1">1</div>
<div id="box6-2">2</div>
<div id="box6-3">3</div>
<div id="box6-4">4</div>
<div id="box6-5">5</div>
<div id="box6-6">6</div>
</div>
<div id="clear"></div>
<div id="box7">
<div id="box7-1">1</div>
<div id="box7-2">2</div>
<div id="box7-3">3</div>
<div id="box7-4">4</div>
<div id="box7-5">5</div>
<div id="box7-6">6</div>
</div>
<div id="clear"></div>
<div id="box8">
<div id="box8-1">1</div>
<div id="box8-2">2</div>
<div id="box8-3">3</div>
<div id="box8-4">4</div>
<div id="box8-5">5</div>
<div id="box8-6">6</div>
</div>
#box6 {
display:flex;
flex-wrap:nowrap;/*不换行,即使超出范围*/
}
#box6 div {
width:300px;
height:40px;
border:1px solid black;
}
#box7 {
display:flex;
flex-wrap:wrap;/*换行,第一行是上方*/
}
#box7 div {
width:300px;
height:40px;
border:1px solid black;
}
#box8 {
display:flex;
flex-wrap:wrap-reverse;/*换行,第一行在下方*/
}
#box8 div {
width:300px;
height:40px;
border:1px solid black;
}
效果如下:
justify-content
该属性定义了子元素在主轴上的对齐方式,非常关键。
取值范围:
flex-start | flex-end | center | space-between | space-around
分别对应:
flex-start(默认值):左对齐
flex-end:右对齐
center: 居中
space-between:两端对齐,项目之间的间隔都相等。
space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
实例如下:
<!--justify-content用法-->
<div id="clear"></div>
<div id="box9">
<div id="box9-1"></div>
<div id="box9-2"></div>
<div id="box9-3"></div>
</div>
<div id="box10">
<div id="box10-1"></div>
<div id="box10-2"></div>
<div id="box10-3"></div>
</div>
<div id="box11">
<div id="box11-1"></div>
<div id="box11-2"></div>
<div id="box11-3"></div>
</div>
<div id="box12">
<div id="box12-1"></div>
<div id="box12-2"></div>
<div id="box12-3"></div>
</div>
<div id="box13">
<div id="box13-1"></div>
<div id="box13-2"></div>
<div id="box13-3"></div>
</div>
#box9 {
display:flex;
justify-content:flex-start;/*左对齐*/
background-color:blue;
}
#box9 div {
background-color:red;
margin:20px;
width:40px;
height:40px;
border:1px solid black;
}
#box10 {
display:flex;
justify-content:flex-end;/*右对齐*/
background-color:blue;
}
#box10 div {
background-color:red;
margin:20px;
width:40px;
height:40px;
border:1px solid black;
}
#box11 {
display:flex;
justify-content:center;/*居中*/
background-color:blue;
}
#box11 div {
background-color:red;
margin:20px;
width:40px;
height:40px;
border:1px solid black;
}
#box12 {
display:flex;
justify-content:space-between;/*两端对齐,项目之间的间隔都相等*/
background-color:blue;
}
#box12 div {
background-color:red;
margin:20px;
width:40px;
height:40px;
border:1px solid black;
}
#box13 {
display:flex;
justify-content:space-around;/*每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍*/
background-color:blue;
}
#box13 div {
background-color:red;
margin:20px;
width:40px;
height:40px;
border:1px solid black;
}
效果如下:
align-items
该属性定义子元素在垂直方向如何对齐
取值范围:
flex-start | flex-end | center | baseline | stretch
分别对应:
flex-start:垂直方向的起点对齐。
flex-end:垂直方向的终点对齐。
center:垂直方向的中点对齐。
baseline: 第一行文字的基线对齐。
stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
实例如下:
<!--align-items用法-->
<div id="clear"></div>
<div id="box14">
<div class="items1" id="box14-1"></div>
<div class="items2" id="box14-2"></div>
<div class="items3" id="box14-3"></div>
</div>
<div id="clear"></div>
<div id="box15">
<div class="items1" id="box15-1"></div>
<div class="items2" id="box15-2"></div>
<div class="items3" id="box15-3"></div>
</div>
<div id="clear"></div>
<div id="box16">
<div class="items1" id="box16-1"></div>
<div class="items2" id="box16-2"></div>
<div class="items3" id="box16-3"></div>
</div>
<div id="clear"></div>
<div id="box17">
<div class="items1" id="box17-1">1</div>
<div class="items2" id="box17-2">2</div>
<div class="items3" id="box17-3">3</div>
</div>
<div id="clear"></div>
<div id="box18">
<div class="items1" id="box18-1"></div>
<div class="items2" id="box18-2"></div>
<div class="items3" id="box18-3"></div>
</div>
.items1 {
background-color:red;
width:40px;
height:40px;
border:1px solid black;
}
.items2 {
background-color:red;
width:40px;
height:140px;
border:1px solid black;
}
.items3 {
background-color:red;
width:40px;
height:80px;
border:1px solid black;
}
#box14 {
display:flex;
align-items:flex-start;/*垂直方向的起点对齐*/
background-color:blue;
}
#box15 {
display:flex;
align-items:flex-end;/*垂直方向的终点对齐*/
background-color:blue;
}
#box16 {
display:flex;
align-items:center;/*垂直方向的中点对齐*/
background-color:blue;
}
#box17 {
display:flex;
align-items:baseline;/*第一行文字的基线对齐*/
background-color:blue;
}
#box18 {
display:flex;
align-items:stretch;/*如果子元素未设置高度或设为auto,将占满整个容器的高度*/
background-color:blue;
}
效果如下:
下面我们来介绍flex的子元素的属性。
order
该属性定义子元素的排列属性,数值越小,排列越靠前,默认为0.
实例如下:
<!--order用法-->
<div id="clear">order用法</div>
<div id="box19">
<div id="box19-1">-3</div>
<div id="box19-2">5</div>
<div id="box19-3">0(默认)</div>
</div>
#box19 {
display:flex;
background-color:blue;
}
#box19 div {
background-color:red;
width:40px;
height:40px;
border:1px solid black;
}
#box19-1 {
order:-3;
}
#box19-2 {
order:5;
}
效果如下:
flex
该属性定义子元素的比例。
实例如下:
<!--flex用法-->
<div id="clear">flex用法</div>
<div id="box20">
<div id="box20-1"></div>
<div id="box20-2"></div>
<div id="box20-3"></div>
</div>
#box20 {
display:flex;
background-color:blue;
}
#box20 div {
background-color:red;
width:40px;
height:40px;
border:1px solid black;
}
#box20-1 {
flex:1;
}
#box20-2 {
flex:2;
}
#box20-3 {
flex:1;
}
效果如下:
这里的flex还可以和固定宽度配合使用得到更加复杂的布局。
整个flex布局demo地址:demo