flex 布局

flexflexible Box的縮寫,意為"彈性布局",用來為盒狀模型提供最大的靈活性。任何一個容器都可以指定為flex布局。

display

.container {
  display: flex | inline-flex;
}

定義一個flex容器,為內(nèi)容創(chuàng)建了一個新的flex環(huán)境
注意:當設(shè)置 flex 布局之后,子元素的 float、clear、vertical-align 的屬性將會失效。

1. 父容器display: flex
2. 父容器display: inline-flex


flex: 將元素作為彈性伸縮盒顯示
inline-flex: 將元素作為內(nèi)聯(lián)塊級彈性伸縮盒顯示
使用flex時父元素是block元素,而聲明了inline-flex的父元素變成了inline元素

原理

賦予父容器更改子元素寬高(或順序)的能力,來更好的填充可用的空間(主要使其適應(yīng)各種顯示設(shè)備和屏幕尺寸)。一個使用flexbox布局的父容器會伸展每個子元素來填充可用的空間,或者壓縮它們來阻止超出父容器。

最重要的是,flexbox布局在方向上是不可預(yù)知的,這一點和常歸布局不同(常規(guī)布局中塊是基于豎直方向排列的,而內(nèi)聯(lián)是基于水平方向)。這些常規(guī)布局在頁面中顯示都沒問題,但它們?nèi)狈`活性,難以支撐大型復(fù)雜應(yīng)用的需求,特別是響應(yīng)方向、大小、伸展、收縮等這些變化。

適用場景

flexbox最適合用在組件和小規(guī)模的布局中,如果是更復(fù)雜的布局,Grid布局會比較好一些。
由于flexbox是一個完整的模塊,它不單單是一個屬性,而是包含了一整套新的屬性集。這些屬性中一些是用來設(shè)置父容器的,而另外一些是設(shè)置子元素的。

flex 基本概念


flexbox主要由父容器和它的直接子元素組成,父容器被稱為flex容器(flex container),而其直接的子元素稱作為flex子類(flex item)
以下flex容器簡稱為containerflex子類簡稱item

main axis和cross axis

flex box中存在兩條軸,主軸main axis,和側(cè)軸cross axis

  • main axis: flex容器的主軸主要用來配置flex項目。注意,它不一定是水平,這主要取決于flex-direction屬性。
  • main-start | main-end: flex項目的配置從容器的主軸起點邊開始,向主軸終點邊結(jié)束
  • cross axis: 與主軸垂直的軸稱作側(cè)軸,是側(cè)軸方向的延伸
  • cross-start | cross-end: 伸縮行的配置從容器的側(cè)軸起點邊開始,往側(cè)軸終點邊結(jié)束

item 是沿著main axis(起點main-start終點main-end)或者cross axis(起點cross-start終點cross-end)排列

main size和cross size

  • main size: 每個item占據(jù)的主軸空間為main sizeitem的主軸長度是width還是height,由主軸方向決定。
  • cross size: 每個item占據(jù)的交叉軸的空間為cross size,item的側(cè)軸長度是widthheight,由側(cè)軸方向決定

要記住并不是寬度是main size,高度是cross size,是要根據(jù)主軸的方向來定義哪個是main size。如果垂直方向是主軸,則item的高度就是main size


下面來分別介紹flex containerflex item

flex容器

屬性

flex容器六種屬性,分別是:
1. flex-direction
2. flex-wrap
3. flex-flow
4. justfy-content
5. align-items
6. align-content

flex-direction


創(chuàng)建了主軸,定義了itemflex容器中的方向。 flexbox是單向布局,可以將item放在水平行或垂直列中

.container {
  flex-direction: row | row-reverse | column | column-reverse;
}

row(默認): 如果書寫方式是ltr,那么item從左向右排列;如果書寫方式是rtl,那么item從右向左排列
row-reverse: 如果書寫方式是ltr,那么item從右向左排列;如果書寫方式是rtl,那么item從左向右排列
column:row類似,只不過方向是從上到下排列
column-reverse:row-reverse類似,只不過方向是從下向上排列
點我看Demo

flex-wrap


默認情況下,項目都排在主軸線上,使用 flex-wrap 可實現(xiàn)項目的換行

.container {
   flex-wrap: nowrap | wrap | wrap-reverse;
}

nowrap(默認): 不換行,所有item會在一行
wrap: 多行顯示,向下折行
wrap-reverse: 多行顯示,向上折行
點我看Demo

flex-flow

flex-directionflex-wrap 的簡寫形式,能夠同時定義flex容器的主軸和交叉軸

.container {
  flex-flow: <flex-direction> || <flex-wrap>;
}

默認值: row nowrap中間有空格

justify-content

這個屬性定義了item在主軸方向?qū)R方式

.container {
  justify-content: flex-start | flex-end | center | space-between | space-around;
}

flex-start: 以主軸main-start端對齊
flex-end: 以主軸main-end方向?qū)R
center: 主軸居中
space-between: 兩端對齊,item之間相等間隔。如果是間距負數(shù),或該行只有一個item,則此值等效于flex-start
space-around: 每個item兩側(cè)的間隔相等,所以item之間的間隔比item與邊緣的間隔大一倍。如果剩余空間是負數(shù),或該行只有一個item,則該值等效于center
點我看Demo

align-items

這個屬性定義了item 在側(cè)軸上的對齊方式

.container {
  align-items: flex-start | flex-end | center | stretch | baseline;
}

stretch(默認): 當cross size未設(shè)置或者為auto時,拉伸至等于容器高度(會受到min-width/max-width的限制)
flex-start: 以側(cè)軸的cross-start端對齊
flex-end: 以側(cè)軸的cross-end端對齊
center: 以側(cè)軸的中點對齊
baseline: 以item的第一行文字的基線對齊
點我看Demo

align-content


當側(cè)軸上還有空間時,align-content屬性可以指定container中多行item之間的對齊方式
注意:定義了多根軸線的對齊方式,如果item只有一根軸線,那么該屬性將不起作用
如下:
flex-wrap: nowrap ,容器僅存在一根軸線,因為item不會換行,就不會產(chǎn)生多條軸線。
flex-wrap: wrap ,容器可能會出現(xiàn)多條軸線,這時候你就需要去設(shè)置多條軸線之間的對齊方式了。

.container {
  align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}

flex-start: 在側(cè)軸的開始處將所有item連接起來,最后將空間全部包含在內(nèi)
flex-end: 在側(cè)周的末端將所有item連接起來,所有空間都在開頭
center: 將所有item拼接在十字軸的中間,每個末端的空間均等
space-between: 除了子元素之間的所有空間以及它們在交叉軸上的所有空間都是等量的
space-around: 具有非常相似的效果space-between,但Flexbox子系列的每一端都有較少的空間
點我看Demo


flex item

注意:一旦聲明了flex布局,那么float, clear和vertical-align對item將無效

屬性

flex item 六種屬性,分別是:
1. order
2. flex-basis
3. flex-grow
4. flex-shrink
5. flex
6. align-self

order

默認情況,item按文檔順序顯示。order屬性可以改變item的出現(xiàn)的位置。(索引從0開始)

.item {
  order: <integer>; /* default is 0 */
}

點我看Demo

flex-grow

定義item放大比

flex-grow.png

.item {
  flex-grow: <number>; /* default 0 */
}

點我看Demo

flex-shrink

定義item的收縮比例,當item寬度之和大于容器的寬度,才會發(fā)生收縮

.item {
  flex-shrink: <number>; /* default 1 */
}

number等于負數(shù)無效
點我看Demo

flex-basis

定義item在主軸方向上的初始大小,瀏覽器根據(jù)此屬性,計算主軸是否有多余空間。如果不使用 box-sizing來改變盒模型的話,那么這個屬性就決定了flex元素的內(nèi)容盒(content-box)的寬或者高(取決于主軸的方向)的尺寸大小。

.item {
  flex-basis: <length> | auto; /* default auto */
}

默認值:auto,即項目本來的大小, 這時候 item 的寬高取決于 widthheight的值
當主軸為水平方向的時候,當設(shè)置了 flex-basis,項目的寬度設(shè)置值會失效,flex-basis 需要跟 flex-growflex-shrink 配合使用才能發(fā)揮效果。

  • flex-basis值為 0 % 時,是把該項目視為零尺寸的,故即使聲明該尺寸為 140px,也并沒有什么用。
  • flex-basis 值為 auto 時,則跟根據(jù)尺寸的設(shè)定值(假如為 100px),則這 100px 不會納入剩余空間。

flex

flex-grow, flex-shrinkflex-basis的簡寫

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}

flex-shrinkflex-basis為可選項
默認為0 1 auto
快捷值:auto (1 1 auto)none (0 0 auto)
點我看Demo

align-self


允許單個項目有與其他項目不一樣的對齊方式

.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

align-self作用在flex item上,屬性值的效果和align-items的相似

flexbugs

瀏覽器前綴

flex布局需要加一些瀏覽器前綴來兼容大多數(shù)的瀏覽器。Flex布局的前綴不只是在屬性前面添加瀏覽器前綴,不同瀏覽器下的屬性名和屬性值都不同,這是因為Flexbox布局的標準一直在變,一共有old, tweener, new 三個版本。

可能處理前綴的最好方法是使用新的語法書寫CSS并通過Autoprefixer運行CSS,能夠很好地處理這個問題。

Flex布局的三個版本

  • new: 現(xiàn)在的最新版
  • tweener: 2011過度版本
  • old: 2009版本

兼容性

chrome safari firefox Opera IE Edge Android iOS
20- 3.1+ 2-21 10 2.1+ 3.2+
21+ 6.1+ 22+ 12.1+ 10 12+ 4.4+ 7.1+
21+ 6.1+ 22+ 12.1+ 11+ 12+ 4.4+ 7.1+

混合三個版本使用可以兼容到:

  • Chrome any
  • Firefox any
  • Safari any
  • Opera 12.1+
  • IE 10+
  • iOS any
  • Android any
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容