CSS布局之彈性盒子-flexbox(下)

采用Flex布局的元素,稱為Flex容器(flex container),簡稱”容器”。它的所有子元素自動成為容器成員,稱為Flex項目(flex item),簡稱”項目”。

上篇介紹設置在容器上的屬性,本篇繼續介紹設置在項目上的屬性。

六、設置在項目上的屬性

  1. order – 決定flex元素的順序。

  2. align-self – 自身對齊交叉軸,覆蓋父元素設置的align-items
    align-self屬性接受和align-items一樣的那些值。

  3. flex-grow –定義項目的放大比例,默認為0,即如果存在剩余空間,也不放大。

  4. flex-shrink –定義項目的縮小比例,默認為1,即如果空間不足,該項目將縮小。

  5. flex-basis –在分配多余空間之前,項目占據的主軸空間。

  6. flex –flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,默認值為0 1 auto。后兩個屬性可選


項目上主軸方向相關屬性

1 項目-主軸:order

語法:

order: number

order屬性規定了彈性容器中的可伸縮項目在布局時的順序。元素按照 order 屬性的值的增序進行布局。擁有相同 order 屬性值的元素按照它們在源代碼中出現的順序進行布局。

.test {
    width: 600px;
    border: 1px solid #000;
    display: flex;
}
.test p{
    width: 100px;
    height: 100px;
    background-color: red;
    line-height: 100px;
    text-align: center;
    margin: 8px;
}
.item1 {
            order: 1;
}
.item2 {
    order: 0;
}
.item3 {
    order: -1;
}

<div class="test">
    <p class="item1">1</p>
    <p class="item2">2</p>
    <p class="item3">3</p>
</div>
order.png

注意點:

  • 所有 flex 項默認的 order 值是 0。
  • order 值大的 flex 項比 order 值小的在顯示順序中更靠后。
  • 相同 order 值的 flex 項按源順序顯示。所以假如你有四個元素,其 order 值分別是2,1,1和0,那么它們的顯示順序就分別是第四,第二,第三,和第一。
  • 第三個元素顯示在第二個后面是因為它們的 order 值一樣,且第三個元素在源順序中排在第二個后面。

2 項目-交叉軸:align-self

語法:

align-self: auto|stretch|center|flex-start|flex-end|baseline

設置在項目上的交叉軸方向的屬性只有一個,align-self自身對齊交叉軸,覆蓋父元素設置的align-items,屬性值列表和align-items相同。

屬性值:
flex-start: 元素與容器的頂部對齊。
flex-end: 元素與容器的底部對齊。
center: 元素縱向居中。
baseline: 元素在容器的基線位置顯示。
stretch: 元素被在側軸方向被拉伸到與容器相同的高度或寬度。

3 項目-主軸:flex-basis

語法:

flex-basis: number|auto

取值:

flex-basis指定了 flex 元素在主軸方向上的初始大小。如果不使用 box-sizing 來改變盒模型的話,那么這個屬性就決定了 flex 元素的內容盒(content-box)的寬或者高(取決于主軸的方向)的尺寸大小。

flex-basis 的取值有兩個:number和auto。

  • flex-basic 初始值默認取值是auto,
    如果主軸方向是水平方向(row),auto等于flex項目的寬度(width)。
    如果主軸方向是垂直方向(conlumn), auto等于flex項目的高度(height)。
  • flex-basis 取值為number, 表示可以設置flex元素的主軸方向的最小寬度或者最小高度,number 單位為px, rem。
  • 注意:flex-basis 取值為number會覆蓋掉flex項目原有的寬度或高度(取決于主軸的方向)。
.test {
    width: 600px;
    border: 1px solid #000;
    display: flex;
}
div p{
    width: 100px;
    height: 100px;
    line-height: 100px;
    text-align: center;
    margin: 10px;
}
.item1{
    background-color: red;
}
.item2 {
    background-color: green;
    flex-basis: 200px;
}
.item3 {
    background-color: orange;
    flex-basis: auto;
}

<div class="test">
    <p class="item1">1</p>
    <p class="item2">2</p>
    <p class="item3">3</p>
</div>

可見,item3和原始寬度一樣,item2的flex-basis的200px, 覆蓋掉width:100px,

flex-basis.png

4 容器-主軸:flex-grow

語法:

flex-grow: number

flex-grow 指的是當flex項目沒有占滿整個flex容器的空間時,每一個項目怎么變化,要不要變大去占據空間,grow就是生長,長大的意思。

flex-grow屬性定義項目的放大比例,默認為0,即不作任何的放大。flex容器下的項目是根據flex-grow值的權重對容器的剩余可用空間進行放大的。注意:剩余可用空間是減去所有flex元素后計算得到的空間大小。number負值無效。

.test {
    width: 600px;
    border: 1px solid #000;
    display: flex;
}
div p{
    height: 100px;
    line-height: 100px;
    text-align: center;
    margin: 10px;
    background-color: orange;
}
.item1{
    flex-grow: 1;
}
.item2 {
    flex-grow: 2;
}
.item3 {
    flex-grow: 3;
}

<div class="test">
    <p class="item1">1</p>
    <p class="item2">2</p>
    <p class="item3">3</p>
</div>
flex-grow.png

這里因為所有flex項目都沒有設置固定寬度,所以,他們會按照各自flex-basis設置值的占總體值之和的權重去擴展自身的寬度。
即item1占1份,item1的寬度為容器寬度的1/6。item2占2份,item2的寬度為容器寬度的2/6。item3占3份,item3的寬度為容器寬度的3/6。
注意:容器寬度為去掉margin和padding后的寬度。

5 容器-主軸:flex-shrink

語法:

flex-shrink: number

flex-shrink 指的是當flex項目超出整個flex容器的空間時,每一個項目怎么變化,要不要縮小去適應空間,shrink就是縮小的意思。

該屬性定義項目的縮小比例,默認為0,即不作任何的縮小。flex容器下的項目是根據這個值的權重得出容器的超出空間比例分配,對設置該屬性的項目進行縮小。number負值無效。

.test {
    width: 600px;
    border: 1px solid #000;
    display: flex;
}
div p{
    width: 300px;
    height: 100px;
    line-height: 100px;
    text-align: center;
    margin: 10px;
    background-color: orange;
}
.item1{
    flex-shrink: 0;
}
.item2 {
    flex-shrink: 1;
}
.item3 {
    flex-shrink: 2;
}
<div class="test">
    <p class="item1">1</p>
    <p class="item2">2</p>
    <p class="item3">3</p>
</div>
flex-shrink.png

這里flex容器的寬度設置成600px,flex項目的寬度均為300px;為item1分配完空間后,剩下的空間被后面兩個項目按比例縮小分配。

注意:容器寬度為去掉margin和padding后的寬度。
注意:flex 元素僅在默認寬度之和大于容器的時候才會發生收縮,其收縮的大小依據 flex-shrink 的值。比如:上邊示例中,容器test總寬度為600px,每個p寬度為300px,3個flex元素的寬度大于容器的寬度,所以3個p依據flex-shrink值進行收縮。

6 項目-主軸 flex

6.1 語法:

flex: flex-grow flex-shrink flex-basis | auto

flex屬性是前三個屬性:flex-grow、flex-shrink、flex-basis的簡寫形式。
除了可以分別填flex-grow、flex-shrink、flex-basis,這3個屬性值外。

6.2 flex還有2個經常使用的屬性值:

initial 屬性默認值,相當于將屬性設置為"flex: 0 1 auto"。
元素會根據自身寬高設置尺寸。它會縮短自身以適應容器,但不會伸長并吸收flex容器中的額外自由空間來適應容器 。
auto : 相當于將屬性設置為 "flex: 1 1 auto"。
元素會根據自身的寬度與高度來確定尺寸,但是會自行伸長以吸收flex容器中額外的自由空間,也會縮短至自身最小尺寸以適應容器。
none : 相當于將屬性設置為"flex: 0 0 auto"。
元素會根據自身寬高來設置尺寸。它是完全非彈性的:既不會縮短,也不會伸長來適應flex容器。

建議優先使用這個2個屬性,而不是單獨寫三個分離的屬性。

6.3 flex語法
flex 屬性可以指定1個,2個或3個值。

單值語法: 值必須為以下其中之一:

  • 一個無單位數(<number>): 它會被當作<flex-grow>的值。如:flex:1
  • 一個有效的寬度(width)值: 它會被當作 <flex-basis>的值。如:flex:200px
  • 關鍵字none, auto,或initial. 如:flex:auto

雙值語法: 第一個值必須為一個無單位數,并且它會被當作<flex-grow>的值。第二個值必須為以下之一:

  • 一個無單位數:它會被當作<flex-shrink>的值。如:flex:1 1
  • 一個有效的寬度值: 它會被當作<flex-basis>的值。如:flex:1 200px

三值語法:

  • 第一個值必須為一個無單位數,并且它會被當作<flex-grow>的值。
  • 第二個值必須為一個無單位數,并且它會被當作 <flex-shrink>的值。
  • 第三個值必須為一個有效的寬度值, 并且它會被當作<flex-basis>的值。
    如:flex:1 1 200px

結尾

至此,flex布局所有屬性都介紹完畢

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容