原文地址:flex布局語法篇
之前寫過一篇關于實現元素居中的博文,我們發現每種布局要求都可以運用flex布局實現。其實令元素居中只是flex強大的其中一個體現,可以說不管是什么布局,flex往往都可以幾行命令搞定。今天我就來總結一下關于flex語法方面的內容。
基本概念
Flex是Flexible Box的縮寫,意為"彈性布局",用來為盒狀模型提供最大的靈活性。flex是一個布局模塊,而不是一個簡單的屬性,它可以實現各種各樣的布局,可以在任何流動的方向上(包括上下左右)都能進行良好的布局,也以彈性的在任意的容器中伸縮大小,可以方便讓元素對齊容器的左、右、中間等等。任何元素都可以指定flex布局,但是要注意設為Flex布局以后,子元素的float、clear和vertical-align屬性將失效。
相關術語
- 彈性容器(Flex container):包含著彈性項目的父元素。通過設置 display 屬性的值為 flex 或 inline-flex 來定義彈性容器。
- 彈性項目(Flex item):彈性容器的每個子元素都稱為彈性項目。彈性容器直接包含的文本將被包覆成匿名彈性單元。
- 軸(Axis):每個彈性框布局包含兩個軸。彈性項目沿其依次排列的那根軸稱為主軸(main axis)。垂直于主軸的那根軸稱為側軸(cross axis)。
- 方向(Direction):彈性容器的主軸起點(main start)/主軸終點(main end)和側軸起點(cross start)/側軸終點(cross end)描述了彈性項目排布的起點與終點。
容器的屬性
flex-direction
flex-direction定義了伸縮容器的主軸,決定了伸縮項目放置在伸縮容器的方向 。
flex-direction: row | row-reverse | column | column-reverse
- row(默認值):主軸為水平方向,起點在左端。
- row-reverse:主軸為水平方向,起點在右端。
- column:主軸為垂直方向,起點在上沿。
- column-reverse:主軸為垂直方向,起點在下沿。
flex-wrap
flex-wrap定義了伸縮容器的側軸,側軸的方向決定了新行堆放的方向(即是否換行)。
flex-wrap: nowrap | wrap | wrap-reverse
- nowrap(默認值):不換行。
- wrap:換行,第一行在上方。
- wrap-reverse:換行,第一行在下方。
flex-flow
flex-flow是flex-direction和flex-wrap屬性的縮寫;同時定義了伸縮容器的主軸和側軸,其默認值為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(默認值):向起始位置靠齊。
- flex-end:向結束位置靠齊。
- center:居中。
- space-between:兩端對齊,項目之間的間隔都相等。
- space-around:每個項目兩側的間隔相等。所以,項目之間的間隔比項目與邊框的間隔大一倍。
align-items
align-items定義項目在側軸上如何對齊,
align-items: flex-start | flex-end | center | baseline | stretch
- stretch(默認值):如果項目未設置高度或設為auto,將占滿整個容器的高度。
- flex-start:側軸的起點對齊。
- flex-end:側軸的終點對齊。
- center:側軸的中點對齊。
- baseline: 項目的第一行文字的基線對齊。
下面例圖基于主軸方向為flex-direction:row,水平對齊方式為justify-content: space-between,依次改變側軸對齊方式 align-items:
align-content
align-content定義了多根軸線(多行排列)的對齊方式。如果項目只有一根軸線(單行),該屬性不起作用,即必須設置換行flex-wrap: wrap。這個屬性與上面的align-items相似,把一根軸線(行)看作是一個項目就好理解了。
align-content: flex-start | flex-end | center | space-between | space-around | stretch
- stretch(默認值):軸線占滿整個側軸。
- flex-start:與側軸的起點對齊。
- flex-end:與側軸的終點對齊。
- center:與側軸的中點對齊。
- space-between:與側軸兩端對齊,軸線之間的間隔平均分布。
- space-around:每根軸線兩側的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍。
項目的屬性
order
order屬性定義項目的排列順序。數值越小,排列越靠前,默認值為0,伸縮項目是按照文檔流出現先后順序排列。可以取負值。
order: <integer>
舉個栗子:
下面讓第一個元素排在最后,最后一個元素排在第一個
.container{
display: flex;
}
.container .item-6{
order: -1;
}
.container .item-1{
order: 1;
}
flex-grow
flex-grow定義項目的擴展比例,項目根據容器的剩余空間按比例擴展。默認值為0,即如果存在剩余空間,也不擴展。如果所有項目的flex-grow屬性都為1,則它們將等分剩余空間(如果有的話)。如果一個項目的flex-grow屬性為2,其他項目都為1,則前者占據的剩余空間將比其他項多一倍。負值對該屬性無效。
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定義了項目的縮小比例,默認為1,即如果空間不足,該項目將縮小。如果所有項目的flex-shrink屬性都為1,當空間不足時,都將等比例縮小。如果一個項目的flex-shrink屬性為0,其他項目都為1,則空間不足時,前者不縮小。負值對該屬性無效。
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屬性。默認值為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定義了在分配多余空間之前,項目占據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸是否有多余空間。它的默認值為auto,即項目的本來大小。它可以設為跟width或height屬性一樣的值,則項目將占據固定空間。
flex-basis: <length> | auto
flex
flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,默認值為0 1 auto。后兩個屬性可選。該屬性有兩個快捷值:auto (1 1 auto) 和 none (0 0 auto)。
flex: none | [ <flex-grow> <flex-shrink> || <flex-basis> ]
小結
今天的flex語法就說這么多吧,寫這篇文章參考了阮一峰老師的flex語法教程,他寫的真的特別好,清晰有條理,也通俗易懂,我參照他的教程加入自己的理解,寫出這篇博文,文章里所有的例子圖片都是我自己敲著代碼做出來的,也算是收獲巨大,后面有時間的話還會再寫一篇關于flex實例的文章,學以致用。