動態

詳情 返回 返回

一文吃透 CSS Flex 佈局 - 動態 詳情

原文鏈接:一文吃透 CSS Flex 佈局

教學遊戲

這裏有兩個小遊戲,可用來練習 flex 佈局。

塔防遊戲
送小青蛙回家

Flexbox 概述

Flexbox 佈局也叫 Flex 佈局,彈性盒子佈局。

它決定了元素如何在頁面上排列,使它們能在不同的屏幕尺寸和設備下可預測地展現出來,更簡便、完整、響應式地實現各種頁面佈局。

它的主要思想是使父元素能夠調整子元素的寬度、高度、排列方式,從而更好的適應可用的佈局空間。

任何一個容器都可以指定為 Flex 佈局。

.box{
  display: flex;
}

行內元素也可以使用 Flex 佈局。

.box{
display: inline-flex;
}

Webkit 內核的瀏覽器,必須加上-webkit前綴。

.box{
  display: -webkit-flex; /* Safari */
  display: flex;
}
注意,設為 Flex 佈局以後,子元素的floatclearvertical-align屬性將失效。當佈局涉及到不定寬度,分佈對⻬的場景時,我們可以優先考慮彈性盒佈局。

基本概念

採用 Flex 佈局的元素,稱為 Flex 容器(flex container),簡稱"容器"。它的所有 {% span blue , 子元素 %}(注意是子元素,不是全部後代元素)自動成為容器成員,稱為 Flex 項目(flex item),簡稱"項目"。

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

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

容器屬性

以下6個屬性設置在容器上。

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

flex-direction

flex-direction 屬性決定主軸的方向(即項目的排列方向)。

.box {
  flex-direction: row | row-reverse | column | column-reverse;
}
屬性值 含義
row 默認值,主軸為水平方向(水平佈局),起點在左端,從左向右排列
row-reverse 主軸為水平方向(水平佈局),起點在右端,從右向左排列
column 主軸為垂直方向(垂直佈局),起點在上沿,從上往下排列
column-reverse 主軸為垂直方向(垂直佈局),起點在下沿,從下往上排列

flex-wrap

默認情況下,項目都排在一條線(又稱"軸線")上。flex-wrap屬性定義,如果一條軸線排不下,如何換行。

.box{
  flex-wrap: nowrap | wrap | wrap-reverse;
}
屬性值 含義
nowrap 默認值,表示不換行
wrap 換行
wrap-reverse 換行,第一行在下方
  1. flex-wrap: nowrap: 默認值,不換行。當主軸的長度是固定並且空間不足時,項目尺寸會隨之進行調整,而不會換行。
  2. flex-wrap: wrap: 換行,第一行在上面
  3. wrap-reverse: 換行,第一行在下方。

flex-flow

flex-flow屬性是flex-direction屬性和flex-wrap屬性的簡寫形式,默認值為row nowrap

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

justify-content

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

.box {
  justify-content: flex-start | flex-end | center | space-between | space-around;
}
屬性值 含義
flex-start 默認值,左對齊
flex-end 右對齊
center 居中
space-between 兩端對齊,項目之間的間隔都相等
space-around 每個項目兩側的間隔相等。所以,項目之間的間隔比項目與邊框的間隔大一倍

flex-start
flex-end
center
space-between
space-around

align-items

align-items屬性定義項目在交叉軸上如何對齊。

.box {
  align-items: flex-start | flex-end | center | baseline | stretch;
}
屬性值 含義
flex-start 交叉軸的起點對齊
flex-end 交叉軸的終點對齊
center 交叉軸的中點對齊
baseline 項目的第一行文字的基線對齊
stretch (默認值) 如果項目未設置高度或設為auto,將佔滿整個容器的高度

(1)flex-start: 交叉軸的起點對齊(上面或左邊)。設置容器高度為 100px,項目高度分別為 20px、40px、60px、80px、100px,效果如圖所示:

(2)flex-end: 交叉軸的終點對齊(下面或右邊)。設置容器高度為 100px,項目高度分別為 20px、40px、60px、80px、100px,效果如圖所示:

(3)center: 交叉軸的中點對齊。設置容器高度為 100px,項目高度分別為 20px、40px、60px、80px、100px,效果如圖所示:

(4)stretch: 默認值、如果元素未設置高度或設為auto,將佔滿整個容器的高度。假設容器高度設置為 100px,而項目沒有設置高度,則項目的高度也為 100px:

