布局的傳統(tǒng)解決方案:是基于盒模型,這種布局依賴display
屬性 + position
屬性 + float
屬性勇皇,但是對于一些特殊的布局是不方便的,比如說:對于垂直布局就不容易實現(xiàn)。
Flex布局是什么无蜂?
Flex布局又被稱為彈性布局紊服,用來為盒模型提供最大的靈活性檀轨,任意的容器、行內(nèi)元素都可以使用Flex布局欺嗤。
ps:設(shè)定為Flex布局之后参萄,子元素的float、clear和vertical-align屬性將會失效煎饼。
基本概念
采用Flex布局的元素讹挎。被稱為Flex容器,簡稱為‘容器’。他的所有的子元素自動成為容器的成員筒溃,成為Flex的項目马篮。
容器默認(rèn)存在兩根軸:水平的主軸(main axis
)和垂直的交叉軸(cross axis
)。主軸的開始位置(與邊框的交叉點)叫做main start
怜奖,結(jié)束位置叫做main end
浑测;交叉軸的開始位置叫做cross start
,結(jié)束位置叫做cross end
歪玲。
項目默認(rèn)沿主軸排列迁央。單個項目占據(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
:主軸為垂直方向株灸,起點在下沿崇摄。
column
:主軸為垂直方向,起點在上沿慌烧。
row
(默認(rèn)值):主軸為水平方向逐抑,起點在左端。
row-reverse
:主軸為水平方向屹蚊,起點在右端厕氨。
flex-wrap
在該布局下,所有的項目都排在一條線上汹粤,但是當(dāng)一跳軸線排不下的時候命斧,就要換行,這個屬性解決的就是如何換行的問題嘱兼。
.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
屬性的簡寫形式睁壁,默認(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
屬性定義了項目在主軸上的對齊方式背苦。
.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)值):左對齊
flex-end
:右對齊
center
: 居中
space-between
:兩端對齊互捌,項目之間的間隔都相等。
space-around
:每個項目兩側(cè)的間隔相等行剂。所以疫剃,項目之間的間隔比項目與邊框的間隔大一倍。
align-items屬性
align-items
屬性定義項目在交叉軸上如何對齊硼讽。
.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
存在一定的歧義。我們通過一個小栗子來進行了解固阁。
flex-start
:交叉軸的起點對齊壤躲。
flex-end
:交叉軸的終點對齊。
center
:交叉軸的中點對齊备燃。
baseline
: 項目的第一行文字的基線對齊碉克。
stretch
(默認(rèn)值):如果項目未設(shè)置高度或設(shè)為auto,將占滿整個容器的高度并齐。
align-content
align-content
屬性定義了多根軸線的對齊方式漏麦。如果項目只有一根軸線,該屬性不起作用况褪。也就是說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
:與交叉軸的起點對齊撕贞。
flex-end
:與交叉軸的終點對齊。
center
:與交叉軸的中點對齊测垛。
space-between
:與交叉軸兩端對齊捏膨,軸線之間的間隔平均分布。
space-around
:每根軸線兩側(cè)的間隔都相等食侮。所以号涯,軸線之間的間隔比軸線與邊框的間隔大一倍。
stretch
(默認(rèn)值):軸線占滿整個交叉軸锯七。
項目屬性
order
链快、flex-grow
、flex-shrink
眉尸、flex-basis
域蜗、flex
、align-self
order
order
屬性定義項目的排列順序效五。數(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
屬性定義項目的放大比例,默認(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;
}
如果所有項目的flex-grow
屬性都為1迅细,則它們將等分剩余空間(如果有的話)巫橄。如果一個項目的flex-grow
屬性為2,其他項目都為1茵典,則前者占據(jù)的剩余空間將比其他項多一倍湘换。
flex-shrink
這個屬性定義了項目縮小的比例,這個值默認(rèn)是1统阿,即如果空間不足的時候彩倚,這個項目就會縮小,如果所有的flex-shrink
屬性值都為1扶平,當(dāng)空間不足的時候帆离,都進行等比的縮小,但是如果有一個項目的flex-shrink
為0结澄,其他項目的值為1的時候哥谷,空間不足的時候,值為0的項目不會縮小麻献。
flex-basis
flex-basis
屬性定義了在分配多余空間之前们妥,項目占據(jù)的主軸空間(main size)。瀏覽器根據(jù)這個屬性勉吻,計算主軸是否有多余空間王悍。它的默認(rèn)值為auto
,即項目的本來大小餐曼。它可以設(shè)為跟width
或height
屬性一樣的值(比如350px)压储,則項目將占據(jù)固定空間。相當(dāng)于對項目設(shè)置了寬度源譬。
flex
flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫集惋,默認(rèn)值為0 1 auto。后兩個屬性可選踩娘。flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫刮刑,默認(rèn)值為0 1 auto。后兩個屬性可選养渴。
align-self
align-self屬性允許單個項目有與其他項目不一樣的對齊方式雷绢,可覆蓋align-items屬性。默認(rèn)值為auto理卑,表示繼承父元素的align-items屬性翘紊,如果沒有父元素,則等同于stretch藐唠。