1. 程式人生 > >flex佈局學習

flex佈局學習

關於flex佈局

學習 Flex 佈局,你只要學習幾個 CSS 屬性,就可以寫出簡潔優雅複雜的頁面佈局。

fle

Flex佈局是什麼?

在 flex 容器中預設存在兩條軸,水平主軸(main axis) 和垂直的交叉軸(cross axis),這是預設的設定,當然你可以通過修改使垂直方向變為主軸,水平方向變為交叉軸,這個我們後面再說。

在容器中的每個單元塊被稱之為 flex item,每個專案佔據的主軸空間為 (main size), 佔據的交叉軸的空間為 (cross size)。

這裡需要強調,不能先入為主認為寬度就是 main size,高度就是 cross size,這個還要取決於你主軸的方向,如果你垂直方向是主軸,那麼專案的高度就是 main size。

Flexbox 佈局依賴於 flex directions ,簡單的說: Flexbox 是一個佈局模組,而不是一個屬性。採用Flexbox的元素,稱為 Flex容器 (flex container),它的所有子元素 (flex item)自動成為容器成員。

跟 LinearLayout 類似, Flexbox 也存在兩個方向的佈局:主軸(main axis)和副軸(cross axis也稱交叉軸),可以簡單的理解為 LinearLayout 的水平佈局和垂直佈局。主軸的開始位置(與邊框的交叉點)叫做 main start ,結束位置叫做main end ;交叉軸的開始位置叫做cross start ,結束位置叫做 cross end 。專案預設沿主軸排列。單個專案佔據的主軸空間叫做 main size,佔據的交叉軸空間叫做 cross size 。

Flex 容器:

Flexbox是Flexible Box的縮寫,意為”彈性佈局”,它為盒狀模型提供了很大的靈活性,讓任何一個容器都可以指定為Flex佈局。

下面程式碼塊分別生成一個塊狀或行內的 flex 容器盒子。簡單說來,如果你使用塊元素如 div,你就可以使用 flex,而如果你使用行內元素,你可以使用 inline-flex。

.container {
    display: flex | inline-flex;       //可以有兩種取值
}


Webkit核心的瀏覽器,必須加上-webkit字首。

.box{
  display: -webkit-flex; /* Safari */
  display: flex;
}

注意,設為Flex佈局以後,子元素的float、clear和vertical-align屬性將失效。

Flexbox的屬性

Flexbox的屬性可以分為 flex container屬性 和 flex item 屬性 兩類。他們分別對應父容器子元素,下面讓我們分別看一下他們都是怎麼回事。

1. flex container 屬性(容器的屬性)主要包含一下幾個方面

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

1.1 flex-direction:屬性決定主軸的方向(即專案的排列方向)

.box {
  flex-direction: row | row-reverse | column | column-reverse;
}

有四個值可以選擇:

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

1.2 flex-wrap屬性: 決定容器內專案是否可換行

預設情況下,專案都排在主軸線上,使用 flex-wrap 可實現專案的換行。

.container {
    flex-wrap: nowrap | wrap | wrap-reverse;
}
  • nowrap (預設值):不換行
    在這裡插入圖片描述

  • wrap:換行,第一行在上方。
    -在這裡插入圖片描述

  • wrap-reverse:換行,第一行在下方。
    在這裡插入圖片描述

1.3 flex-flow: flex-direction 和 flex-wrap 的簡寫形式

flex-flow屬性是flex-direction屬性和flex-wrap屬性的簡寫形式,預設值為 row || nowrap(“||”代表flex-direction和flex-wrap必須至少有一個,二者之間使用空格隔開,相應的屬性請看上面)

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

預設值為: row nowrap,感覺沒什麼卵用,老老實實分開寫就好了。這樣就不用記住這個屬性了

1.4 justify-content:定義了專案在主軸的對齊方式

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

它可能取5個值,具體對齊方式與軸的方向有關。下面假設主軸為從左到右。

  • flex-start(預設值):左對齊
  • flex-end:右對齊
  • center: 居中
  • space-between:兩端對齊,專案之間的間隔都相等。
  • space-around:每個專案兩側的間隔相等。所以,專案之間的間隔比專案與邊框的間隔大一倍。

在這裡插入圖片描述

1.5 align-content屬性: 定義了多根軸線的對齊方式,如果專案只有一根軸線,那麼該屬性將不起作用

align-content屬性定義了多根軸線的對齊方式。如果專案只有一根軸線,該屬性不起作用。

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

