布局的傳統(tǒng)解決方案:是基于盒模型,這種布局依賴(lài)display屬性 + position屬性 + float屬性,但是對(duì)于一些特殊的布局是不方便的,比如說(shuō):對(duì)于垂直布局就不容易實(shí)現(xiàn)。
Flex布局是什么?
Flex布局又被稱(chēng)為彈性布局,用來(lái)為盒模型提供最大的靈活性,任意的容器、行內(nèi)元素都可以使用Flex布局。
ps:設(shè)定為Flex布局之后,子元素的float、clear和vertical-align屬性將會(huì)失效。
基本概念
采用Flex布局的元素。被稱(chēng)為Flex容器,簡(jiǎn)稱(chēng)為‘容器’。他的所有的子元素自動(dòng)成為容器的成員,成為Flex的項(xiàng)目。

容器默認(rèn)存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開(kāi)始位置(與邊框的交叉點(diǎn))叫做main start,結(jié)束位置叫做main end;交叉軸的開(kāi)始位置叫做cross start,結(jié)束位置叫做cross end。
項(xiàng)目默認(rèn)沿主軸排列。單個(gè)項(xiàng)目占據(jù)的主軸空間叫做main size,占據(jù)的交叉軸空間叫做cross size。
Flex的屬性設(shè)置
flex-direction、flex-wrap、flex-flow、justify-content、align-items、align-content
flex-direction
.project{
height: 100%;
width: 100%;
display: flex;
flex-direction:column; /* row | row-reverse | column | column-reverse;*/
}
.item{
height: 100px;
width: 100px;
border: 1px red solid;
}
<div class='project'>
<div class ='item'></div>
<div class ='item'></div>
<div class ='item'></div>
</div>
column-reverse:主軸為垂直方向,起點(diǎn)在下沿。
column:主軸為垂直方向,起點(diǎn)在上沿。
row(默認(rèn)值):主軸為水平方向,起點(diǎn)在左端。
row-reverse:主軸為水平方向,起點(diǎn)在右端。

flex-wrap
在該布局下,所有的項(xiàng)目都排在一條線上,但是當(dāng)一跳軸線排不下的時(shí)候,就要換行,這個(gè)屬性解決的就是如何換行的問(wèn)題。
.project{
height: 100%;
width: 100%;
display: flex;
flex-wrap:nowrap; /* nowrap | wrap | wrap-reverse;*/
}
.item{
height: 400px;
width: 400px;
border: 1px red solid;
}
<div class='project'>
<div class ='item'>1</div>
<div class ='item'>2</div>
<div class ='item'>3</div>
<div class ='item'>4</div>
<div class ='item'>5</div>
<div class ='item'>6</div>
</div>
nowrap(默認(rèn)值):不換行。
wrap:換行,第一行在上方。。
wrap-reverse:換行,第一行在下方。



flex-flow
flex-flow屬性是flex-direction屬性和flex-wrap屬性的簡(jiǎn)寫(xiě)形式,默認(rèn)值為row nowrap
.project{
height: 100%;
width: 100%;
display: flex;
flex-flow: column wrap;
}
.item{
height: 400px;
width: 400px;
border: 1px red solid;
}
justify-content
justify-content屬性定義了項(xiàng)目在主軸上的對(duì)齊方式。
.project{
border:solid 1px black;
height: 50px;
width: 100%;
display: flex;
justify-content:space-between;/* flex-start | flex-end | center | space-between | space-around;*/
}
.item{
height: 50px;
width: 100px;
border: 1px red solid;
}

flex-start(默認(rèn)值):左對(duì)齊
flex-end:右對(duì)齊
center: 居中
space-between:兩端對(duì)齊,項(xiàng)目之間的間隔都相等。
space-around:每個(gè)項(xiàng)目?jī)蓚?cè)的間隔相等。所以,項(xiàng)目之間的間隔比項(xiàng)目與邊框的間隔大一倍。
align-items屬性
align-items屬性定義項(xiàng)目在交叉軸上如何對(duì)齊。
.project{
border:solid 1px black;
width: 100%;
height: 100%;
display: flex;
align-items: baseline;
}
.item{
margin-top: 100px;
height: 50px;
width: 100px;
border: 1px red solid;
}
.item2{
height: 100px;
width: 100px;
border: 1px red solid;
}
.item3{
height: 150px;
width: 100px;
border: 1px red solid;
}

