flex 佈局,是一個廣義的說法,不能說:加了 display:flex 就能夠實現響應式佈局,以 flex 屬性為中心,還有一套全家桶等著你,家庭成員有:align-content、align-items、flex( flex-grow flex-shrink flex-basis )、flex-flow ( flex-direction flex-wrap )、justify-content、order 。

注意 3 個點:

  • 多欄佈局的 column-* 屬性對彈性項目無效。
  • float 與 clear 對彈性項目無效。(使用 float 只會使元素的 display 屬性變成 block )
  • vertical-align 對彈性項目的對齊無效。

1.默認的

如果下級元素定義了長度,而且僅是對父元素添加 flex 屬性,那麼從左到右排序,有兩種情況

1、子元素總長度小於父元素,空餘的地方留空。

如下圖

2、子元素總長度大於父元素,子元素原有設定的長度將失效,變成:子元素長度 = 父元素長度 / 子元素個數。

如下圖

2.flex-grow

默認值:0 ,簡寫:flex: flex-grow flex-shrink flex-basis;

簡要說明:用來佔據你的綠~~

詳細說明:用來對剩餘長度佔比的屬性,前提子元素總長度小於父元素。

佔比總長度 = 父元素長度 - 子元素長度*子元素個數

如下圖,綠色部分為佔比總長度:

如果只有其中一個寫了 flex-grow 屬性,那麼它的長度將會是:這麼長 = 佔比總長度 / 你寫的數值 + 本身長度。

如下圖,只有區塊 2 寫了 flex-grow 的值:

它是這麼來的,下圖:

提示:flex-grow 的數值不能為負數,可以寫小數,但不能寫百分比。

注意:只有一個標籤寫了該屬性時,數值 1 為佔據 100% ,即每 0.1 佔據 佔比總長度的10% 長度。

3.flex-shrink

默認值:1 ,簡寫:flex: flex-grow flex-shrink flex-basis;

簡要說明:我越大,你們就越膨脹

詳細說明:用來對超出部分的長度控制縮減的屬性。當子元素的長度相加大於總長度時,纔可以發生作用。

縮減總長度 = 子元素長度*子元素個數 - 父元素長度

如下圖,虛線部分為縮減的總長度

那麼它的長度計算是這麼計算的:這麼長 = 當前元素設定元素的長度 - 縮減總長度 / 所有 shrink 值相加 * 當前元素的 shrink 值

示例,如下圖區塊 2 值為 3,區塊 4 為 4,其它沒寫的區塊默認為 1。

提示:flex-shrink 的數值不能為負數,可以寫小數,但不能寫百分比。

4.flex-basic

默認值: auto ,簡寫:flex: flex-grow flex-shrink flex-basis;

簡要說明:算了,先放著

詳細說明:覆蓋當前元素設定的長度(width),重新定義當前元素的長度,前提是定義的長度值(basic)不能比當前字元串加起來的長度值小。

由下圖可以看到,原字元長度為 86.33px ,如果設定寬度數值小於這個長度,還是這長度...

子元素全部按百分比的話,例如該百分比為18% ,那麼子元素會是:這麼長 = 父元素的長度 * 18%。

如圖: 800 * 18% = 144

