CSS Flex Box

What is Flex?

Flex 是 Flexible Box 的縮寫,意為"彈性布局",用來為盒狀模型提供最大的靈活性。

W3C于2009年提出了這一方案,時至今日,常用的瀏覽器已經全部都提供了對它的支持(當然不包括IE8)。

Flex瀏覽器支持情況

Why to use Flex?

簡便的實現頁面布局。

How to use Flex?

為一個元素簡單地設置 display: flex; 就使得其成為Flex容器(flex container),其內部的所有子元素自動成為容器中的成員(flex item)。

容器默認存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開始位置(與邊框的交叉點)叫做(main start),結束位置叫做main end;交叉軸的開始位置叫做cross start,結束位置叫做cross end

項目默認沿主軸水平排列。單個項目占據的主軸空間叫做main size,占據的交叉軸空間叫做cross size

Flex基本概念

注意:
當一個元素設置為 display: flex; 后, 其子元素(即flex item)的float,clear和vertical-align屬性將無效。

對于Webkit內核的瀏覽器需要加上-webkit前綴。

Flex Container Attributes


  1. flex-direction: row | row-reverse | column | column-reverse;
    該屬性決定flex item在容器中的排列方向,默認為row,即水平從左 → 右排列;column為從 上 ↓ 下排列;加-reverse后綴,即和原先排列順序相反。
  2. flex-wrap: nowrap | wrap | wrap-reverse;
    該屬性決定flex item在容器中是否換行,換行的方式又是什么,默認為nowrap,即不換行。wrap為換行,當flex-direction為row時,內容從 上 ↓ 下按行排列;當flex-direction為column時,內容從 左 → 右按列排列;加-reverse后綴,即和原先排列順序相反。
  3. flex-flow: <flex-direction> || <flex-wrap>
    該屬性是flex-directionflex-wrap的簡寫形式,默認值是原屬性flex-directionflex-wrap的默認值,即row nowrap。
  4. justify-content: flex-start | flex-end | center | space-between | space-around;
    該屬性決定flex item在行內的水平對齊方式或列內的垂直對齊方式,默認值是flex-start。
    flex-start: 與軸的start對齊,即左對齊(flex-direction: row),上對齊(flex-direction: column)
    flex-end:與軸的end對齊,即右對齊(flex-direction:row),下對齊(flex-direction:column)
    center: 與軸的的中點對齊
    space-between:與軸的兩端對齊,flex-item之間的間隔都相等,頭尾的flex item緊貼軸的start位置
    space-around:每個flex item兩側的間隔相等。所以,flex item之間的間隔比flex item與軸的start之間的間隔大一倍
    注意:
    flex item默認是沒有間距的,間距是由flex container的寬度或高度與flex item的寬度或高度之間的差產生的,即如果flex container的寬度為1000px,flex item的寬度為100px,container下有10個item,那無論justify-content設任何的值,展示都將是10個item緊貼地并列排列,item與item之間沒有任何間隙。
  5. align-items: flex-start | flex-end | center | baseline | stretch;
    該屬性與justify-content相反,決定flex item在行內的垂直對齊方式或列內的水平對齊方式,默認值是stretch。
    flex-start:與軸的start對齊
    flex-end:與軸的end對齊
    center:與軸的的中點對齊
    baseline: 與flex item的第一行文字的baseline對齊
    stretch:如果flex item未設置寬度或高度或設為auto,將占滿這行的高度或這列的寬度
    注意:
    baseline屬性在container的flex-direction設置為column時無效。
    當align-items屬性值設置為stretch時,如一個flex item設置了寬度或高度,則這個flex item應用flex-start,且只對該flex item生效。
  6. align-content: flex-start | flex-end | center | space-between | space-around | stretch;
    該屬性類似于justify-content屬性,與之不同的是,該屬性決定flex item每行或每列在flex container下的對齊方式,如果flex item只有一行或一列,則該屬性無效,默認值為stretch。
    flex-start:與軸的start對齊
    flex-end:與軸的end對齊
    center:與軸的中點對齊
    space-between:與軸的兩端對齊,軸線之間的間隔都相等
    space-around:每根軸線兩側的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍
    stretch:軸線占滿整個交叉軸
    注意:
    align-content屬性設定為flex-start、flex-end或center時,軸與軸之間默認是沒有間隔的。

