flexbox(彈性盒布局模型),以及適用場景


一、是什么

Flexible Box 簡稱 flex,意為”彈性布局”,可以簡便、完整、響應式地實現各種頁面布局

采用Flex布局的元素,稱為flex容器container

它的所有子元素自動成為容器成員,稱為flex項目item

 

 

容器中默認存在兩條軸,主軸和交叉軸,呈90度關系。項目默認沿主軸排列,通過flex-direction來決定主軸的方向

每根軸都有起點和終點,這對於元素的對齊非常重要

二、屬性

關於flex常用的屬性,我們可以划分為容器屬性和容器成員屬性

容器屬性有:

  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-items
  • align-content

flex-direction

決定主軸的方向(即項目的排列方向)

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

屬性對應如下:

  • row(默認值):主軸為水平方向,起點在左端
  • row-reverse:主軸為水平方向,起點在右端
  • column:主軸為垂直方向,起點在上沿。
  • column-reverse:主軸為垂直方向,起點在下沿

如下圖所示:

 

 

flex-wrap

彈性元素永遠沿主軸排列,那么如果主軸排不下,通過flex-wrap決定容器內項目是否可換行

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

屬性對應如下:

  • nowrap(默認值):不換行
  • wrap:換行,第一行在上方
  • wrap-reverse:換行,第一行在上方

默認情況是不換行,但這里也不會任由元素直接溢出容器,會涉及到元素的彈性伸縮

flex-flow

flex-direction屬性和flex-wrap屬性的簡寫形式,默認值為row nowrap

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

justify-content

定義了項目在主軸上的對齊方式

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

屬性對應如下:

  • flex-start(默認值):左對齊
  • flex-end:右對齊
  • center:居中
  • space-between:兩端對齊,項目之間的間隔都相等
  • space-around:兩個項目兩側間隔相等

效果圖如下:

 

 

align-items

定義項目在交叉軸上如何對齊

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

屬性對應如下:

  • flex-start:交叉軸的起點對齊
  • flex-end:交叉軸的終點對齊
  • center:交叉軸的中點對齊
  • baseline: 項目的第一行文字的基線對齊
  • stretch(默認值):如果項目未設置高度或設為auto,將占滿整個容器的高度

align-content

定義了多根軸線的對齊方式。如果項目只有一根軸線,該屬性不起作用

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

屬性對應如嚇:

  • flex-start:與交叉軸的起點對齊
  • flex-end:與交叉軸的終點對齊
  • center:與交叉軸的中點對齊
  • space-between:與交叉軸兩端對齊,軸線之間的間隔平均分布
  • space-around:每根軸線兩側的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍
  • stretch(默認值):軸線占滿整個交叉軸

效果圖如下:

 

 

容器成員屬性如下:

  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • flex
  • align-self

order

定義項目的排列順序。數值越小,排列越靠前,默認為0

.item {
    order: <integer>;
}

flex-grow

上面講到當容器設為flex-wrap: nowrap;不換行的時候,容器寬度有不夠分的情況,彈性元素會根據flex-grow來決定

定義項目的放大比例(容器寬度>元素總寬度時如何伸展)

默認為0,即如果存在剩余空間,也不放大

.item {
    flex-grow: <number>;
}

如果所有項目的flex-grow屬性都為1,則它們將等分剩余空間(如果有的話)

 

 

如果一個項目的flex-grow屬性為2,其他項目都為1,則前者占據的剩余空間將比其他項多一倍

 

 

彈性容器的寬度正好等於元素寬度總和,無多余寬度,此時無論flex-grow是什么值都不會生效

flex-shrink

定義了項目的縮小比例(容器寬度<元素總寬度時如何收縮),默認為1,即如果空間不足,該項目將縮小

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

如果所有項目的flex-shrink屬性都為1,當空間不足時,都將等比例縮小

如果一個項目的flex-shrink屬性為0,其他項目都為1,則空間不足時,前者不縮小

 

 

在容器寬度有剩余時,flex-shrink也是不會生效的

flex-basis

設置的是元素在主軸上的初始尺寸,所謂的初始尺寸就是元素在flex-growflex-shrink生效前的尺寸

瀏覽器根據這個屬性,計算主軸是否有多余空間,默認值為auto,即項目的本來大小,如設置了width則元素尺寸由width/height決定(主軸方向),沒有設置則由內容決定

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

當設置為0的是,會根據內容撐開

它可以設為跟widthheight屬性一樣的值(比如350px),則項目將占據固定空間

flex

flex屬性是flex-growflex-shrink 和 flex-basis的簡寫,默認值為0 1 auto,也是比較難懂的一個復合屬性

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

一些屬性有:

  • flex: 1 = flex: 1 1 0%
  • flex: 2 = flex: 2 1 0%
  • flex: auto = flex: 1 1 auto
  • flex: none = flex: 0 0 auto,常用於固定尺寸不伸縮

flex:1 和 flex:auto 的區別,可以歸結於flex-basis:0flex-basis:auto的區別

當設置為0時(絕對彈性元素),此時相當於告訴flex-growflex-shrink在伸縮的時候不需要考慮我的尺寸

當設置為auto時(相對彈性元素),此時則需要在伸縮時將元素尺寸納入考慮

注意:建議優先使用這個屬性,而不是單獨寫三個分離的屬性,因為瀏覽器會推算相關值

align-self

允許單個項目有與其他項目不一樣的對齊方式,可覆蓋align-items屬性

默認值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同於stretch

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

效果圖如下:

 

 

三、應用場景

在以前的文章中,我們能夠通過flex簡單粗暴的實現元素水平垂直方向的居中,以及在兩欄三欄自適應布局中通過flex完成,這里就不再展開代碼的演示

包括現在在移動端、小程序這邊的開發,都建議使用flex進行布局

參考文獻

  • https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex
  • http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM