flex布局語法篇

原文地址:flex布局語法篇

之前寫過一篇關(guān)于實(shí)現(xiàn)元素居中的博文,我們發(fā)現(xiàn)每種布局要求都可以運(yùn)用flex布局實(shí)現(xiàn)。其實(shí)令元素居中只是flex強(qiáng)大的其中一個體現(xiàn),可以說不管是什么布局,flex往往都可以幾行命令搞定。今天我就來總結(jié)一下關(guān)于flex語法方面的內(nèi)容。

基本概念

Flex是Flexible Box的縮寫,意為"彈性布局",用來為盒狀模型提供最大的靈活性。flex是一個布局模塊,而不是一個簡單的屬性,它可以實(shí)現(xiàn)各種各樣的布局,可以在任何流動的方向上(包括上下左右)都能進(jìn)行良好的布局,也以彈性的在任意的容器中伸縮大小,可以方便讓元素對齊容器的左、右、中間等等。任何元素都可以指定flex布局,但是要注意設(shè)為Flex布局以后,子元素的float、clear和vertical-align屬性將失效。

相關(guān)術(shù)語

  1. 彈性容器(Flex container):包含著彈性項目的父元素。通過設(shè)置 display 屬性的值為 flex 或 inline-flex 來定義彈性容器。
  2. 彈性項目(Flex item):彈性容器的每個子元素都稱為彈性項目。彈性容器直接包含的文本將被包覆成匿名彈性單元。
  3. 軸(Axis):每個彈性框布局包含兩個軸。彈性項目沿其依次排列的那根軸稱為主軸(main axis)。垂直于主軸的那根軸稱為側(cè)軸(cross axis)。
  4. 方向(Direction):彈性容器的主軸起點(diǎn)(main start)/主軸終點(diǎn)(main end)和側(cè)軸起點(diǎn)(cross start)/側(cè)軸終點(diǎn)(cross end)描述了彈性項目排布的起點(diǎn)與終點(diǎn)。

容器的屬性

flex-direction

flex-direction定義了伸縮容器的主軸,決定了伸縮項目放置在伸縮容器的方向 。

    flex-direction: row | row-reverse | column | column-reverse
  • row(默認(rèn)值):主軸為水平方向,起點(diǎn)在左端。
  • row-reverse:主軸為水平方向,起點(diǎn)在右端。
  • column:主軸為垂直方向,起點(diǎn)在上沿。
  • column-reverse:主軸為垂直方向,起點(diǎn)在下沿。

flex-wrap

flex-wrap定義了伸縮容器的側(cè)軸,側(cè)軸的方向決定了新行堆放的方向(即是否換行)。

    flex-wrap: nowrap | wrap | wrap-reverse    
  • nowrap(默認(rèn)值):不換行。
  • wrap:換行,第一行在上方。
  • wrap-reverse:換行,第一行在下方。

flex-flow

flex-flow是flex-direction和flex-wrap屬性的縮寫;同時定義了伸縮容器的主軸和側(cè)軸,其默認(rèn)值為row nowrap。

     flex-flow: <flex-direction> || <flex-wrap>   

舉個栗子:

    .container-1{
        flex-flow: row-reverse wrap-reverse;
    }
    .container-2{
        flex-flow: column wrap;
    }

justify-content

justify-content定義了項目在主軸上的對齊方式。

    justify-content: flex-start | flex-end | center | space-between | space-around
  • flex-start(默認(rèn)值):向起始位置靠齊。
  • flex-end:向結(jié)束位置靠齊。
  • center:居中。
  • space-between:兩端對齊,項目之間的間隔都相等。
  • space-around:每個項目兩側(cè)的間隔相等。所以,項目之間的間隔比項目與邊框的間隔大一倍。

align-items

align-items定義項目在側(cè)軸上如何對齊,

    align-items: flex-start | flex-end | center | baseline | stretch
  • stretch(默認(rèn)值):如果項目未設(shè)置高度或設(shè)為auto,將占滿整個容器的高度。
  • flex-start:側(cè)軸的起點(diǎn)對齊。
  • flex-end:側(cè)軸的終點(diǎn)對齊。
  • center:側(cè)軸的中點(diǎn)對齊。
  • baseline: 項目的第一行文字的基線對齊。
    下面例圖基于主軸方向為flex-direction:row,水平對齊方式為justify-content: space-between,依次改變側(cè)軸對齊方式 align-items:

align-content

align-content定義了多根軸線(多行排列)的對齊方式。如果項目只有一根軸線(單行),該屬性不起作用,即必須設(shè)置換行flex-wrap: wrap。這個屬性與上面的align-items相似,把一根軸線(行)看作是一個項目就好理解了。

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

項目的屬性

order

order屬性定義項目的排列順序。數(shù)值越小,排列越靠前,默認(rèn)值為0,伸縮項目是按照文檔流出現(xiàn)先后順序排列??梢匀∝?fù)值。

    order: <integer>    

舉個栗子:


下面讓第一個元素排在最后,最后一個元素排在第一個

    .container{
        display: flex;
    }        
            
    .container .item-6{
        order: -1;
    }
    .container .item-1{
        order: 1;
    }   

flex-grow

flex-grow定義項目的擴(kuò)展比例,項目根據(jù)容器的剩余空間按比例擴(kuò)展。默認(rèn)值為0,即如果存在剩余空間,也不擴(kuò)展。如果所有項目的flex-grow屬性都為1,則它們將等分剩余空間(如果有的話)。如果一個項目的flex-grow屬性為2,其他項目都為1,則前者占據(jù)的剩余空間將比其他項多一倍。負(fù)值對該屬性無效。

    flex-grow: <number>   

舉個栗子:

    .container-1,.container-2,.container-3{
            margin-bottom: 30px;
            display: flex;
            justify-content: space-between;
    }
    .container-2 .item-1,.container-2 .item-2,.container-2 .item-3{
           flex-grow: 1;
    }
    .container-3 .item-2{
           flex-grow: 2;
    }
    .container-3 .item-1,.container-3 .item-3{
           flex-grow: 1;
    }   

flex-shrink

flex-shrink定義了項目的縮小比例,默認(rèn)為1,即如果空間不足,該項目將縮小。如果所有項目的flex-shrink屬性都為1,當(dāng)空間不足時,都將等比例縮小。如果一個項目的flex-shrink屬性為0,其他項目都為1,則空間不足時,前者不縮小。負(fù)值對該屬性無效。

    flex-shrink: <number>  

舉個栗子:

    .container-1,.container-2,.container-3{
        display: flex;
        margin-bottom: 30px;
        justify-content: space-between;
    }
    
    .container-2 .item-1,.container-2 .item-2,.container-2 .item-3{
        flex-shrink: 0;
    }
    .container-3 .item-1{
        flex-shrink: 0;
    }
    .container-3 .item-2{
        flex-shrink: 1;
    }
    
    .container-3 .item-3{
        flex-shrink: 2;
    } 

align-self

align-self屬性允許單個項目有與其他項目不一樣的對齊方式,可覆蓋align-items屬性。默認(rèn)值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同于stretch。

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

舉個栗子:

    .container{
        display: flex;
        align-items: flex-start;
    }
    .container .item-4{
        align-self: flex-end;
    }

flex-basis

flex-basis定義了在分配多余空間之前,項目占據(jù)的主軸空間(main size)。瀏覽器根據(jù)這個屬性,計算主軸是否有多余空間。它的默認(rèn)值為auto,即項目的本來大小。它可以設(shè)為跟width或height屬性一樣的值,則項目將占據(jù)固定空間。

    flex-basis: <length> | auto  

flex

flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,默認(rèn)值為0 1 auto。后兩個屬性可選。該屬性有兩個快捷值:auto (1 1 auto) 和 none (0 0 auto)。

    flex: none | [ <flex-grow> <flex-shrink> || <flex-basis> ]   

小結(jié)

今天的flex語法就說這么多吧,寫這篇文章參考了阮一峰老師的flex語法教程,他寫的真的特別好,清晰有條理,也通俗易懂,我參照他的教程加入自己的理解,寫出這篇博文,文章里所有的例子圖片都是我自己敲著代碼做出來的,也算是收獲巨大,后面有時間的話還會再寫一篇關(guān)于flex實(shí)例的文章,學(xué)以致用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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