該屬性可能取6個值。

  • flex-start:與交叉軸的起點對齊。
  • flex-end:與交叉軸的終點對齊。
  • center:與交叉軸的中點對齊。
  • space-between:與交叉軸兩端對齊,軸線之間的間隔平均分佈。
  • space-around:每根軸線兩側的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍。
  • stretch(預設值):軸線佔滿整個交叉軸。
    在這裡插入圖片描述

1.6 align-items屬性: 定義了專案在交叉軸上的對齊方式

align-items屬性定義專案在交叉軸上(副軸)如何對齊。

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

它可能取5個值。具體的對齊方式與交叉軸的方向有關,下面假設交叉軸從上到下。

  • flex-start:交叉軸的起點對齊。
  • flex-end:交叉軸的終點對齊。
  • center:交叉軸的中點對齊。
  • baseline: 專案的第一行文字的基線對齊。
  • stretch(預設值):如果專案未設定高度或設為auto,將佔滿整個容器的高度。

在這裡插入圖片描述

2. flex item(子元素屬性)

以下6個屬性設定在專案上:

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

2.1 order屬性:定義專案在容器中的排列順序,數值越小,排列越靠前,預設值為 0

預設情況下子元素的排列方式按照文件流的順序依次排序,而 order 屬性可以控制排列的順序,負值在前,正值在後(和一維座標系是相似的),按照從小到大的順序依次排列。

.item {
    order: <integer>;
}

在這裡插入圖片描述

2.2 flex-grow屬性

flex-grow屬性定義專案的放大比例,預設為0,即如果存在剩餘空間,也不放大。

.item {
  flex-grow: <number>; /* default 0 */
}

在這裡插入圖片描述
如果所有專案的flex-grow屬性都為1,則它們將等分剩餘空間(如果有的話)。如果一個專案的flex-grow屬性為2,其他專案都為1,則前者佔據的剩餘空間將比其他項多一倍。

2.3 flex-shrink屬性

flex-shrink屬性定義了專案的縮小比例,預設為1,即如果空間不足,該專案將縮小。

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

在這裡插入圖片描述

如果所有專案的flex-shrink屬性都為1,當空間不足時,都將等比例縮小。如果一個專案的flex-shrink屬性為0,其他專案都為1,則空間不足時,前者不縮小。

負值對該屬性無效。

2.4 flex-basis屬性

flex-basis屬性定義了在分配多餘空間之前,專案佔據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸是否有多餘空間。它的預設值為auto,即專案的本來大小。

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

它可以設為跟width或height屬性一樣的值(比如350px),則專案將佔據固定空間。

2.5 flex屬性

flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,預設值為0 1 auto。後兩個屬性可選。

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

該屬性有兩個快捷值:auto (1 1 auto) 和 none (0 0 auto)。

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

2.6 align-self屬性

align-self屬性允許單個專案有與其他專案不一樣的對齊方式,可覆蓋align-items屬性。預設值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同於stretch。

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

在這裡插入圖片描述

該屬性可能取6個值,除了auto,其他都與align-items屬性完全一致。

Demo

當螢幕寬度小於 640px 時,調整 Flexbox 的屬性以實現第四個元素移動到最前面的效果,而不要改動第一個元素的邊框顏色與高度實現。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>task10</title>
  <style>
    .container {
      display: flex;
      align-items: center;
      justify-content: space-between;
    }
    .item {
      flex: 0 0 auto;
      width: 150px;
      border: 1px solid #f00;
    }
    .item1 {
      height: 120px;
    }
    .item2 {
      height: 100px;
    }
    .item3 {
      height: 40px;
    }
    .item4 {
      height: 200px;
      border-color: #0f0;
    }
    @media screen and (max-width: 640px) {
      .container {
        display: flex;
        align-items: flex-start;
        flex-wrap: wrap;
      }
      .item4 {
        order: -1;
      }
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="item item1">寬度 150px, 高度 120px, 邊框顏色 #f00</div>
    <div class="item item2">寬度 150px, 高度 100px, 邊框顏色 #f00</div>
    <div class="item item3">寬度 150px, 高度 40px, 邊框顏色 #f00</div>
    <div class="item item4">寬度 150px, 高度 200px, 邊框顏色 #0f0</div>
  </div>
</body>
</html>

在這裡插入圖片描述

在這裡插入圖片描述

線上demo演示:

demo

參考: