CSS Flexbox詳解

Flexbox是一個強大而靈活的布局,本篇文章主要對其進行學習了解所踊。

一泌枪、Flexbox簡介

Flexbox布局(Flexible Box)模塊旨在提供一個更加有效的方式制定、調整和分布一個容器里的項目布局秕岛,即使他們的大小是未知或者是動態(tài)的碌燕。簡單的理解,就是可以自動調整继薛,計算元素在容器空間中的大小修壕,并進行有效合理的布局。

Flexbox布局中有兩個重要的概念:Flex容器和Flex項目遏考。

Flex容器包含多個Flex項目慈鸠,通過對Flex容器和Flex項目的具體屬性進行設置,可以達到各種各樣靈活的布局樣式灌具。

Flexbox使用

Flexbox的使用非常簡單青团,只需要對Flex容器設置display:flex或者display:inline-flex,就可以具體操作使用Flexbox布局了咖楣。

下面以具體示例演示:

html代碼

<div class="container">
        <div class="wrap">
            <div></div>
            <div></div>
            <div></div>
        </div>
    </div>

css代碼

.container {
    width: 70%;
    height: 500px;
    margin:20px auto;
    border: 1px solid black;
}
.container .wrap {
    display: flex;
    border: 3px solid #a448cf;
    margin:20px;
    width:80%;
    height:80%  
}
.container .wrap div {
    width:150px;
    height:150px;
    background-color: #c75a5a;
    margin:10px;
}

二壶冒、Flex容器

首先介紹下Flex容器的具體屬性以及具體的使用方式。

屬性 含義
flex-direction row || column || row-reverse || column-reverse 控制Flex項目沿著主軸(Main Axis)的排列方向
flex-wrap wrap || nowrap || wrap-reverse 控制Flex項目是否換行顯示
flex-flow row wrap|| row nowrap || column wrap || column nowrap 等 flex-direction和flex-wrap兩個屬性的組合速記屬性
justify-content flex-start || flex-end || center || space-between || space-around 控制 Flex項目在Main-Axis上的對齊方式
align-items flex-start || flex-end || center || stretch || baseline 控制Flex項目在Cross-Axis對齊方式
align-content flex-start || flex-end || center || stretch 用于多行的Flex容器截歉,控制Flex項目在Cross-Axis對齊方式

1. flex-direction

flex-direction屬性控制Flex項目沿著主軸(Main Axis)的排列方向胖腾,可以是行(水平)、列(垂直)或者行和列的反向瘪松。

默認情況下flex-direction的屬性值是row,具體排列方式如下:

但是當flex-direction的屬性值是column咸作,對應的主軸就應該垂直向下。

具體應用示例如下:


2. flex-wrap

flex-wrap屬性控制Flex項目是否換行宵睦。默認情況下记罚,F(xiàn)lex容器會在一行內容納所有的Flex項目,因為flex-wrap屬性的默認值是nowrap壳嚎,也就是不換行桐智。

具體應用示例如下:


其中wrap-reverse表示Flex項目在容器中多行排列末早,只是方向是反的。

3. flex-flow

flex-flowflex-directionflex-wrap兩個屬性的速記屬性说庭。

具體不再解釋然磷,看下面示例即可:


4. justify-content

justify-content屬性,控制Flex項目在整個Main-Axis上的對齊方式刊驴。

justify-content的默認屬性值是flex-start姿搜。

space-between讓flex項目兩端對齊。

space-around讓每個flex項目具有相同的空間

5. align-items

align-items控制Flex項目在Cross-Axis對齊方式捆憎。

align-items的默認值是stretch舅柜,讓所有的Flex項目高度和Flex容器高度一樣,鋪展開躲惰。


baseline讓所有flex項目在Cross-Axis上沿著他們自己的基線對齊致份。

其中stretchbaseline在不設置具體高度值,才會如上表現(xiàn)础拨,否則會顯示固定的高度氮块。

align-content屬性與align-items作用相同,不過該屬性只針對多行太伊,對單行無效雇锡。

三逛钻、Flex項目

接下來繼續(xù)介紹Flex項目的具體屬性及使用方法僚焦。

屬性 含義
order 數(shù)值 根據order值重新排序。從底到高曙痘。
flex-grow 0 || positive number 控制Flex項目在容器有多余的空間如何放大
flex-shrink 0 || positive number 控制Flex項目在容器 沒有額外空間又如何縮小
flex-basis auto || % || em || rem || px 指定Flex項目的初始大小
align-self auto || flex-start || flex-end || center || baseline || stretch 控制單個Flex項目在Cross-Axis對齊方式

1. order

order允許Flex項目在一個Flex容器中重新排序芳悲,屬性默認值是0。

依據order值的大小進行排序边坤,按照值從低到高依次排序名扛。

默認情況下,排序如下:


當將方塊1設置order:1后茧痒,排序如下:

如果肮韧,多個Flex項目具有相同的order值,F(xiàn)lex項目重新排序是基于HTML源文件的位置進行排序旺订。

如下所示弄企,將方塊1和方塊2都設置為order:1

2. flex-grow 和 flex-shrink

flex-growflex-shrink屬性控制Flex項目在容器有多余的空間如何放大(擴展)区拳,在沒有額外空間又如何縮小拘领。

flex-growflex-shrink 的值可以為 0或者大于0的任何正數(shù)。