Flex Item Attributes


  1. order: <integer>;
    該屬性定義flex item的排列順序,數值越小,排列越靠前,默認值為0。
    注意:數值可以為負數。
  2. flex-grow: <number>;
    該屬性定義flex item的放大比例,默認值為0,即使有空余空間也不放大該元素。
    注意:數值可以為小數,但不能為負數。
  3. flex-shrink: <number>;
    該屬性與flex-grow相反,定義flex item的縮小比例,默認值為1,即空間不足時,等比例縮小元素;flex-grow為0,則空間不足時也不縮小該元素。
    注意:數值可以為小數,但不能為負數。
  4. flex-basis: <length> | auto;
    該屬性定義在分配剩余空間之前,flex item占所在軸的大小,默認值為auto,即原有元素大小。
    注意:該屬性設定的大小為未分配剩余空間之前的大小,flex item最終顯示的大小會受flex-grow或flex-shrink的影響。
  5. flex: auto | none | [ <flex-grow> <flex-shrink>? || <flex-basis> ];
    該屬性是flex-growflex-shrinkflex-basis的簡寫,默認值為各屬性的默認值,0 1 auto。
    該屬性還有2個快捷值:auto(1 1 auto), 即flex item根據container的內容大小自動縮放;none(0 0 auto),即flex item保持自身元素大小,不進行縮放。
  6. align-self: auto | flex-start | flex-end | center | baseline | stretch;
    該屬性用來設置只用于自身的對齊方式,將覆蓋container的align-items屬性,默認值為auto,即繼承父屬性的align-items屬性。

TRY


俗話說的好,光說不練假把式,既然已經清楚了概念,我就嘗試使用這些特性,看到阮老師的另一篇文章后,自己也嘗試做了一遍,通過flex完成了骰子的6個面。

骰子的六面
點擊查看源碼

如果理解了flex容器的特性,那么上面的列子嘗試起來并不難,只有在第5點的時候遇到一些小障礙,如何畫中間那個點,最后是通過給第3個點增加兩邊的margin,使元素的寬度增加來處理。如果你也對這個有興趣可以參考這里,里面也有幾種不同的實現,或許對你也有所啟發,如果你有更好的想法,歡迎留言交流。

另外,在查資料時還發現CSS3 box-flex,一看描述和內容,完全和flex是同一個東西啊。

  • display: box:彈性模型第一版,不推薦使用(適用于老版本瀏覽器)。
  • display: flexbox:box升級版,不推薦使用(適用于老版本瀏覽器)。
  • display: flex:最新的彈性模型版本,推薦使用。

參考資料:

  1. 阮一峰 Flex 布局教程:語法篇
  2. A Complete Guide to Flexbox
  3. 阮一峰 Flex 布局教程:實例篇
  4. Getting Dicey With Flexbox
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 移動開發基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,514評論 0 6
  • H5移動端知識點總結 閱讀目錄 移動開發基本知識點 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,623評論 0 26
  • 寫在前面 之前一直對于布局有一種迷茫,不知道該如何學習,以及學習到什么程度,在論壇上進行了提問,老師給我做了解答。...
    KoalaT閱讀 308評論 0 2
  • 閱讀目錄移動開發基本知識點 calc基本用法box-sizing的理解及使用理解display:box的布局理解f...
    張憲宇閱讀 1,562評論 0 1
  • Flexbox簡介 Flexbox Layout(Flexible Box)模塊,W3C官方稱為CSS彈性盒子布局...
    _李楊閱讀 440評論 0 2