一、flex布局与传统布局
传统布局:兼容性好、布局繁琐且不能较好地在移动端布局
flex布局:布局简单方便,很适合在移动端布局,但存在版本兼容支持问题
二、flex布局原理
flex 是 flexible Box 的缩写,意为 “弹性布局”,用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为 flex 布局。
采用 flex 布局的元素,称为 flex 容器(flex container),它的所有子元素自动成为容器成员,称为 flex 项目(flex item)
。 flex就是通过给父盒子添加flex属性,来控制子盒子的位置和排列等。
PS:将父盒子设为 flex 布局以后,子元素的 float(浮动)、clear(清除浮动)和 vertical-align(垂直居中)属性将失效。
三、flex布局常见父元素属性
3.1 flex-direction
作用:设置主轴方向,默认为水平从左到右
属性值:row(从左到右,默认)、row-reverse(从右到左)、column(从上到下)、column-reverse(从下到上)
<style> #box2, #box3 { height: 300px; width: 300px; } #box1 { height: 100vh;
width: 100vw; background-color: skyblue; display: flex; /* 1.flex-direction:
row; */ /* 2.flex-direction: row-reverse; */ /* 3.flex-direction: column; */
flex-direction: column-reverse; } #box2 { background-color: red; } #box3{
background-color: green; } </style> <body> <div id="box1"> <div
id="box2">111</div> <div id="box3">222</div> </div> </body>
1.row
2.row-reverse
3.column
4.column-reverse
3.2 justify-content
作用:设置主轴上子元素的排列方式(默认从头部方向)
属性值:
flex-start(从头部开始,默认)、flex-end(从尾部开始排列)、center(主轴居中对齐)、space-around(平分剩余空间)、space-between(先两边贴边再平分剩余空间)
<style> .item { height: 300px; width: 300px; } #box1 { height: 100vh; width:
100vw; background-color: skyblue; display: flex; justify-content: /*
flex-start(从头部开始,默认) flex-end(从尾部开始排列) center(主轴居中对齐) space-around(平分剩余空间)
space-between(先两边贴边再平分剩余空间)*/ } #box2 { background-color: red; } #box3{
background-color: green; } #box4{ background-color: yellow; } </style> <body>
<div id="box1"> <div id="box2" class="item">111</div> <div id="box3"
class="item">222</div> <div id="box4" class="item">333</div> </div> </body>
1.flex-start
2.flex-end
3.center
4.space-around
5.space-between
3.3 flex-wrap
作用:设置子元素是否换行(默认不换行)
属性值:nowrap(不换行,默认)、wrap(换行)
PS:不换行时, 如果装不开,会缩小子元素的宽度,放到父元素里面
<style> .item { height: 400px; width: 400px; } #box1 { height: 100vh; width:
100vw; background-color: skyblue; display: flex; flex-wrap: /*nowrap wrap*/ }
#box2 { background-color: red; } #box3{ background-color: green; } #box4{
background-color: yellow; } #box5{ background-color: white; } #box6{
background-color: blue; } #box7{ background-color: gray; } </style> <body> <div
id="box1"> <div id="box2" class="item">111</div> <div id="box3"
class="item">222</div> <div id="box4" class="item">333</div> <div id="box5"
class="item">444</div> <div id="box6" class="item">555</div> <div id="box7"
class="item">666</div> </div> </body>
1.nowrap
2.wrap
3.4 align-items
作用:设置侧轴上的子元素排列方式,需要子项为单行(默认为拉伸,需要子盒子未指定高度)
属性值:flex-start(从上到下)、flex-end(从下到上)、center(挤在一起居中)、stretch(拉伸,默认)
PS:侧轴为主轴的垂直方向,主轴为水平时方向为从上到下,主轴为垂直时方向为从左到右
<style> .item { height: 400px; width: 400px; } #box1 { height: 100vh; width:
100vw; background-color: skyblue; display: flex; align-items: /*flex-start
flex-end center stretch*/ } #box2 { background-color: red; } #box3{
background-color: green; } #box4{ background-color: yellow; } #box5{
background-color: white; } #box6{ background-color: blue; } #box7{
background-color: gray; } </style>
1.flex-start
2.flex-end
3.center
4.stretch
3.5 align-content
作用:设置子项在侧轴上的排列方式并且只能用于子项出现换行的情况(默认拉伸)
属性值:
flex-start(侧轴头部开始)、flex-end(侧轴尾部开始)、center(侧轴中间显示)、space-around(平分侧轴剩余空间)、space-bwtween(先占据两边再平分)、stretch(拉伸,默认)
<style> .item { height: 400px; width: 400px; } #box1 { height: 100vh; width:
100vw; background-color: skyblue; display: flex; flex-wrap: wrap;
align-content: /* flex-start flex-end center space-around space-between stretch
*/ } #box2 { background-color: red; } #box3{ background-color: green; } #box4{
background-color: yellow; } #box5{ background-color: white; } #box6{
background-color: blue; } #box7{ background-color: gray; } </style>
1.flex-start
2.flex-end
3.center
4.space-around
5.space-between
6.stertch
3.6 flex-flow
作用:flex-direction和flex-warp的复合属性
属性值:flex-direction和flex-warp属性的组合,第一个为flex-direction属性,第二个为flex-warp属性,可部分省略(如:flex-flow:column)
四、flex布局子元素常见属性
4.1 flex-grow
作用:定义子项目分配剩余空间,需要主轴存在剩余空间(默认为0)
属性值:0(默认,保持初始),正数n(放大因子,占据剩余空间份数)
PS:设置后的宽度(或高度)为原先设置值加上分配得到的
如下例,设置grow的三个元素分配得到的分别为(320-100)=220,(540-100)=440,(760-100)=660
<style> .item { height: 100px; width: 100px; } #box1 { height: 100vh; width:
100vw; background-color: skyblue; display: flex; } #box2 { background-color:
red; flex-grow: 1; } #box3{ background-color: green; flex-grow: 2; } #box4{
background-color: yellow; flex-grow: 3; } #box5{ background-color: white; }
#box6{ background-color: blue; } #box7{ background-color: gray; } </style>
4.2 flex-shrink
作用:超出范围时缩小(默认为1,可缩小)
属性值:0(不可收缩,维持初始大小)、1(可缩小,默认),正数n(收缩因子,被收缩的份数)
例:超出400,两个子元素分别设置shrink为1和3,则前者缩小100,后者缩小300
<style> .item { height: 400px; width: 400px; } #box1 { height: 100vh; width:
100vw; background-color: skyblue; display: flex; } #box2 { background-color:
red; flex-shrink: 1; } #box3{ background-color: green; flex-shrink: 2; } #box4{
background-color: yellow; flex-shrink: 3; } #box5{ background-color: white; }
#box6{ background-color: blue; } #box7{ background-color: gray; } </style>
4.3 flex-basis
作用:定义在分配多余空间之前,项目占据的主轴空间(默认为auto,即项目本来大小),浏览器根据这个属性,计算主轴是否有多余空间。
属性值:auto(默认)、xxxpx(项目占据xxxpx)
<style> .item { height: 400px; width: 400px; } #box1 { height: 100vh; width:
100vw; background-color: skyblue; display: flex; } #box2 { background-color:
red; flex-basis: 800px; } #box3{ background-color: green; } #box4{
background-color: yellow; } #box5{ background-color: white; } #box6{
background-color: blue; } #box7{ background-color: gray; } </style>
4.4 align-self
作用:使此项目有与其他项目不一样的对齐方式,可覆盖align-items属性(默认为auto,表示基继承align-items属性
属性值:align-items的属性
<style> .item { height: 400px; width: 400px; } #box1 { height: 100vh; width:
100vw; background-color: skyblue; display: flex; align-items: flex-end; } #box2
{ background-color: red; align-self: center; } #box3{ background-color: green;
} #box4{ background-color: yellow; align-self: flex-start; } #box5{
background-color: white; } #box6{ background-color: blue; } #box7{
background-color: gray; } </style>
5.5 order
作用:定义项目的排列顺序(默认为0)
属性值:number(数值越小越靠前,与z-index不一样)
<style> .item { height: 400px; width: 400px; } #box1 { height: 100vh; width:
100vw; background-color: skyblue; display: flex; } #box2 { background-color:
red; order: 1; } #box3{ background-color: green; } #box4{ background-color:
yellow; } #box5{ background-color: white; order: -1; } #box6{ background-color:
blue; order: -2; } #box7{ background-color: gray; } </style>
5.6 flex
作用:flex-grow、flex-shrink、flex-basis三者的复合属性
属性值:三者属性值的组合,可部分省略