一、場景
一個容器設(shè)置了 display: flex;屬性就定義了一個flex容器,它的直接子元素會接受這個flex環(huán)境
二、屬性
1?flex-direction
設(shè)置或檢索伸縮盒對象的子元素在父容器中的位置
.container {
flex-direction: row | row-reverse | column | column-reverse;
}
row 默認(rèn)值,水平從左到右
row-reverse 水平從右到左
column 垂直從上到下
column-reverse 垂直從下到上
2?flex-wrap
設(shè)置或檢索彈性盒模型對象的子元素超出父容器時是否換行
默認(rèn)所有的flex item會嘗試放在一行中,可以通過設(shè)置flex-wrap設(shè)置新行的方向
.container{
flex-wrap: nowrap | wrap | wrap-reverse;
}
nowrap 默認(rèn)值,不換行
wrap 換行
wrap-reverse 換行,并且顛倒行順序
3?flex-flow
flex-direction 和 flex-wrap 的縮寫,默認(rèn)值row nowrap
flex-flow: <‘flex-direction’> || <‘flex-wrap’>
設(shè)置或檢索彈性盒子元素在主軸(橫軸)方向上的對齊方式,當(dāng)彈性盒里一行上的所有子元素都不能伸縮或已經(jīng)達(dá)到其最大值時,這一屬性可協(xié)助對多余的空間進(jìn)行分配。當(dāng)元素溢出某行時,這一屬性同樣會在對齊上進(jìn)行控制
.container {
justify-content: flex-start | flex-end | center | space-between | space-around;
}
flex-start 默認(rèn)值、彈性盒子元素將向行起始位置對齊
flex-end 彈性盒子元素將向行結(jié)束位置對齊
center彈性盒子元素將向行中間位置對齊。該行的子元素將相互對齊并在行中居中對齊
space-between 彈性盒子元素會平均地分布在行里
space-around 彈性盒子元素會平均地分布在行里,兩端保留子元素與子元素之間間距大小的一半
4?align-items
設(shè)置或檢索彈性盒子元素在側(cè)軸(縱軸)方向上的對齊方式
.container {
align-items: flex-start | flex-end | center | baseline | stretch;
}
flex-start 彈性盒子元素的側(cè)軸(縱軸)起始位置的邊界緊靠住該行的側(cè)軸起始邊界。
flex-end 彈性盒子元素的側(cè)軸(縱軸)起始位置的邊界緊靠住該行的側(cè)軸結(jié)束邊界。
center 彈性盒子元素在該行的側(cè)軸(縱軸)上居中放置。(如果該行的尺寸小于彈性盒子元素的尺寸,則會向兩個方向溢出相同的長度)。
baseline 如彈性盒子元素的行內(nèi)軸與側(cè)軸為同一條,則該值與flex-start等效。其它情況下,該值將參與基線對齊。
stretch 如果指定側(cè)軸大小的屬性值為'auto',則其值會使項目的邊距盒的尺寸盡可能接近所在行的尺寸,但同時會遵照'min/max-width/height'屬性的限制。
5?align-content
設(shè)置或檢索彈性盒堆疊伸縮行的對齊方式
.container {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
flex-start 各行向彈性盒容器的起始位置堆疊。彈性盒容器中第一行的側(cè)軸起始邊界緊靠住該彈性盒容器的側(cè)軸起始邊界,之后的每一行都緊靠住前面一行。
flex-end 各行向彈性盒容器的結(jié)束位置堆疊。彈性盒容器中最后一行的側(cè)軸起結(jié)束界緊靠住該彈性盒容器的側(cè)軸結(jié)束邊界,之后的每一行都緊靠住前面一行。
center 各行向彈性盒容器的中間位置堆疊。各行兩兩緊靠住同時在彈性盒容器中居中對齊,保持彈性盒容器的側(cè)軸起始內(nèi)容邊界和第一行之間的距離與該容器的側(cè)軸結(jié)束內(nèi)容邊界與第最后一行之間的距離相等。
space-between 各行在彈性盒容器中平均分布。第一行的側(cè)軸起始邊界緊靠住彈性盒容器的側(cè)軸起始內(nèi)容邊界,最后一行的側(cè)軸結(jié)束邊界緊靠住彈性盒容器的側(cè)軸結(jié)束內(nèi)容邊界,剩余的行則按一定方式在彈性盒窗口中排列,以保持兩兩之間的空間相等。
space-around 各行在彈性盒容器中平均分布,兩端保留子元素與子元素之間間距大小的一半。各行會按一定方式在彈性盒容器中排列,以保持兩兩之間的空間相等,同時第一行前面及最后一行后面的空間是其他空間的一半。
stretch 各行將會伸展以占用剩余的空間。剩余空間被所有行平分,以擴(kuò)大它們的側(cè)軸尺寸。
然后是用在子元素上的屬性
6?order
在默認(rèn)情況下flex order會按照書寫順訓(xùn)呈現(xiàn),可以通過order屬性改變,數(shù)值小的在前面,還可以是負(fù)數(shù)
.item {
order: <integer>;
}
8?flex-shrink
設(shè)置或檢索彈性盒的收縮比率,根據(jù)彈性盒子元素所設(shè)置的收縮因子作為比率來收縮空間
.item {
flex-shrink: <number>; /* default 1 */
}
10?flex
flex-grow, flex-shrink,flex-basis 的縮寫
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
11?align-self
設(shè)置或檢索彈性盒子元素在側(cè)軸(縱軸)方向上的對齊方式,可以覆蓋父容器align-items的設(shè)置
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
三、實例
1?flex-basis
用于設(shè)置子項的占用空間。如果設(shè)置了值,則子項占用的空間為設(shè)置的值;如果沒設(shè)置或者為 auto,那子項的空間為width/height 的值

解析:
(1)、對于子項1,flex-basis 如果設(shè)置默認(rèn)是auto,子項占用的寬度使用width 的寬度,width沒設(shè)置也為 auto,所以子項占用空間由內(nèi)容決定
(2)、對于子項2,flex-basis 為auto,子項占用寬度使用width 的寬度,width 為70px,所以子項子項占用空間是70px
(3)、對于子項3,flex-basis 為100px,覆蓋width 的寬度,所以子項占用空間是100px
demo地址 http://js.jirengu.com/weqoc/5/edit?html,output
2?flex-grow
用來“瓜分”父項的“剩余空間”

解析:
(1)、容器的寬度為400px, 子項1的占用的基礎(chǔ)空間(flex-basis)為50px,子項2占用的基礎(chǔ)空間是70px,子項3占用基礎(chǔ)空間是100px,剩余空間為 400-50-70-100 = 180px
(2)、其中子項1的flex-grow: 0(未設(shè)置默認(rèn)為0), 子項2flex-grow: 2,子項3flex-grow: 1,剩余空間分成3份,子項2占2份(120px),子項3占1份(60px)。
(3)、所以 子項1真實的占用空間為: 50+0 = 50px, 子項2真實的占用空間為: 70+120 = 190px, 子項3真實的占用空間為: 100+60 = 160px
demo地址:http://js.jirengu.com/sivoy/1/edit?html,css,js,output
3?flex-shrink
用來“吸收”超出的空間

解析:
(1)、容器的寬度為400px, 子項1的占用的基準(zhǔn)空間(flex-basis)為250px,子項2占用的基準(zhǔn)空間是150px,子項3占用基準(zhǔn)空間是100px,總基準(zhǔn)空間為 250+150+100=500px。
(2)、容器放不下,多出來的空間需要被每個子項根據(jù)自己設(shè)置的flex-shrink 進(jìn)行吸收。 子項1的flex-shrink: 1(未設(shè)置默認(rèn)為1), 子項2 flex-shrink: 2,子項3 flex-shrink: 2
子項1需要吸收的的空間為 (250*1)/(250*1+150*2+100*2) * 100 = 33.33px,子項1真實的空間為 250-33.33 = 216.67px。同理子項2吸收的空間為(150*2)/(250*1+150*2+100*2) * 100=40px,子項2真實空間為 150-40 = 110px。子項3吸收的空間為(100*2)/(250*1+150*2+100*2) * 100 = 26.67px,真實的空間為100-26.67=73.33px
demo地址:http://jsbin.com/pozebetibu/edit?html,output