Flex 布局

一、場景

一個容器設(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 的值

image.png

解析:

(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

用來“瓜分”父項的“剩余空間”

image.png

解析:

(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

用來“吸收”超出的空間

image.png

解析:

(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

參考

A Complete Guide to Flexbox
MDN
demo代碼

最后編輯于
?著作權(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ù)。

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