flex布局語法篇

原文地址:flex布局語法篇

之前寫過一篇關于實現元素居中的博文,我們發現每種布局要求都可以運用flex布局實現。其實令元素居中只是flex強大的其中一個體現,可以說不管是什么布局,flex往往都可以幾行命令搞定。今天我就來總結一下關于flex語法方面的內容。

基本概念

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

相關術語

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

容器的屬性

flex-direction

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

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

flex-wrap

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

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

flex-flow

flex-flow是flex-direction和flex-wrap屬性的縮寫;同時定義了伸縮容器的主軸和側軸,其默認值為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(默認值):向起始位置靠齊。
  • flex-end:向結束位置靠齊。
  • center:居中。
  • space-between:兩端對齊,項目之間的間隔都相等。
  • space-around:每個項目兩側的間隔相等。所以,項目之間的間隔比項目與邊框的間隔大一倍。

align-items

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

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

align-content

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

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

項目的屬性

order

order屬性定義項目的排列順序。數值越小,排列越靠前,默認值為0,伸縮項目是按照文檔流出現先后順序排列。可以取負值。

    order: <integer>    

舉個栗子:


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

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

flex-grow

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

    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定義了項目的縮小比例,默認為1,即如果空間不足,該項目將縮小。如果所有項目的flex-shrink屬性都為1,當空間不足時,都將等比例縮小。如果一個項目的flex-shrink屬性為0,其他項目都為1,則空間不足時,前者不縮小。負值對該屬性無效。

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

    flex-basis: <length> | auto  

flex

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

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

小結

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

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

推薦閱讀更多精彩內容