文章目录
本文档完全参考阮一峰大神的 Flex布局教程,详细记录以备忘。
- Flex容器
display:flex
|inline-flex
- Flex项
Flex容器内的子元素 - 主轴/交叉轴
Flex项总是沿主轴排列。
默认水平轴为主轴,主轴起点在左端;垂直轴为交叉轴,交叉轴的起点在上端。
即flex-direction
默认值是row
。
容器属性
flex-direction
flex-direction:row
| row-reverse
| column
| column-reverse
<body>
<div class="container flexbox">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
</div>
</body>
.container{
width:100px;
height:100px;
background-color:lightgoldenrodyellow;
}
.box{
width:20px;
height:20px;
border:5px solid transparent;
background-clip:padding-box;
background-color:lightskyblue;
text-align:center;
}
.flexbox{
display:flex;
flex-direction:row;
flex-direction:row-reverse;
flex-direction: column;
flex-direction: column-reverse;
}
flex-wrap
Flex项总是沿主轴排列,如果主轴排不下,要不要换行,flex-wrap对此作决定。
flex-wrap的默认值是nowrap
,意思是,即使一行排不下所有的Flex项,也不换行。
flex-wrap:nowrap
| wrap
| wrap-reverse
<div class="container flexbox">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
<div class="box">7</div>
</div>
justify-content
justify-content 决定了浏览器如何分配主轴的剩余空间,也因此确定了Flex项在主轴上的对齐方式。
justify-content:flex-start
| flex-end
| center
| space-between
| space-around
| space-evenly
</head>
<body>
<div class="container flexbox">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<!-- <div class="box">4</div> -->
</div>
</body>
align-items
align-items决定了Flex项在交叉轴上的对齐方式。
align-content
对单行(flex-wrap:nowrap
)无效,仅对多行有效,即flex-wrap:wrap
align-content 决定了 多行情况下浏览器如何分配交叉轴上的剩余空间。
<body>
<div class="container flexbox">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
<div class="box">7</div>
</div>
</body>
.container{
width:100px;
height:200px;
background-color:lightgoldenrodyellow;
}
.box{
width:20px;
height:20px;
border:5px solid transparent;
background-clip:padding-box;
background-color:lightskyblue;
text-align:center;
}
.flexbox{
display:flex;
flex-wrap: wrap;
align-items:flex-start;
/* align-items:flex-end;
align-items:center;
align-items:space-between;
align-items:space-around;
align-items:space-evenly; */
}
flex-flow
flex-flow:flex-direction flex-wrap
项目属性
order
决定了Flex项的排列顺序,默认值是0
,值越小越往前排。
flex-grow
如果Flex容器有剩余空间,flex-grow决定了Flex项能够分配得到多少剩余空间。
flex-grow的默认值是0
,这意味着,即使有剩余空间,该Flex项目也不会参与分配。
看例子吧。
例1:第一个.item
的flex-grow
设置为3
,第二个.item
的flex-grow
设置为1
,第三个.item
的flex-grow
取默认值0
。
<body>
<div class="container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
</body>
.container{
width: 400px;
display: flex;
}
.item{
height: 100px;
}
.item:nth-of-type(1){
width: 80px;
background-color: lightgoldenrodyellow;
flex-grow: 3;
}
.item:nth-of-type(2){
width: 120px;
background-color: lightskyblue;
flex-grow: 1;
}
.item:nth-of-type(3){
width: 140px;
background-color: lightgrey;
}
- 总扩展空间
400px-(80px+120px+140px)=60px
- 总权重
3+1+0=4
- 单项的权重
第一个项目的权重是3
;
第二个项目的权重是1
;
第三个项目的权重是0
。 - 单项的扩展空间
第一项的扩展空间是60px*3/4=45px
;
第二项的扩展空间是60px*1/4=15px
;
第三项的扩展空间是60px*0/4=0px
。 - 单项的最终宽度
第一项的最终宽度是80px+45px=125px
;
第二项的最终宽度是120px+15px=135px
;
第三项的最终宽度是140px+0px=140px
。
例2:第一个.item
的flex-grow
设置为0.1
,第二个.item
的flex-grow
设置为0.2
,第三个.item
的flex-grow
设置为0.2
。
- 总扩展空间
400px-(80px+120px+140px)=60px
- 总权重
0.1+0.2+0.2=0.5
所有.item
的flex-grow
加起来等于0.1+0.2+0.2=0.5
,小于1
,这时总权重就不是0.5
,而是1
- 单项的权重
第一个项目的权重是0.1
;
第二个项目的权重是0.2
;
第三个项目的权重是0.2
。 - 单项的扩展空间
第一项的扩展空间是60px*0.1/1=6px
;
第二项的扩展空间是60px*0.2/1=12px
;
第三项的扩展空间是60px*0.2/1=12px
。 - 单项的最终宽度
第一项的最终宽度是80px+6px=86px
;
第二项的最终宽度是120px+12px=132px
;
第三项的最终宽度是140px+12px=152px
。
flex-shrink
如果Flex项的宽度总和大于Flex容器的宽度,即Flex容器空间不足时,Flex项会缩小,缩小的程度由flex-shrink决定,flex-shrink的默认值是1
。
看例子吧。
例1: .item
的flex-shrink
都取默认值1
<body>
<div class="container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
</body>
.container{
width: 400px;
display:flex;
}
.item{
height: 100px;
}
.item:nth-of-type(1){
width: 120px;
background-color: lightgoldenrodyellow;
/* flex-shrink: 2; */
}
.item:nth-of-type(2){
width: 150px;
background-color: lightskyblue;
/* flex-shrink: 3; */
}
.item:nth-of-type(3){
width: 180px;
background-color: lightgrey;
}
- 总溢出空间
(120px+150px+180px)-400px=50px
- 总权重
120*1+150*1+180*1=450
- 单项的权重
第一个项目的权重是120*1=120
;
第二个项目的权重是150*1=150
;
第三个项目的权重是180*1=180
。 - 单项的压缩空间
第一项的压缩空间是50px*120/450=13.33px
;
第二项的压缩空间是50px*150/450=16.66px
;
第三项的压缩空间是50px*180/450=20px
。 - 单项的最终宽度
第一项的最终宽度是120px-13.33px=106.66px
;
第二项的最终宽度是150px-16.66px=133.34px
;
第三项的最终宽度是180px-20px=160px
。
例2:第一个.item
的flex-shrink
设置为2
,第二个.item
的flex-shrink
设置为3
,第三个.item
的flex-shrink
取默认值1
。
- 总溢出空间
(120px+150px+180px)-400px=50px
- 总权重
120*2+150*3+180*1=870
- 单项的权重
第一个项目的权重是120*2=240
;
第二个项目的权重是150*3=450
;
第三个项目的权重是180*1=180
。 - 单项的压缩空间
第一项的压缩空间是50px*240/870=13.79px
;
第二项的压缩空间是50px*450/870=25.86px
;
第三项的压缩空间是50px*180/870=10.35px
。 - 单项的最终宽度
第一项的最终宽度是120px-13.79px=106.21px
;
第二项的最终宽度是150px-25.86px=124.14px
;
第三项的最终宽度是180px-10.35px=169.65px
。
例3:第一个.item
的flex-shrink
设置为0.1
,第二个.item
的flex-shrink
设置为0.2
,第三个.item
的flex-shrink
设置为0.3
。
- 总溢出空间
(120px+150px+180px)-400px=50px
所有.item
的flex-shrink
加起来等于0.1+0.2+0.3=0.6
,小于1
,这时总溢出空间就不是(120px+150px+180px)-400px=50px
了,而是50px*(0.1+0.2+0..3)/1=30px
。 - 总权重
120*0.1+150*0.2+180*0.3=96
- 单项的权重
第一个项目的权重是120*0.1=12
;
第二个项目的权重是150*0.2=30
;
第三个项目的权重是180*0.3=54
。 - 单项的压缩空间
第一项的压缩空间是30px*12/96=3.75px
;
第二项的压缩空间是30px*30/96=9.37px
;
第三项的压缩空间是30px*54/96=16.87px
。 - 单项的最终宽度
第一项的最终宽度是120px-3.75px=116.25px
;
第二项的最终宽度是150px-9.37px=140.63px
;
第三项的最终宽度是180px-16.87px=163.13px
。
flex-basis
在分配剩余空间之前,Flex项占据了多少主轴空间,这个由flex-basis决定。
flex-basis的默认值是auto
,即Flex项本身的大小。
浏览器根据各Flex项的flex-basis,计算Flex容器的剩余空间。
当flex-direction
为row
| row-reverse
,且flex-basis
、width
同时存在时,此时flex-basis
的优先级高于width
;
当flex-direction
为column
|column-reverse
,且flex-basis
、height
同时存在时,此时flex-basic
的优先级高于height
。
<body>
<div class="container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
</body>
.container{
width: 400px;
display: flex;
}
.item{
height: 100px;
}
.item:nth-of-type(1){
width: 80px;
background-color: lightgoldenrodyellow;
flex: 100px 0 0;
}
.item:nth-of-type(2){
width: 120px;
background-color: lightskyblue;
flex: 120px 0 0;
}
.item:nth-of-type(3){
width: 140px;
background-color: lightgrey;
flex: 140px 0 0;
}
flex
flex:flex-grow flex-shrink flex-basis
flex:无单位的数 无单位的数 有效的宽度值
无单位的数,第一个是flex-grow,第二个是flex-shrink;有效的宽度值是flex-basis。
align-self
设置单个Flex项的对齐方式,将覆盖align-items。
参考文档
justify-content
align-content
align-items
flex-shrink
flex-grow
Flex布局教程