(5)baseline:以元素的第一行文字的基線對齊

align-content

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

.box {
  align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
屬性值 含義
flex-start 與交叉軸的起點對齊
flex-end 與交叉軸的終點對齊
center 與交叉軸的中點對齊
space-between 與交叉軸兩端對齊,軸線之間的間隔平均分佈
space-around 每根軸線兩側的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍
stretch 默認值,軸線佔滿整個交叉軸

(1)stretch: 默認值,軸線佔滿整個交叉軸。這裏我們先設置每個項目都是固定寬度,效果如下:

下面就去掉每個項目的高度,它會佔滿整個交叉軸,效果如下:

(2)flex-start: 從交叉軸開始位置填充

(3)flex-end: 從交叉軸結尾位置填充

(4)center: 與交叉軸中點對齊

(5)space-between: 與交叉軸兩端對齊,軸線之前的間隔平均分佈

(6)space-around: 每根軸線兩側的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍

項目屬性

以下6個屬性設置在項目上。

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

order

order屬性用來定義項目的排列順序。數值越小,排列越靠前,默認為 0 。使用形式如下:

.item {
    order: <integer>;
}

flex-grow

flex-grow屬性定義項目的放大比例,默認為 0 ,即如果存在剩餘空間,也不放大。

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

如果所有項目的flex-grow屬性都為 1,則它們將等分剩餘空間(如果有的話)。

如果一個項目的flex-grow屬性為2,其他項目都為1,則前者佔據的剩餘空間將比其他項多一倍。

flex-shrink

flex-shrink屬性定義了項目的縮小比例,默認為 1 ,即如果空間不足,該項目將縮小。

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

如果所有項目的flex-shrink屬性都為 1,當空間不足時,都將等比例縮小。

如果一個項目的flex-shrink屬性為 0,其他項目都為 1,則空間不足時,前者不縮小。

負值對該屬性無效。

flex-basis

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

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

它可以設為跟widthheight屬性一樣的值(比如350px),則項目將佔據固定空間。

當主軸設置為水平時,當設置了flex-basis,設置的項目寬度值會失效,flex-basis需要跟flex-growflex-shrink配合使用才能生效。有兩種特殊的值:

  • 當 flex-basis 值為 0 % 時,項目尺寸會被認為是0,因此無論項目尺寸設置多少都用;
  • 當 flex-basis 值為 auto 時,則跟根據尺寸的設定值來設置大小。

flex

flex屬性是flex-grow, flex-shrinkflex-basis的簡寫,默認值為0 1 auto。後兩個屬性可選。

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

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

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

(1)默認值:flex:0 1 auto,即在有剩餘空間時,只放大不縮小

.item {
  flex:0 1 auto;
}
.item {
  flex-grow: 0;
  flex-shrink: 1;
  flex-basis: auto;
}

(2)flex: none,即有剩餘空間時,不放大也不縮小,最終尺寸通常表現為最大內容寬度。

.item {
  flex:0 0 auto;
}
.item {
  flex-grow: 0;
  flex-shrink: 0;
  flex-basis: auto;
}

(3)flex: 0,即當有剩餘空間時,項目寬度為其內容的寬度,最終尺寸表現為最小內容寬度。

.item {
  flex:0 1 0%;
}
.item {
  flex-grow: 0;
  flex-shrink: 1;
  flex-basis: 0%;
}

(4)flex: auto,即元素尺寸可以彈性增大,也可以彈性變小,具有十足的彈性,但在尺寸不足時會優先最大化內容尺寸。

.item {
  flex:1 1 auto;
}
.item {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: auto;
}

(5)flex: 1,即元素尺寸可以彈性增大,也可以彈性變小,具有十足的彈性,但是在尺寸不足時會優先最小化內容尺寸。

.item {
  flex:1 1 0%;
}
.item {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 0%;
}

align-self

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

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

推薦閲讀

Flex 佈局教程:語法篇
Flex 佈局教程:實例篇
FlexBox ("彈性盒子") 介紹
彈性盒子(flexbox)佈局屬性詳解
10分鐘徹底掌握 CSS Flex 佈局

user avatar huajianketang 頭像 anchen_5c17815319fb5 頭像 hard_heart_603dd717240e2 頭像 jiavan 頭像 imba97 頭像 guixiangyyds 頭像 Z-HarOld 頭像 joe235 頭像 nznznz 頭像 lovecola 頭像 abc-x 頭像 milton 頭像
點贊 67 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.