css弹性布局(display:flex)
display:flex相关属性:
容器属性:
1.flex-direction:控制主轴是哪一根,控制主轴的方向。
属性值:
row: 主轴是从左往右的x轴.
row-reverse: 主轴是从右往左的x轴.
column: 主轴是从上往下的y轴.
column-reverse: 主轴是从下往上的y轴.
2.富裕空间管理:只决定富裕空间的位置,不会给项目分配空间。
(1)justify-content:管理主轴富裕空间。
属性值:
flex-start: 富裕空间在主轴的正方向.
flex-end: 富裕空间在主轴的反方向.
center: 富裕空间在主轴两边.
space-between: 富裕空间在每个项目之间.
space-around: 富裕空间在项目两边和项目之间.
(2)align-items:管理侧轴富裕空间。
属性值:
flex-start: 富裕空间在侧轴的正方向.
flex-end: 富裕空间在侧轴的反方向.
center: 富裕空间在侧轴两边.
baseline: 项目基线对齐.
stretch: 等高布局(项目没有高度).
3.flex-wrap:控制的是侧轴的方向(项目总长度大于容器长度的时候,项目的宽度会自行收缩不换行,flex-wrap可以设置他进行换行以及侧轴方向)。
属性值:
nowrap: 不换行.
wrap: 侧轴方向由上而下(flex-shrink失效).
wrap-reverse: 侧轴方向由下而上(flex-shrink失效).
侧轴富裕空间的管理:
单行单列(不换行)时:
align-content无效.
多行多列(换行)时:
align-items无效.
注意:align-self 优先级高最高。
4.align-content:多行/列时侧轴富裕空间的管理(把多行/列看成一个整体)。
属性值:
flex-start: 富裕空间在侧轴的正方向.
flex-end: 富裕空间在主侧轴的反方向.
center: 富裕空间在侧轴两边.
space-between: 富裕空间在每个项目之间.
space-around: 富裕空间在项目两边和项目之间.
注意:要设置flex-wrap换行(属性值不为nowrap),align-content的效果才会生效。
5.flex-flow:flex-direction和flex-wrap的简写属性(本质上控制了主轴和侧轴分别是哪一根,以及它们的方向)。
属性值:
参数1(flex-direction):
row: 主轴是从左往右的x轴.
row-reverse: 主轴是从右往左的x轴.
column: 主轴是从上往下的y轴.
column-reverse: 主轴是从下往上的y轴.
参数2(flex-wrap):
nowrap: 不换行.
wrap: 侧轴方向由上而下(flex-shrink失效).
wrap-reverse: 侧轴方向由下而上(flex-shrink失效).
项目属性:
1.order:控制项目的排列顺序(默认值为0)。
属性值:number.
注意:如果几个项目的order值相等,则根据元素先后顺序依次排列。
2.align-self:项目自身侧轴富裕空间的管理。
属性值:
flex-start: 富裕空间在侧轴的正方向.
flex-end: 富裕空间在侧轴的反方向.
center: 富裕空间在侧轴两边.
baseline: 项目与容器基线对齐.
stretch: 项目与容器等高布局(项目没有高度).
3.flex-basis:伸缩规则计算的基准值(默认值auto,拿width或height的值)。
4.flex-grow:弹性空间管理(弹性因子,默认值为0)。
属性值:number.
注意:容器大小大于项目大小总和时该属性才生效。
计算规则:
(1)可用空间 = (容器大小 - 所有相邻项目flex-basis的总和)。
var a = 容器大小 - flex-basis和.
(2)可扩展空间 = (可用空间 / 所有相邻项目flex-grow的总和)。
var b = a / flex-grow和.
(3)每项扩展空间的计算 = (可扩展空间 * 每项flex-grow值)。
var c = b * flex-grow.
(4)每项伸缩后大小 = (伸缩基准值flex-basis + 每项扩展空间)。
var d = flex-basis + c.
5.flex-shrink:收缩因子(默认值为1)。
属性值:number.
注意:容器大小小于项目大小总和时该属性才生效,并且元素不能换行,否则没有效果。
计算规则:
(1)计算收缩因子与基准值乘的总和:
var a = 每一项flex-shrink * flex-basis之和.
(2)计算收缩因数:收缩因数 =(项目的收缩因子 * 项目基准值)/ 第一步计算总和:
var b = (flex-shrink * flex-basis)/a.
(3)每项移除空间的计算:移除空间 = 项目收缩因数 x 溢出的空间(容器大小-项目大小总和)
var c = b * 溢出的空间.
(4)每项伸缩后大小的计算:每项伸缩后大小 = 项目大小 - 移除空间。
var d = flex-basis - c.
6.flex:简写属性。
flex属性是flex-grow,flex-shrink,flex-basis的简写,对应的默认值分别为0,1,auto。
演示模板HTML代码:
<div id="box">
<div class="inner">1</div>
<div class="inner">2</div>
<div class="inner">3</div>
<div class="inner">4</div>
<div class="inner">5</div>
</div>
css代码:
*{
margin:0;
padding:0;
}
#box{
width:400px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
}
.inner{
width:50px;
height:50px;
background:pink;
text-align:center;
line-height:50px;
}
页面效果:
容器属性
1.flex-direction:控制主轴是哪一根,控制主轴的方向
flex-direction:row
#box{
width:400px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row
}
页面效果:
flex-direction:row-reverse
页面效果:
flex-direction:column
页面效果:
flex-direction:column-reverse
页面效果:
2.justify-content:管理主轴富裕空间
justify-content:flex-start
#box{
width:400px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:flex-start
}
页面效果:
justify-content:flex-end
页面效果:
justify-content:center
页面效果:
justify-content:space-between
页面效果:
justify-content:space-around
页面效果:
3.align-items:管理侧轴富裕空间
align-items:flex-start
#box{
width:400px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:flex-start;
align-items:flex-start
}
页面效果:
align-items:flex-end
页面效果:
align-items:center
页面效果:
align-items:baseline
#box{
width:400px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:flex-start;
align-items:baseline
}
#box > .inner:nth-child(2){
line-height:100px
}
页面效果:
align-items:stretch
#box{
width:400px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:flex-start;
align-items:stretch
}
/* #box > .inner:nth-child(2){
line-height:100px
} */
.inner{
width:50px;
/* height:50px; */
background:pink;
text-align:center;
line-height:50px;
}
页面效果:
提醒:只要能准确分辨主轴,侧轴和它们的方向,就能更快的设置富裕空间的位置。
4.flex-wrap:控制的是侧轴的方向
#box{
width:100px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:flex-start;
align-items:flex-start
}
.inner{
width:50px;
height:50px;
background:pink;
text-align:center;
line-height:50px;
}
当我们把容器的宽度调成100px(小于项目的总宽度)的时候。
页面效果:
每个项目的宽度会自动收缩。
设置flex-wrap:nowrap的效果跟着一样。
flex-wrap:wrap
#box{
width:100px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:flex-start;
align-items:flex-start;
flex-wrap:wrap
}
页面效果:
flex-wrap:wrap-reverse
页面效果:
5.align-content:多行/列时侧轴富裕空间的管理(把多行/列看成一个整体)
注意:要设置flex-wrap换行(属性值不为nowrap),align-content的效果才会生效。
属性值更justify-content的属性值一样。
align-content:flex-start
#box{
width:100px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:flex-start;
align-items:flex-start;
flex-wrap:wrap;
align-content:flex-start
}
.inner{
width:50px;
height:50px;
background:pink;
text-align:center;
line-height:50px;
}
页面效果:
align-content:flex-end
页面效果:
align-content:center
页面效果:
align-content:space-between
页面效果:
align-content:space-around
页面效果:
6.flex-flow:flex-direction和flex-wrap的简写属性(本质上控制了主轴和侧轴分别是哪一根,以及它们的方向)
flex-flow一共两个参数,参数1代表flex-direction,参数2代表flex-wrap,只写一个代表只设置主轴。
#box{
width:100px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:flex-start;
align-items:flex-start;
flex-wrap:wrap;
align-content:space-around
}
这段样式的效果是:
我们用flex-flow设置一下:
#box{
width:100px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
/* flex-direction:row; */
justify-content:flex-start;
align-items:flex-start;
/* flex-wrap:wrap; */
align-content:space-around;
flex-flow:row wrap
}
页面效果:
可以看见效果跟刚才是一样的。
我们把flex-flow:row wrap第二个参数改成wrap-reverse看看:
可以看见现在侧轴的方向是从下到上了。
项目属性
1.order:控制项目的排列顺序(默认值为0)
注意:如果几个项目的order值相等,则根据元素先后顺序依次排列。
#box{
width:400px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
}
.inner{
width:50px;
height:50px;
background:pink;
text-align:center;
line-height:50px;
order:1;
}
页面效果:
因为现在每个项目的order都是1,排列顺序是按照元素的先后顺序来的,如果改成这样:
#box > .inner:nth-child(1){
order:2;
}
#box > .inner:nth-child(2){
order:5;
}
#box > .inner:nth-child(3){
order:1;
}
#box > .inner:nth-child(4){
order:3;
}
#box > .inner:nth-child(5){
order:4;
}
页面效果:
可以看见这次项目的排列顺序是根据order的值来进行排列的。
2.align-self:项目自身侧轴富裕空间的管理
justify-content、align-items、align-content都是对所有项目进行富裕空间管理的,而align-self可以对自身进行富裕空间管理,下面让我们一起来看一下。
align-self:flex-start
#box{
width:400px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:center;
align-items:center;
}
.inner{
width:50px;
height:50px;
background:pink;
text-align:center;
line-height:50px;
}
#box > .inner:nth-child(2){
align-self:flex-start
}
页面效果:
align-self:flex-end
页面效果:
align-self:center
页面效果:
align-self:baseline
页面效果:
align-self:stretch
去掉项目的高度才有效果。
.inner{
width:50px;
/* height:50px; */
background:pink;
text-align:center;
line-height:50px;
}
页面效果:
3.flex-basis:伸缩规则计算的基准值(默认值auto,拿width或height的值)
flex-basis可以设置项目自身的大小(以主轴为准)。
#box{
width:400px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:center;
align-items:center;
}
.inner{
width:50px;
height:50px;
background:pink;
text-align:center;
line-height:50px;
}
#box > .inner:nth-child(2){
flex-basis:100px
}
页面效果:
可以看见只有2号项目设置了flex-basis,宽度变成了100,我们把主轴变成y轴试试:
#box{
width:400px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:column;
justify-content:center;
align-items:center;
}
页面效果:
4.flex-grow:弹性空间管理(弹性因子,默认值为0)
注意:容器大小大于项目大小总和时该属性才生效。
没设置flex-grow之前:
#box{
width:400px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:flex-start;
align-items:flex-start;
}
.inner{
width:50px;
height:50px;
background:pink;
text-align:center;
line-height:50px;
}
页面效果:
设置flex-grow:1
.inner{
width:50px;
height:50px;
background:pink;
text-align:center;
line-height:50px;
flex-grow:1
}
页面效果:
可以看见每个项目的宽度都变成了80px,根据开头的计算规则我们可以算出最后的结果:
(1)可用空间 = (容器大小 - 所有相邻项目flex-basis的总和)。
150 = 400 - 50*5.
(2)可扩展空间 = (可用空间 / 所有相邻项目flex-grow的总和)。
30 = 150 / 5.
(3)每项扩展空间的计算 = (可扩展空间 * 每项flex-grow值)。
30 = 30 * 1.
(4)每项伸缩后大小 = (伸缩基准值flex-basis + 每项扩展空间)。
80 = 50 + 30.
这个比较简单,我们把2号项目的flex-basis设置成100px,3号项目的flex-grow设置为3,再来计算一下看看是否正确:
#box{
width:400px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:flex-start;
align-items:flex-start;
}
.inner{
width:50px;
height:50px;
background:pink;
text-align:center;
line-height:50px;
flex-grow:1
}
#box > .inner:nth-child(2){
flex-basis:100px;
}
#box > .inner:nth-child(3){
flex-grow:3;
}
首先我们可以知道1、4、5项目的大小一样,2号项目是一个大小,3号项目又是另一个大小:
(1)可用空间 = (容器大小 - 所有相邻项目flex-basis的总和)。
100 = 400 - 100 + 50*4.
(2)可扩展空间 = (可用空间 / 所有相邻项目flex-grow的总和)。
可扩展空间 = 100 / 7(1,2,4,5的flex-grow为1,3的flex-grow为3,相加为7)
(3)每项扩展空间的计算 = (可扩展空间 * 每项flex-grow值)。
1,4,5项目 = (100 / 7) * 1
2项目 = (100 / 7) * 1
3项目 = (100 / 7) * 3
(4)每项伸缩后大小 = (伸缩基准值flex-basis + 每项扩展空间)。
1,4,5项目 = 50 + (100 / 7) * 1 四舍五入为:64.28
2项目 = 100 + (100 / 7) * 1 四舍五入为:114.28
3项目 = 50 + (100 / 7) * 3 四舍五入为:92.86
我们来看下效果是不是这样:
可以看见计算出来的结果都是对的。
5.flex-shrink:收缩因子(默认值为1)
注意:容器大小小于项目大小总和时该属性才生效,并且元素不能换行,否则没有效果。
#box{
width:200px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:flex-start;
align-items:flex-start;
}
.inner{
width:50px;
height:50px;
background:pink;
text-align:center;
line-height:50px;
flex-shrink:1
}
页面效果:
可以看见每个项目的宽度由原来的50px变成了40px,根据开头的计算规则我们可以算出最后的结果:
(1)计算收缩因子与基准值乘的总和:
250 = 1 * 50 * 5
(2)计算收缩因数:收缩因数 =(项目的收缩因子 * 项目基准值)/ 第一步计算总和:
0.2 = 1 * 50 / 250
(3)每项移除空间的计算:移除空间 = 项目收缩因数 x 溢出的空间(项目大小总和 - 容器大小)
10 = 0.2 * (50 * 5 - 200)
(4)每项伸缩后大小的计算:每项伸缩后大小 = 项目大小 - 移除空间。
40 = 50 - 10
这个比较简单,我们把2号项目的flex-basis设置成100px,3号项目的flex-shrink设置为3,再来计算一下看看是否正确:
#box{
width:200px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
flex-direction:row;
justify-content:flex-start;
align-items:flex-start;
}
.inner{
width:50px;
height:50px;
background:pink;
text-align:center;
line-height:50px;
flex-shrink:1
}
#box > .inner:nth-child(2){
flex-basis:100px;
}
#box > .inner:nth-child(3){
flex-shrink:3;
}
首先我们可以知道1、4、5项目的大小一样,2号项目是一个大小,3号项目又是另一个大小:
(1)计算收缩因子与基准值乘的总和:
400 = (1 * 50 * 3) + (1 * 100 * 1) + (3 * 50 * 1)
(2)计算收缩因数:收缩因数 =(项目的收缩因子 * 项目基准值)/ 第一步计算总和:
1,4,5项目 0.125 = 1 * 50 / 400
2项目 0.25 = 1 * 100 / 400
3项目 0.375 = 3 * 50 / 400
(3)每项移除空间的计算:移除空间 = 项目收缩因数 x 溢出的空间(项目大小总和 - 容器大小)
1,4,5项目 12.5 = 0.125 * ((50 * 4 + 100) - 200)
2项目 25 = 0.25 * ((50 * 4 + 100) - 200)
3项目 37.5 = 0.375 * ((50 * 4 + 100) - 200)
(4)每项伸缩后大小的计算:每项伸缩后大小 = 项目大小 - 移除空间。
1,4,5项目 50 - 12.5 = 37.5
2项目 100 - 25 = 75
3项目 50 - 37.5 = 12.5
我们来看下效果是不是这样:
可以看见计算出来的结果都是对的。
6.flex:简写属性
flex属性是flex-grow,flex-shrink,flex-basis的简写,对应的默认值分别为0,1,auto,通常用于等比例布局。
css代码:
#box{
width:400px;
height:300px;
border:1px solid;
margin:100px auto;
display:flex;
}
#box > .inner{
height:50px;
background:red;
font:20px/50px '微软雅黑';
text-align:center;
flex:1;
}
HTML代码:
<div id="box">
<div class="inner">1</div>
<div class="inner">2</div>
<div class="inner">3</div>
<div class="inner">4</div>
<div class="inner">5</div>
</div>
页面效果:
可以看见在未设置项目宽度的情况下,flex属性能实现项目的等比例布局,我们打开浏览器的调试模式看下。
可以看见只flex只设置一个参数的情况下,后面两个参数采用的是默认值(因为没有宽度所有项目的基准值flex-basis为0)。