默認情況下樱调,flex-grow屬性值設置為0约素,表示Flex項目不會增長届良,填充Flex容器可用空間。

默認情況下圣猎,flex-shrink屬性值設置為1士葫,表示Flex項目會縮小,適應屏幕寬度样漆。

如果把flex-grow的值設置為1为障,如下所示:

當多個flex項目在一行內,即不換行時放祟,設置不同的flex-growflex-shrink 值鳍怨,對應的空間分配也不同。

flex-grow

將每一個item所設置的 grow 全部加起來跪妥,獲得可用空間鞋喇,然后除以總的grow值,得到單位分配空間眉撵。

根據每一個item 設置的 grow 來算侦香,如果一個item 的grow 為 6,那么 這個 item 在主軸上的尺寸就需要延伸 6*單位分配空間的大小纽疟。

flex-shrink

先將所有項目 按照 flex-shrink * item-size 的方式加起來 得到一個加權和罐韩,然后計算出 每一份 item 的 shrink比例: shrink比例 = flex-shrink * item-size / 之前的總和。最后每一個item 減去這個 shrink比例 * 負可用空間污朽。

在flex項目有min-width(height)max-width(height)時散吵,對應的項目要考慮上下限值,把剩余的伸縮值分配給其他項目蟆肆。

3. flex-basis

flex-basis指定了 flex 元素在主軸方向上的初始大小矾睦,即決定了 flex項目內容的寬或者高(取決于主軸的方向)的尺寸大小。

默認情況炎功,F(xiàn)lex項目的初始寬度由flex-basis的默認值決定枚冗,即:flex-basis: auto。Flex項目寬度的計算是基于內容的多少來自動計算蛇损。

flex-basiswidth/height有一定的優(yōu)先級赁温,具體規(guī)則如下:

  • flex-basis 的優(yōu)先級比 width/height 非auto高
  • width/height auto優(yōu)先級等于 flex-basis,取兩者中的最大值淤齐。

4. align-self

align-self 控制單個項目沿著Cross-Axis的對其方式股囊。

除了auto之外,上述示例中flex容器設置了align-itmes:center床玻。

auto 是將目標flex項目的值設置為父元素的 align-items值毁涉,或者如果該元素沒有父元素的話,就設置為 stretch锈死。上述示例中align-items:stretch贫堰。

四穆壕、總結

以上是對flexbox的整體介紹,可以看出其強大與靈活其屏。除此之外喇勋,flexbox還有很多其他的特性以及問題,這里就不再介紹偎行,建議看以下兩篇文章涂籽,寫的很好乐导,本文也主要參考了這兩篇文章。

理解Flexbox:你需要知道的一切

深入理解 flex 布局以及計算

如果想實踐一下對flexbox的掌握,可以試著做百度前端技術學院中的這個作業(yè)搔涝。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末着裹,一起剝皮案震驚了整個濱河市揉忘,隨后出現(xiàn)的幾起案子最疆,更是在濱河造成了極大的恐慌,老刑警劉巖珍德,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件练般,死亡現(xiàn)場離奇詭異,居然都是意外死亡锈候,警方通過查閱死者的電腦和手機薄料,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泵琳,“玉大人摄职,你說我怎么就攤上這事÷羌冢” “怎么了琳钉?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵势木,是天一觀的道長蛛倦。 經常有香客問我,道長啦桌,這世上最難降的妖魔是什么溯壶? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮甫男,結果婚禮上且改,老公的妹妹穿的比我還像新娘。我一直安慰自己板驳,他們只是感情好又跛,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著若治,像睡著了一般慨蓝。 火紅的嫁衣襯著肌膚如雪感混。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天礼烈,我揣著相機與錄音弧满,去河邊找鬼。 笑死此熬,一個胖子當著我的面吹牛庭呜,可吹牛的內容都是我干的。 我是一名探鬼主播犀忱,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼募谎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了阴汇?” 一聲冷哼從身側響起近哟,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲫寄,沒想到半個月后吉执,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡地来,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年戳玫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片未斑。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡咕宿,死狀恐怖,靈堂內的尸體忽然破棺而出蜡秽,到底是詐尸還是另有隱情府阀,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布芽突,位于F島的核電站试浙,受9級特大地震影響,放射性物質發(fā)生泄漏寞蚌。R本人自食惡果不足惜田巴,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挟秤。 院中可真熱鬧壹哺,春花似錦、人聲如沸艘刚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箩朴,卻和暖如春笛臣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隧饼。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工沈堡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人燕雁。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓诞丽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拐格。 傳聞我的和親對象是個殘疾皇子僧免,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內容

  • H5移動端知識點總結 閱讀目錄 移動開發(fā)基本知識點 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,501評論 0 26
  • 前言 FlexBox是css3的一種新的布局方式,天生為解決布局問題而存在的它捏浊,比起傳統(tǒng)的布局方式懂衩,我們使用Fle...
    zevei閱讀 1,420評論 23 3
  • 移動開發(fā)基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,472評論 0 6
  • Flexbox布局官方稱之為CSS Flexible Box布局模塊,他是CSS3中的一種新的布局模式。Flexb...
    流動碼文閱讀 702評論 0 3
  • 簡書的Markdown貌似不支持插入iframe金踪,所以文章里的JSFiddle示例都改做截圖了浊洞,如果有需要可以點擊...
    kangflict閱讀 1,123評論 2 8