原文地址:flex布局語法篇
之前寫過一篇關(guān)于實(shí)現(xiàn)元素居中的博文,我們發(fā)現(xiàn)每種布局要求都可以運(yùn)用flex布局實(shí)現(xiàn)。其實(shí)令元素居中只是flex強(qiáng)大的其中一個體現(xiàn),可以說不管是什么布局,flex往往都可以幾行命令搞定。今天我就來總結(jié)一下關(guān)于flex語法方面的內(nèi)容。
基本概念
Flex是Flexible Box的縮寫,意為"彈性布局",用來為盒狀模型提供最大的靈活性。flex是一個布局模塊,而不是一個簡單的屬性,它可以實(shí)現(xiàn)各種各樣的布局,可以在任何流動的方向上(包括上下左右)都能進(jìn)行良好的布局,也以彈性的在任意的容器中伸縮大小,可以方便讓元素對齊容器的左、右、中間等等。任何元素都可以指定flex布局,但是要注意設(shè)為Flex布局以后,子元素的float、clear和vertical-align屬性將失效。
相關(guān)術(shù)語
- 彈性容器(Flex container):包含著彈性項目的父元素。通過設(shè)置 display 屬性的值為 flex 或 inline-flex 來定義彈性容器。
- 彈性項目(Flex item):彈性容器的每個子元素都稱為彈性項目。彈性容器直接包含的文本將被包覆成匿名彈性單元。
- 軸(Axis):每個彈性框布局包含兩個軸。彈性項目沿其依次排列的那根軸稱為主軸(main axis)。垂直于主軸的那根軸稱為側(cè)軸(cross axis)。
- 方向(Direction):彈性容器的主軸起點(diǎn)(main start)/主軸終點(diǎn)(main end)和側(cè)軸起點(diǎn)(cross start)/側(cè)軸終點(diǎn)(cross end)描述了彈性項目排布的起點(diǎn)與終點(diǎn)。

容器的屬性
flex-direction
flex-direction定義了伸縮容器的主軸,決定了伸縮項目放置在伸縮容器的方向 。
flex-direction: row | row-reverse | column | column-reverse
- row(默認(rèn)值):主軸為水平方向,起點(diǎn)在左端。
- row-reverse:主軸為水平方向,起點(diǎn)在右端。
- column:主軸為垂直方向,起點(diǎn)在上沿。
- column-reverse:主軸為垂直方向,起點(diǎn)在下沿。
flex-wrap
flex-wrap定義了伸縮容器的側(cè)軸,側(cè)軸的方向決定了新行堆放的方向(即是否換行)。
flex-wrap: nowrap | wrap | wrap-reverse
- nowrap(默認(rèn)值):不換行。
- wrap:換行,第一行在上方。
- wrap-reverse:換行,第一行在下方。

flex-flow
flex-flow是flex-direction和flex-wrap屬性的縮寫;同時定義了伸縮容器的主軸和側(cè)軸,其默認(rèn)值為row nowrap。
flex-flow: <flex-direction> || <flex-wrap>
舉個栗子:
.container-1{
flex-flow: row-reverse wrap-reverse;
}
.container-2{
flex-flow: column wrap;
}

justify-content
justify-content定義了項目在主軸上的對齊方式。
justify-content: flex-start | flex-end | center | space-between | space-around
- flex-start(默認(rèn)值):向起始位置靠齊。
- flex-end:向結(jié)束位置靠齊。
- center:居中。
- space-between:兩端對齊,項目之間的間隔都相等。
- space-around:每個項目兩側(cè)的間隔相等。所以,項目之間的間隔比項目與邊框的間隔大一倍。
align-items
align-items定義項目在側(cè)軸上如何對齊,
align-items: flex-start | flex-end | center | baseline | stretch
- stretch(默認(rèn)值):如果項目未設(shè)置高度或設(shè)為auto,將占滿整個容器的高度。
- flex-start:側(cè)軸的起點(diǎn)對齊。
- flex-end:側(cè)軸的終點(diǎn)對齊。
- center:側(cè)軸的中點(diǎn)對齊。
- baseline: 項目的第一行文字的基線對齊。
下面例圖基于主軸方向為flex-direction:row,水平對齊方式為justify-content: space-between,依次改變側(cè)軸對齊方式 align-items:

