傳統的 CSS 布局方式是基于盒模型(它是根據盒子與父盒子以及兄弟盒子的關系确定大小和位置的算法),實現時依賴于 block, inline, table, position, float 這些屬性,但對于一些特殊布局不易實現,比如垂直居中。
flexbox Layout 是一種新的布局方式,被稱為彈性布局,它使得子元素(items)可以靈活的、響應式的适應父容器(flex container)的空間,即使子元素的大小未知或是動态,并且可以很容易實現元素的水平和垂直對齊。
盒模型是基于 block 和 inline 的流動方向進行布局,而 flex 布局則是基于彈性流方向(flex-flow directions),基本思想如下圖所示。
flex 容器内的子元素會沿着 main axis(從 main-start 到 main-end )或 cross axis(從 cross-start到 cross-end)進行布局,其中:
使用以下代碼就可以将一個 HTML 元素指定為 flex 布局:
.container { display: flex; /* or inline-flex */ }
這個元素稱為 Flex Container,内部其他 HTML 元素被稱為 Flex Items。flex 容器 有 6 個屬性:
flex-direction
确定主軸的方向,也就是内部元素的彈性排列方向。如果不考慮換行,Flexbox 是單向布局的概念,始終将元素放置在水平行或垂直列中。
.container { flex-direction: row | row-reverse | column | column-reverse; }
flex-wrap
默認情況下,子元素不會換行,隻會在同一行(或列)中放置,可以使用此屬性設置換行。
.container{ flex-wrap: nowrap | wrap | wrap-reverse; }
flex-flow
它是 flex-direction 和 flex-wrap 屬性的縮寫.
flex-flow: <'flex-direction'> || <'flex-wrap'>
默認是: flex-flow: row nowrap
justify-content
定義子元素在主軸上的對齊方式。
.container { justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly; }
align-items
定義子元素在交叉軸上如何對齊。
.container { align-items: stretch | flex-start | flex-end | center | baseline; }
align-content
定義容器内部多行元素的行對齊方式,類似于 justify-content 定義主軸内元素的對齊方式。
注意: 當隻有一行元素時,此屬性不生效
.container { align-content: flex-start | flex-end | center | space-between | space-around | stretch; }
Flex 容器内部的子元素也有 6 個屬性,分别是:
order
默認情況下,元素按原始順序排列,但是該屬性可以控制元素在 Flex 容器中的顯示順序,數值越小,越靠前,默認為 0。
.item { order: <integer>; /* default is 0 */ }
flex-grow
定義元素在必要時擴大的能力s,比如容器還有剩餘空間。默認為 0,有空間也不擴大。
如果所有元素都設置為 1,那麼會均攤容器剩餘的空間;如果其中一個元素值為 2,那麼它占的剩餘空間是其他元素的兩倍(至少盡量會這樣做)。
注意: 負值無效。
.item { flex-grow: <number>; /* default 0 */ }
flex-shrink
定義元素在必要時縮小的能力,默認為 1,即如果空間不足,該元素将會縮小。
相對的,如果所有元素此屬性值都為 1,空間不足時會等比例縮小;如果有一個元素值為 0,其他為 1,空間不足時,前者不縮小。
注意: 負值無效。
.item { flex-shrink: <number>; /* default 1 */ }
flex-basis
定義在分配容器剩餘空間之前,如何判斷子元素的大小,浏覽器根據此屬性計算主軸剩餘空間的大小。
值可設為指定長度(如 20%, 5rem)或關鍵字(auto)。默認為 auto,元素的大小依據 main size(主尺寸),如果 main size 為 auto,則使用元素内容的最大長度。
.item { flex-basis: <length> | auto; /* default auto */ }
子元素在彈性擴大時, flex-basis 的不同可能會造成不一樣的結果,下圖分别是"絕對"(從0開始算起)彈性和"相對"(從元素内容長度開始算起)彈性的差異結果。
其中三個子元素 flex-grow 的值為 1:1:2:
由于浏覽器計算主軸剩餘空間的大小不同,所以導緻元素彈性結果的不同。
flex
該屬性是 flex-grow, flex-shrink 和 flex-basis 的簡寫,其中第二個和第三個參數( flex-shrink 和 flex-basis )是可選的.
.item { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] }
默認是 flex: 0 1 auto, 建議優先使用此屬性,它有兩個簡便使用的關鍵字: auto(1 1 auto) 和 none(0 0 auto).
align-self
允許元素覆蓋默認的或是使用 align-items 指定的對齊方式。
.item { align-self: auto | flex-start | flex-end | center | baseline | stretch; }
除了 auto, 其他屬性值都與 align-items 一緻。
注意: float, clear 和 vertical-align 對 flex 容器内的元素不生效。
浏覽器支持
其中:
最後回到題目的問題,常用的垂直居中,隻需将 flex 容器的 align-items 和 justify-content 屬性值設為 center 即可。
參考 CSS-Tricks: A Complete Guide to Flexbox
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!