都很好理解,就是
baseline存在一定的歧義。我們通過(guò)一個(gè)小栗子來(lái)進(jìn)行了解。
flex-start:交叉軸的起點(diǎn)對(duì)齊。
flex-end:交叉軸的終點(diǎn)對(duì)齊。
center:交叉軸的中點(diǎn)對(duì)齊。
baseline: 項(xiàng)目的第一行文字的基線對(duì)齊。
stretch(默認(rèn)值):如果項(xiàng)目未設(shè)置高度或設(shè)為auto,將占滿(mǎn)整個(gè)容器的高度。
align-content
align-content屬性定義了多根軸線的對(duì)齊方式。如果項(xiàng)目只有一根軸線,該屬性不起作用。也就是說(shuō)item存在換行的情況存在
.project{
border:solid 1px black;
width: 100%;
height: 100%;
display: flex;
flex-wrap: wrap;
align-content: space-between;
}
.item{
height: 50px;
width: 100px;
border: 1px red solid;
}

flex-start:與交叉軸的起點(diǎn)對(duì)齊。
flex-end:與交叉軸的終點(diǎn)對(duì)齊。
center:與交叉軸的中點(diǎn)對(duì)齊。
space-between:與交叉軸兩端對(duì)齊,軸線之間的間隔平均分布。
space-around:每根軸線兩側(cè)的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍。
stretch(默認(rèn)值):軸線占滿(mǎn)整個(gè)交叉軸。
項(xiàng)目屬性
order、flex-grow、flex-shrink、flex-basis、flex、align-self
order
order屬性定義項(xiàng)目的排列順序。數(shù)值越小,排列越靠前,默認(rèn)為0。
.project{
width: 100%;
height: 100%;
display: flex;
flex-wrap: wrap;
align-content: space-between;
}
.item{
order: 1;
height: 50px;
width: 100px;
border: 1px red solid;
}
.item2{
order: 3;
height: 50px;
width: 100px;
border: 1px red solid;
}
.item3{
order: 2;
height: 50px;
width: 100px;
border: 1px red solid;
}
<div class='project'>
<div class ='item'>item1</div>
<div class ='item2'>item2</div>
<div class ='item3'>item3</div>
</div>

flex-grow
flex-grow屬性定義項(xiàng)目的放大比例,默認(rèn)為0,即如果存在剩余空間,也不放大,屬性的值是數(shù)字。
.project{
width: 100%;
height: 100%;
display: flex;
}
.item{
flex-grow: 1;
height: 50px;
width: 100px;
border: 1px red solid;
}
.item2{
flex-grow: 0;
height: 50px;
width: 100px;
border: 1px red solid;
}
.item3{
flex-grow: 1;
height: 50px;
width: 100px;
border: 1px red solid;
}
如果所有項(xiàng)目的flex-grow屬性都為1,則它們將等分剩余空間(如果有的話(huà))。如果一個(gè)項(xiàng)目的flex-grow屬性為2,其他項(xiàng)目都為1,則前者占據(jù)的剩余空間將比其他項(xiàng)多一倍。
flex-shrink
這個(gè)屬性定義了項(xiàng)目縮小的比例,這個(gè)值默認(rèn)是1,即如果空間不足的時(shí)候,這個(gè)項(xiàng)目就會(huì)縮小,如果所有的flex-shrink屬性值都為1,當(dāng)空間不足的時(shí)候,都進(jìn)行等比的縮小,但是如果有一個(gè)項(xiàng)目的flex-shrink為0,其他項(xiàng)目的值為1的時(shí)候,空間不足的時(shí)候,值為0的項(xiàng)目不會(huì)縮小。
flex-basis
flex-basis屬性定義了在分配多余空間之前,項(xiàng)目占據(jù)的主軸空間(main size)。瀏覽器根據(jù)這個(gè)屬性,計(jì)算主軸是否有多余空間。它的默認(rèn)值為auto,即項(xiàng)目的本來(lái)大小。它可以設(shè)為跟width或height屬性一樣的值(比如350px),則項(xiàng)目將占據(jù)固定空間。相當(dāng)于對(duì)項(xiàng)目設(shè)置了寬度。
flex
flex屬性是flex-grow, flex-shrink 和 flex-basis的簡(jiǎn)寫(xiě),默認(rèn)值為0 1 auto。后兩個(gè)屬性可選。flex屬性是flex-grow, flex-shrink 和 flex-basis的簡(jiǎn)寫(xiě),默認(rèn)值為0 1 auto。后兩個(gè)屬性可選。
align-self
align-self屬性允許單個(gè)項(xiàng)目有與其他項(xiàng)目不一樣的對(duì)齊方式,可覆蓋align-items屬性。默認(rèn)值為auto,表示繼承父元素的align-items屬性,如果沒(méi)有父元素,則等同于stretch。