前言
最近重新學習了一下Flex Box
,把知識點和相關概念做了一個梳理。加深記憶,方便回顧。
參考內容:
Flex Box
Flexible Box 模型,通常被稱為 flexbox,是一種一維的佈局模型。
之所以說 flexbox 是一種一維的佈局,是因為一個 flexbox 一次只能處理一個維度上的元素佈局,一行或者一列。作為對比的是另外一個二維佈局 CSS Grid Layout,可以同時處理行和列上的佈局。
採用 Flex 佈局的元素,稱為 Flex 容器(flex container),容器裡的子元素稱為專案(item)。
1.容器
-
概念
![容器](https://i.iter01.com/images/39a365c0642f725439e0a8ed7233cb1ea75b1d58c2a5d2eea9df3f1d80b96e88.png)
從容器的角度來看,有兩個不變的軸,主軸由 flex-direction 定義,另一根軸始終垂直於它。預設定義是:
1) 水平方向的主軸(main axis),主軸開始位置稱為main start
,結束位置稱為 main end
2) 垂直方向的交叉軸(cross axis),交叉軸開始位置稱為 cross start
,結束位置稱為 cross end
-
相關屬性
-
flex-direction:定義了主軸方向。決定容器內專案排列方向,預設從左到右
row
。如果你選擇了row
或者row-reverse
,你的主軸將沿著inline
(行級)方向延伸;選擇column
或者column-reverse
時,你的主軸會沿著上下方向延伸 — 也就是block
(塊級) 排列的方向。flex-direction:row | row-reverse | column | column-reverse 複製程式碼
特別注意:flex-direction設定後會引起主軸和交叉軸方向改變。
-
![Flex Box 概念梳理](https://i.iter01.com/images/1624ace34b4c25d45602fcd263ad39ce2e2c74387ba95648dddfbcc1b8dc3363.png)
-
flex-wrap:決定容器主軸方向上專案是否換行,預設不換行
nowrap
。reverse
表示逆序。flex-wrap: nowrap | wrap | wrap-reverse; 複製程式碼
![Flex Box 概念梳理](https://i.iter01.com/images/3d4a5a217ae6d9286eb45d1484dc32a88704b11bb93f8dc6fd2bf58c0f310a81.png)
-
flex-flow:是
flex-direction
和flex-wrap
屬性的簡寫。預設為:row nowrap
。flex-flow: <flex-direction> || <flex-wrap>; 複製程式碼
-
justify-content:決定容器內專案在主軸上對齊方式。預設左對齊
flex-start
。justify-content: flex-start | flex-end | center | space-between | space-around; /** * flex-start(預設值):左對齊。專案堆放在容器主軸開始位置(main start); * flex-end:右對齊。專案堆放在容器主軸結束位置(main end); * center: 居中。專案沿著主軸居中排列; * space-between:兩端對齊,專案之間的間隔都相等。 * space-around:每個專案兩側的間隔相等。所以,專案之間的間隔比專案與邊框的間隔大一倍。 **/ 複製程式碼
![Flex Box 概念梳理](https://i.iter01.com/images/9513293761b0d883d6031b41effbef5f01e722e290da57844a81cc73cadff894.png)
-
align-items:決定容器內專案在交叉軸上對齊方式。預設為
stretch
。align-items: flex-start | flex-end | center | baseline | stretch; /** * flex-start:交叉軸的起點對齊。 * flex-end:交叉軸的終點對齊。 * center:交叉軸的中點對齊。 * baseline: 專案的第一行文字的基線對齊。 * stretch(預設值):如果專案未設定高度或設為auto,將佔滿整個容器的高度。 **/ 複製程式碼
![Flex Box 概念梳理](https://i.iter01.com/images/3872ae44069a1d898d0d2a5244d72413262fd81e7091eeb4d167c8811578cf1f.png)
![Flex Box 概念梳理](https://i.iter01.com/images/71679642140bf942e1ea02e1719f52a6a7728d5d221bd3ab5d84bff24541b967.png)
![Flex Box 概念梳理](https://i.iter01.com/images/03bee939faea33e07ea677dc18651ab31bc0702a3ef4ab1f8425c063f0080c58.png)
-
align-content:決定容器內專案在交叉軸上內容與剩餘空間對齊方式。預設為
stretch
。特別注意:該屬性只對設定了`flex-wrap:wrap`的容器生效,並且容器裡的元素構成了多行。align-content: flex-start | flex-end | center | space-between | space-around | stretch; /** * flex-start:與交叉軸的起點對齊。 * flex-end:與交叉軸的終點對齊。 * center:與交叉軸的中點對齊。 * space-between:與交叉軸兩端對齊,軸線之間的間隔平均分佈。 * space-around:每根軸線兩側的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍。 * stretch(預設值):軸線佔滿整個交叉軸。 **/ 複製程式碼
案例參考地址:codepen.io/pen/
![Flex Box 概念梳理](https://i.iter01.com/images/29fa63ad130ed79500e49e71c43a14b559916e9ec0c37bb77fc49b9a9c92b79f.png)
2.專案
-
概念
專案預設沿主軸排列。單個專案佔據的主軸空間叫做
main size
,佔據的交叉軸空間叫做cross size
。 -
相關屬性
-
order:定義專案在容器主軸方向上的排列順序,數值越小排列越靠前。預設為 0 。
order: <integer>; 複製程式碼
-
![Flex Box 概念梳理](https://i.iter01.com/images/5aa42ba583a33cfc398d550c0c0d19a9d7718047ec2dad109054c5f7a2d1c740.png)
- flex-grow:定義專案基於
flex-basis
放大比例,預設為 0 ,即便容器存在剩餘空間,也不放大。不允許負值。
剩餘空間:元素佔據完容器空間後的佈局空白
flex-grow: <number>; /* default 0 */ /** * 如果所有專案的flex-grow屬性都為1,則它們將等分剩餘空間(如果有的話)。 * 如果一個專案的flex-grow屬性為2,其他專案都為1,則前者佔據的剩餘空間將比其他項多一倍。 **/ 複製程式碼
![Flex Box 概念梳理](https://i.iter01.com/images/fd494e3fc6f1db46f44888e9c50b8d5a14da423866d8d3094d512d61a3fe3a74.png)
-
flex-shrink:定義專案在容器空間不足時的基於
flex-basis
縮小比例,預設為1,不允許負值。容器空間不足時該專案要縮小,並且專案內容會換行。只有在flex元素總和超出主軸才會生效。flex-shrink: <number>; /* default 1 */ /** * 如果所有專案的flex-shrink屬性都為1,當空間不足時,都將等比例縮小。 * 如果一個專案的flex-shrink屬性為0,其他專案都為1,則空間不足時,前者不縮小。 **/ 複製程式碼
![Flex Box 概念梳理](https://i.iter01.com/images/2d96311c11c1bffbf062ec4ad6dafddea471101ef5bbf4864efc4b2c98a20fbe.png)
![Flex Box 概念梳理](https://i.iter01.com/images/edac7714ecf3b0b6c8b01ad90f5b3e5dfaaa7d5c2ac81677bcd281c7efd24868.png)
-
flex-basis:可以理解成設定專案預設大小。定義專案分配多餘空間之前,在主軸上佔據的空間。預設為auto,即專案內容大小。
flex-basis: <length> | auto; /* default auto */ 複製程式碼
如果容器內所有專案大小總和超過容器,不設定 wrap 的情況下會溢位容器:
![Flex Box 概念梳理](https://i.iter01.com/images/adf649b7339eb8982e9f4de8f7a2b8e415d7df75095b6d074417d2f4a1401788.png)
-
flex:是
flex-grow
,flex-shrink
和flex-basis
的簡寫,預設值為0 1 auto
。後兩個屬性可選。flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
flex 有幾種預定義的值:
flex: initial
是把flex元素重置為Flexbox的初始值,它相當於 flex: 0 1 auto。flex: auto
等同於 flex: 1 1 auto,表明元素既可以拉伸也可以收縮。flex: none
可以把flex元素設定為不可伸縮。它和設定為 flex: 0 0 auto 是一樣的。flex: <positive-number>
常看到的 flex: 1 或者 flex: 2 等等。它相當於flex: 1 1 0或 flex:2 2 0。元素可以在以 flex-basis為0的基礎上伸縮。
建議優先使用這個屬性,而不是單獨寫三個分離的屬性,因為瀏覽器會推算相關值。 -
align-self:用於設定單個專案在交叉軸上對齊方式,可覆蓋容器的
align-items
屬性,預設為auto
。如果值為auto
,則計算值為父元素的 ' align-items ' 值,否則為指定值。align-self: auto | flex-start | flex-end | center | baseline | stretch; 複製程式碼
![Flex Box 概念梳理](https://i.iter01.com/images/5886446969014c047fedd1089e13787fe97cd942d024dcb9ee8b9d0eb54724b0.png)
![Flex Box 概念梳理](https://i.iter01.com/images/6ccd7a9ba2e3d3511a820a09122d2b2f492e4c33d5bd4db2bbc36f57214f1284.png)
![Flex Box 概念梳理](https://i.iter01.com/images/19bb9579e32d66fbc94775d3e9e6f3edecda8b252042332939d2198aeb32ce4b.png)
3.總結
以上把 Flex box 基本知識點做了大體的梳理,具體實戰案例後面再更。。。
注:題圖出處flexgrow