align-content
align-content定義了多根軸線(多行排列)的對齊方式。如果項目只有一根軸線(單行),該屬性不起作用,即必須設(shè)置換行flex-wrap: wrap。這個屬性與上面的align-items相似,把一根軸線(行)看作是一個項目就好理解了。
align-content: flex-start | flex-end | center | space-between | space-around | stretch
- stretch(默認(rèn)值):軸線占滿整個側(cè)軸。
- flex-start:與側(cè)軸的起點(diǎn)對齊。
- flex-end:與側(cè)軸的終點(diǎn)對齊。
- center:與側(cè)軸的中點(diǎn)對齊。
- space-between:與側(cè)軸兩端對齊,軸線之間的間隔平均分布。
- space-around:每根軸線兩側(cè)的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍。
項目的屬性
order
order屬性定義項目的排列順序。數(shù)值越小,排列越靠前,默認(rèn)值為0,伸縮項目是按照文檔流出現(xiàn)先后順序排列??梢匀∝?fù)值。
order: <integer>
舉個栗子:

下面讓第一個元素排在最后,最后一個元素排在第一個
.container{
display: flex;
}
.container .item-6{
order: -1;
}
.container .item-1{
order: 1;
}

flex-grow
flex-grow定義項目的擴(kuò)展比例,項目根據(jù)容器的剩余空間按比例擴(kuò)展。默認(rèn)值為0,即如果存在剩余空間,也不擴(kuò)展。如果所有項目的flex-grow屬性都為1,則它們將等分剩余空間(如果有的話)。如果一個項目的flex-grow屬性為2,其他項目都為1,則前者占據(jù)的剩余空間將比其他項多一倍。負(fù)值對該屬性無效。
flex-grow: <number>
舉個栗子:
.container-1,.container-2,.container-3{
margin-bottom: 30px;
display: flex;
justify-content: space-between;
}
.container-2 .item-1,.container-2 .item-2,.container-2 .item-3{
flex-grow: 1;
}
.container-3 .item-2{
flex-grow: 2;
}
.container-3 .item-1,.container-3 .item-3{
flex-grow: 1;
}

flex-shrink
flex-shrink定義了項目的縮小比例,默認(rèn)為1,即如果空間不足,該項目將縮小。如果所有項目的flex-shrink屬性都為1,當(dāng)空間不足時,都將等比例縮小。如果一個項目的flex-shrink屬性為0,其他項目都為1,則空間不足時,前者不縮小。負(fù)值對該屬性無效。
flex-shrink: <number>
舉個栗子:
.container-1,.container-2,.container-3{
display: flex;
margin-bottom: 30px;
justify-content: space-between;
}
.container-2 .item-1,.container-2 .item-2,.container-2 .item-3{
flex-shrink: 0;
}
.container-3 .item-1{
flex-shrink: 0;
}
.container-3 .item-2{
flex-shrink: 1;
}
.container-3 .item-3{
flex-shrink: 2;
}

align-self
align-self屬性允許單個項目有與其他項目不一樣的對齊方式,可覆蓋align-items屬性。默認(rèn)值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同于stretch。
align-self: auto | flex-start | flex-end | center | baseline | stretc
舉個栗子:
.container{
display: flex;
align-items: flex-start;
}
.container .item-4{
align-self: flex-end;
}

flex-basis
flex-basis定義了在分配多余空間之前,項目占據(jù)的主軸空間(main size)。瀏覽器根據(jù)這個屬性,計算主軸是否有多余空間。它的默認(rèn)值為auto,即項目的本來大小。它可以設(shè)為跟width或height屬性一樣的值,則項目將占據(jù)固定空間。
flex-basis: <length> | auto
flex
flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,默認(rèn)值為0 1 auto。后兩個屬性可選。該屬性有兩個快捷值:auto (1 1 auto) 和 none (0 0 auto)。
flex: none | [ <flex-grow> <flex-shrink> || <flex-basis> ]
小結(jié)
今天的flex語法就說這么多吧,寫這篇文章參考了阮一峰老師的flex語法教程,他寫的真的特別好,清晰有條理,也通俗易懂,我參照他的教程加入自己的理解,寫出這篇博文,文章里所有的例子圖片都是我自己敲著代碼做出來的,也算是收獲巨大,后面有時間的話還會再寫一篇關(guān)于flex實(shí)例的文章,學(xué)以致用。