如果只有其中一個寫了 flex-basic 屬性,並且還是百分比的話,那麼當前元素會是: 這麼長 = 父元素長度 / (當前子元素百分比 + (子元素設定長度 / 父元素長度 * ( 子元素個數 - 1 ) ) * 當前子元素百分比 ;

示例 1 、

示例 2 、區塊 2 為 50% ,區塊 4 為 100%,其他區塊為 25% = 0.25 = 200 / 800 ,那麼計算如圖所示:

注意:flex-basic 的數值不能為負數。

5.flex-direction

默認值:row ,簡寫:flex-flow: flex-direction flex-wrap;

簡要說明:別跑,跟我走。

詳細說明:規定子元素的展示方向,默認從左往右,自上往下。

如圖,默認值 row 與 row-reverse , 方向完全反轉了,起點和終點互換角色。

row 是從左往右,自上往下;row-reverse 是從右往左,自上往下。

屬性影響

注意:有一個影響屬性 direction ,該值會影響值 row 的方向,但對值 column 無影響。

如果設置了該屬性將會有以下幾種情況:

direction:ltr +--> flex-direction:row ------------->默認從左往右 direction:ltr +--> flex-direction:row-reverse ---->默認從右往左 direction:rtl +--> flex-direction:row ------------->將默認的從左往右變成從右往左 direction:rtl +--> flex-direction:row-reverse ---->將默認的從右往左變成從左往右

如圖:

column 的值在於從上往下排序,column-reverse 方向與 column 方向相反,自下而上。

如下方,值 column 圖例:

值 column-reverse 圖例:

注意:float 對該值無效,值 column 將會令原有元素設定的高度失效,高度變為適用內容的高度。

6.flex-wrap

默認值:nowrap ,簡寫:flex-flow: flex-direction flex-wrap;

簡要說明:後面排隊的過來這兒(wrap)再排一行。

詳細說明:默認的 flex 佈局是不換行的,如果要換行,請用 flex-wrap 控制。

默認的,不換行的情況下,子元素超出父元素長度時,子元素的長度等於父元素除以子元素的個數,也就是說原有的設定的子元素寬度失效,而如果換行的情況下,子元素的設定寬度不會失效,子元素超出父元素長度時,將自上往下,從左往右的排序。

如圖:設定子元素寬度為 200px ,父元素寬度為 800px;

默認值 nowrap 圖例

值 wrap 圖例

如果值為 wrap-reverse 那麼它的順序將會是自下往上,從左往右。wrap 與於 wrap-reverse 不同的是上下展示的方向的不同。

如下圖:

flex-flow 其他情況圖例

  • flex-flow: column wrap; 下圖 1
  • flex-flow: column wrap-reverse; 下圖 2
  • flex-flow: row-reverse wrap; 下圖 3
  • flex-flow: row-reverse wrap-reverse; 下圖 4

圖 1 + 圖 2

圖 3 + 圖 4

7.order

默認值:0

簡要說明:給錢(integer)我,就讓你排前面

詳細說明:對當前項進行排序,當元素設定該值時,元素就位於該數值位置,同數值元素將按照文檔讀取順序排序。

如圖所示:指定了某些區塊的 order 值。

注意:值可以接受負數但不能為小數點。

8.align-content

默認值:stretch

簡要說明:單排的一邊去

詳細說明:對當前行所有子元素進行對齊,根據值進行位移,對單行所有子元素無效,對單個子元素設該屬性無效。

注意:多考慮瀏覽器特性,部分瀏覽器不支持導致某些屬性效果為 baseline 的效果。

如下圖:默認子元素 200px * 6 ,寬度 900px ,高度 300px。

默認值 stretch 平分了父元素餘下的高度,以平分的高度開始基線進行對齊,保證與下一行間隔一致,末行將與高度底部間隔。

注意:若其中某子元素未定義高度,它將會填滿至下一行,無縫連接下一行。

值 baseline 圖例

值 baseline 以元素高度為基準,在開始位置進行對齊,類似後面的 start 。值 first baseline 及 last baseline 估計還在實驗中,並未得到實現。

值 center 圖例

值 center 於 baseline 類似,不過它實現的是上下位置居中對齊。

值 flex-start 和 flex-end 圖例

非溢出情況

溢出情況

值 flex-start 和 flex-end 為以父元素高度的開始基線對齊和以父元素高度的結束基線對齊(繞口,請看上方的溢出及非溢出圖)。

貌似後面出的 start 及 end 測試有效,但 left 和 right 估計還在實驗中,並未得到實現。

值 space-around 圖例

值 space-around 平分了父元素餘下的高度,並且在平分的高度中,上下位置居中對齊。

值 space-between 圖例

值 space-between 首行元素粘合父元素開始基線,尾行元素粘合父元素結束基線,其餘行平分剩下高度餘下的值,並保證行之間距離一樣。

值 space-evenly 圖例

值 space-evenly 平分了父元素餘下的高度,並保證每行間隔一樣。

9.align-item

默認值 stretch

簡要說明:來來來,我們一起膨脹

詳細說明:對當前行的子元素進行對齊,可對單行進行賦值,但對單個子元素無效。

和 align-content 區別?align-item 是控制行內子元素對齊, align-content 是控制行對齊... 注意:多考慮瀏覽器特性,部分瀏覽器不支持導致某些屬性效果為 baseline 的效果。

默認值 stretch 如下圖:

值 baseline 圖例

值 baseline ,以每行的間隔開始基線對齊,如不填寫高度,將默認為內容高度。

值 center 圖例

值 center , 平分父元素餘下的高度,並且每行自身上下間隔一樣(以行內最大高度為基準),如不填寫高度,將默認為內容高度。

值 flex-star 和 flex-end 圖例

值 flex-star 和 flex-end , 平分父元素餘下的高度,並且每行上(end)或下(start)間隔一樣(以行內最大高度為基準),與後來的 start 及 end 貌似一樣效果。

10.justify-content

默認值 stretch

簡要說明:別惹事,站開點

詳細說明:與 align-item 類似,不過它是用來對行內元素的水平對齊的控制。

注意:多考慮瀏覽器特性,部分瀏覽器不支持導致某些屬性效果為 baseline 的效果。

默認值 stretch ,如下圖:

與值 baseline ,貌似於默認值沒區別。

值 center 圖例

值 center ,集中所有子元素並水平居中對齊。

值 flex-star 和 flex-end 圖例

值 flex-star 和 flex-end , 集中所有子元素並水平居左(start)或右(end)對齊。 與後來的 start 及 end 貌似一樣效果。

值 space-around 圖例

值 space-around ,水平分散對齊,並保證每個子元素自身的間隔一致。

值 space-between 圖例

值 space-between ,水平分散對齊,首列粘合左邊位置,末列粘合右邊,其餘列左右間隔對齊,並保持一致。

值 space-evenly 圖例

值 space-evenly , 水平分散對齊,並保證每個元素間隔一致。

部分元素未得到測試,後續支持再添加。

完畢!

如有錯漏,望不吝指出,感謝。

文章摘自大朗博客:認真看看那正在熱潮的 flex 響應式佈局


推薦閱讀:
相關文章