簡(jiǎn)言
布局的傳統(tǒng)解決方案是基于盒狀模型丈牢,依賴 display
+ position
+ float
方式來實(shí)現(xiàn)祭钉,靈活性較差。2009年己沛,W3C提出了一種新的方案-Flex慌核,F(xiàn)lex是Flexible Box的縮寫距境,意為”彈性布局”。Flex可以簡(jiǎn)便垮卓、完整垫桂、響應(yīng)式地實(shí)現(xiàn)多種頁面布局。下面我們就從基礎(chǔ)語法開始粟按,一起來感受下Flex的魅力吧诬滩!
1 基本概念
采用 Flex 布局的元素,稱為 Flex 容器(flex container)灭将,簡(jiǎn)稱"容器"疼鸟。它的所有子元素自動(dòng)成為容器成員,稱為 Flex 項(xiàng)目(flex item)庙曙,簡(jiǎn)稱"項(xiàng)目"空镜。
容器默認(rèn)存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開始位置(與邊框的交叉點(diǎn))叫做main start捌朴,結(jié)束位置叫做main end姑裂;交叉軸的開始位置叫做cross start,結(jié)束位置叫做cross end男旗。
Flex項(xiàng)目默認(rèn)沿主軸排列舶斧。單個(gè)項(xiàng)目占據(jù)的主軸空間叫做main size,占據(jù)的交叉軸空間叫做cross size察皇。
Flex屬性分為兩部分茴厉,一部分作用于容器稱容器屬性,另一部分作用于項(xiàng)目稱為項(xiàng)目屬性什荣。下面我們就分部的來介紹它們矾缓。
2 Flex容器屬性
2.1 flex容器定義
基本語法:
.box {
display: flex; /* 或者 inline-flex */
}
上述寫法,定義了一個(gè)flex容器稻爬,根據(jù)設(shè)值的不同可以是塊狀容器或內(nèi)聯(lián)容器嗜闻。這使得直接子結(jié)點(diǎn)擁有了一個(gè)flex上下文。
2.2 flex-direction
flex-direction
屬性決定主軸的方向(即項(xiàng)目的排列方向)桅锄。
基本語法:
.box {
flex-direction: row | row-reverse | column | column-reverse;
}
-
row
表示從左向右排列 -
row-reverse
表示從右向左排列 -
column
表示從上向下排列 -
column-reverse
表示從下向上排列
演示程序:
2.3 flex-wrap
缺省情況下琉雳,F(xiàn)lex項(xiàng)目都排在一條線(又稱"軸線")上。我們可以通過flex-wrap
屬性的設(shè)置友瘤,讓Flex項(xiàng)目換行排列翠肘。
基本語法:
.box {
flex-wrap: nowrap | wrap | wrap-reverse;
}
-
nowrap
(缺省):所有Flex項(xiàng)目單行排列 -
wrap
:所有Flex項(xiàng)目多行排列,按從上到下的順序 -
wrap-reverse
:所有Flex項(xiàng)目多行排列辫秧,按從下到上的順序
演示程序:
觀察上述演示程序 束倍,理解不同屬性的含義。點(diǎn)擊演示區(qū)域,可啟動(dòng)或停止演示绪妹。
2.4 flex-flow
flex-flow
屬性是flex-direction
屬性和flex-wrap
屬性的簡(jiǎn)寫形式甥桂,默認(rèn)值為row nowrap
基本語法:
.box {
flex-flow: <‘flex-direction’> || <‘flex-wrap’>
}
2.5 justify-content
justify-content
屬性定義了項(xiàng)目在主軸上的對(duì)齊方式及額外空間的分配方式。
基本語法:
.box {
justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly;
}
-
flex-start
(缺省):從啟點(diǎn)線開始順序排列 -
flex-end
:相對(duì)終點(diǎn)線順序排列 -
center
:居中排列 -
space-between
:項(xiàng)目均勻分布邮旷,第一項(xiàng)在啟點(diǎn)線格嘁,最后一項(xiàng)在終點(diǎn)線 -
space-around
:項(xiàng)目均勻分布,每一個(gè)項(xiàng)目?jī)蓚?cè)有相同的留白空間廊移,相鄰項(xiàng)目之間的距離是兩個(gè)項(xiàng)目之間留白的和 -
space-evenly
:項(xiàng)目均勻分布糕簿,所有項(xiàng)目之間及項(xiàng)目與邊框之間距離相等
演示程序:
2.6 align-items
align-items
屬性定義項(xiàng)目在交叉軸上的對(duì)齊方式。
基本語法:
.box {
align-items: stretch | flex-start | flex-end | center | baseline;
}
-
stretch
(缺省):交叉軸方向拉伸顯示 -
flex-start
:項(xiàng)目按交叉軸起點(diǎn)線對(duì)齊 -
flex-end
:項(xiàng)目按交叉軸終點(diǎn)線對(duì)齊 -
center
:交叉軸方向項(xiàng)目中間對(duì)齊 -
baseline
:交叉軸方向按第一行文字基線對(duì)齊
演示程序:
2.7 align-content
align-content
屬性定義了在交叉軸方向的對(duì)齊方式及額外空間分配狡孔,類似于主軸上justify-content
的作用懂诗。
基本語法:
.box {
align-content: stretch | flex-start | flex-end | center | space-between | space-around ;
}
-
stretch
(缺省):拉伸顯示 -
flex-start
:從啟點(diǎn)線開始順序排列 -
flex-end
:相對(duì)終點(diǎn)線順序排列 -
center
:居中排列 -
space-between
:項(xiàng)目均勻分布,第一項(xiàng)在啟點(diǎn)線苗膝,最后一項(xiàng)在終點(diǎn)線 -
space-around
:項(xiàng)目均勻分布殃恒,每一個(gè)項(xiàng)目?jī)蓚?cè)有相同的留白空間,相鄰項(xiàng)目之間的距離是兩個(gè)項(xiàng)目之間留白的和
演示程序:
3 Flex項(xiàng)目屬性
3.1 order
缺省情況下辱揭,F(xiàn)lex項(xiàng)目是按照在代碼中出現(xiàn)的先后順序排列的离唐。然而order
屬性可以控制項(xiàng)目在容器中的先后順序。
基本語法:
.item {
order: <integer>; /* 缺省 0 */
}
按order
值從小到大順序排列问窃,可以為負(fù)值亥鬓,缺省為0。
演示程序:
3.2 flex-grow
flex-grow
屬性定義項(xiàng)目的放大比例域庇,flex-grow
值是一個(gè)單位的正整數(shù)嵌戈,表示放大的比例。默認(rèn)為0听皿,即如果存在額外空間熟呛,也不放大,負(fù)值無效尉姨。
如果所有項(xiàng)目的flex-grow屬性都為1庵朝,則它們將等分剩余空間(如果有的話)。如果一個(gè)項(xiàng)目的flex-grow屬性為2又厉,其他項(xiàng)目都為1九府,則前者占據(jù)的剩余空間將比其他項(xiàng)多一倍。
基本語法:
.item {
flex-grow: <number>; /* 缺省 0 */
}
演示程序:
3.3 flex-shrink
flex-shrink
屬性定義了項(xiàng)目的縮小比例馋没,默認(rèn)為1昔逗,即如果空間不足降传,該項(xiàng)目將縮小篷朵。0表示不縮小,負(fù)值無效。
基本語法:
.item {
flex-shrink: <number>; /* 缺省 1 */
}
演示程序:
3.4 flex-basis
flex-basis
屬性定義項(xiàng)目在分配額外空間之前的缺省尺寸声旺。屬性值可以是長(zhǎng)度(20%笔链,10rem等)或者關(guān)鍵字auto
。它的默認(rèn)值為auto腮猖,即項(xiàng)目的本來大小鉴扫。
基本語法:
.item {
flex-basis: <length> | auto; /* 缺省 auto */
}
演示程序:
3.5 flex
flex
屬性是flex-grow
, flex-shrink
和flex-basis
的簡(jiǎn)寫,默認(rèn)值為0 1 auto澈缺。后兩個(gè)是可選屬性坪创。
基本語法:
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
一般推薦使用這種簡(jiǎn)寫的方式,而不是分別定義每一個(gè)屬性姐赡。
3.6 align-self
align-self
屬性定義項(xiàng)目的對(duì)齊方式莱预,可覆蓋align-items屬性。默認(rèn)值為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需要一些特定的前綴以支持大多數(shù)的瀏覽器州疾。甚至還存在完全不同的屬性名稱或?qū)傩灾倒枷蕖_@就需要Autoprefixer或類似的CSS后處理器的輔助,具體內(nèi)容請(qǐng)參考相關(guān)文檔严蓖。