簡言
佈局的傳統解決方案是基於盒狀模型,依賴 display
+ position
+ float
方式來實現,靈活性較差。2009年,W3C提出了一種新的方案-Flex,Flex是Flexible Box的縮寫,意為”彈性佈局”。Flex可以簡便、完整、響應式地實現多種頁面佈局。下面我們就從基礎語法開始,一起來感受下Flex的魅力吧!
1 基本概念
採用 Flex 佈局的元素,稱為 Flex 容器(flex container),簡稱"容器"。它的所有子元素自動成為容器成員,稱為 Flex 專案(flex item),簡稱"專案"。
容器預設存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開始位置(與邊框的交叉點)叫做main start,結束位置叫做main end;交叉軸的開始位置叫做cross start,結束位置叫做cross end。
Flex專案預設沿主軸排列。單個專案佔據的主軸空間叫做main size,佔據的交叉軸空間叫做cross size。
Flex屬性分為兩部分,一部分作用於容器稱容器屬性,另一部分作用於專案稱為專案屬性。下面我們就分部的來介紹它們。
2 Flex容器屬性
2.1 flex容器定義
基本語法:
.box {
display: flex; /* 或者 inline-flex */
}
複製程式碼
上述寫法,定義了一個flex容器,根據設值的不同可以是塊狀容器或內聯容器。這使得直接子結點擁有了一個flex上下文。
2.2 flex-direction
flex-direction
屬性決定主軸的方向(即專案的排列方向)。
基本語法:
.box {
flex-direction: row | row-reverse | column | column-reverse;
}
複製程式碼
row
表示從左向右排列row-reverse
表示從右向左排列column
表示從上向下排列column-reverse
表示從下向上排列
演示程式:
2.3 flex-wrap
預設情況下,Flex專案都排在一條線(又稱"軸線")上。我們可以通過flex-wrap
屬性的設定,讓Flex專案換行排列。
基本語法:
.box {
flex-wrap: nowrap | wrap | wrap-reverse;
}
複製程式碼
nowrap
(預設):所有Flex專案單行排列wrap
:所有Flex專案多行排列,按從上到下的順序wrap-reverse
:所有Flex專案多行排列,按從下到上的順序
演示程式:
觀察上述演示程式 ,理解不同屬性的含義。點選演示區域,可啟動或停止演示。
2.4 flex-flow
flex-flow
屬性是flex-direction
屬性和flex-wrap
屬性的簡寫形式,預設值為row nowrap
基本語法:
.box {
flex-flow: <‘flex-direction’> || <‘flex-wrap’>
}
複製程式碼
2.5 justify-content
justify-content
屬性定義了專案在主軸上的對齊方式及額外空間的分配方式。
基本語法:
.box {
justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly;
}
複製程式碼
flex-start
(預設):從啟點線開始順序排列flex-end
:相對終點線順序排列center
:居中排列space-between
:專案均勻分佈,第一項在啟點線,最後一項在終點線space-around
:專案均勻分佈,每一個專案兩側有相同的留白空間,相鄰專案之間的距離是兩個專案之間留白的和space-evenly
:專案均勻分佈,所有專案之間及專案與邊框之間距離相等
演示程式:
2.6 align-items
align-items
屬性定義專案在交叉軸上的對齊方式。
基本語法:
.box {
align-items: stretch | flex-start | flex-end | center | baseline;
}
複製程式碼
stretch
(預設):交叉軸方向拉伸顯示flex-start
:專案按交叉軸起點線對齊flex-end
:專案按交叉軸終點線對齊center
:交叉軸方向專案中間對齊baseline
:交叉軸方向按第一行文字基線對齊
演示程式:
2.7 align-content
align-content
屬性定義了在交叉軸方向的對齊方式及額外空間分配,類似於主軸上justify-content
的作用。
基本語法:
.box {
align-content: stretch | flex-start | flex-end | center | space-between | space-around ;
}
複製程式碼
stretch
(預設):拉伸顯示flex-start
:從啟點線開始順序排列flex-end
:相對終點線順序排列center
:居中排列space-between
:專案均勻分佈,第一項在啟點線,最後一項在終點線space-around
:專案均勻分佈,每一個專案兩側有相同的留白空間,相鄰專案之間的距離是兩個專案之間留白的和
演示程式:
3 Flex專案屬性
3.1 order
預設情況下,Flex專案是按照在程式碼中出現的先後順序排列的。然而order
屬性可以控制專案在容器中的先後順序。
基本語法:
.item {
order: <integer>; /* 預設 0 */
}
複製程式碼
按order
值從小到大順序排列,可以為負值,預設為0。
演示程式:
3.2 flex-grow
flex-grow
屬性定義專案的放大比例,flex-grow
值是一個單位的正整數,表示放大的比例。預設為0,即如果存在額外空間,也不放大,負值無效。
如果所有專案的flex-grow屬性都為1,則它們將等分剩餘空間(如果有的話)。如果一個專案的flex-grow屬性為2,其他專案都為1,則前者佔據的剩餘空間將比其他項多一倍。
基本語法:
.item {
flex-grow: <number>; /* 預設 0 */
}
複製程式碼
演示程式:
3.3 flex-shrink
flex-shrink
屬性定義了專案的縮小比例,預設為1,即如果空間不足,該專案將縮小。0表示不縮小,負值無效。
基本語法:
.item {
flex-shrink: <number>; /* 預設 1 */
}
複製程式碼
演示程式:
3.4 flex-basis
flex-basis
屬性定義專案在分配額外空間之前的預設尺寸。屬性值可以是長度(20%,10rem等)或者關鍵字auto
。它的預設值為auto,即專案的本來大小。
基本語法:
.item {
flex-basis: <length> | auto; /* 預設 auto */
}
複製程式碼
演示程式:
3.5 flex
flex
屬性是flex-grow
, flex-shrink
和flex-basis
的簡寫,預設值為0 1 auto。後兩個是可選屬性。
基本語法:
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
複製程式碼
一般推薦使用這種簡寫的方式,而不是分別定義每一個屬性。
3.6 align-self
align-self
屬性定義專案的對齊方式,可覆蓋align-items屬性。預設值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同於stretch。
基本語法:
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
複製程式碼
除了auto值以外,align-self
屬性與容器的align-items
屬性基本一致。
演示程式:
4 相容性
Chrome | Safari | Firefox | Opera | IE | Android | iOS |
---|---|---|---|---|---|---|
21+ | 6.1+ | 22+ | 12.1+ | 11+ | 4.4+ | 7.1+ |
Flexbox需要一些特定的字首以支援大多數的瀏覽器。甚至還存在完全不同的屬性名稱或屬性值。這就需要Autoprefixer或類似的CSS後處理器的輔助,具體內容請參考相關文件。