Flex排版教學整理


前言:Flex的出現幫助我們可以更方便的進行網頁排版,我們可以透過can i use這個網站發現,Flex有良好的兼容性(超過九成網站都有支援),而一開始學習Flex的時候建議大家可以一步步將每個範例跟練習實做一遍,如此才會更快上手喔~~
接著我們就開始Flex介紹吧!

Flex 中分為外容器與內元件(如下圖),並靠調整外容器、內元件屬性達成以下常見目的:
1.垂直置中
2.水平置中
3.三欄內容不等高,但希望外框顯示為等高 父元素設定display:flex
4.三個物件水平等距排列(數值彈性) justify-content:space-around
補充:flex各種預設值
flex-direction:row
justify-content:flex-start
align-items:stretch
flex-wrap:nowrap
flex-shrink:1;
flex-grow:0;
order:0;

以下將開始介紹
1. 軸線
2. 對齊方法 
3.外部元件特性 
4.內部元件介紹


  • 軸線(分為兩種)
flex排版起頭觀念,搞懂後基本上就會30%。flex軸線主要有分兩種
1.主軸線
2.交錯軸

主軸線可以調整方向的。所以這時我們就要介紹到一個外部屬性flex-direction
flex-direction:row(一開始預設狀態)
flex-direction:row-reverse  
>>交錯軸上方是Start 下方是End
flex-direction:column 
flex-direction:column-reverse     
>>交錯軸左方是 Start 右方是End
Tips:記得是主軸線調整方向喔!交錯軸永遠都跟主軸垂直

練習一下:

  • 外層元素與內層元素簡介

Flex 外容器屬性:

Flex 內元件屬性:

  • display:flex, inline-flex
display 是我們熟知的 CSS 屬性,對於 Flexbox 來說,多了有兩種方式可以設定,預設為「flex」,其布局方式與 block 幾乎類似,都會強迫換行,但設定display:flex的子元素卻具備了更多彈性的設定,此外另外一種方式則是「inline-flex」,和 inline-block 也是幾乎雷同,意義上都是一個display:flex的元素外面包覆display:inline的屬性,在後方的元素不會換行


  • flex-direction
flex-direction 決定 flex 主軸線 的「排列方向」,分別有下列四種。範例:https://codepen.io/chunwen/pen/JzdNNN

row:預設值,由左到右,從上到下
row-reverse:與 row 相反
column:從上到下,再由左到右
column-reverse:與 column 相反

  • justify-content
justify-content 決定了主軸線的對齊方式,回顧上面講的 Flexbox 盒子模型,具有 main start 與 main end 左右兩個端點,justify-content 就是按照這個方式做設定,而其中的設定值總共有下列五個。( 範例:https://codepen.io/chunwen/pen/wOaeXz )

flex-start:預設值,對齊最左邊的 main start
flex-end:對齊最左邊的 main end
center:水平置中
space-between:平均分配內容元素,左右元素將會與 main start 和 main end 貼齊
space-around:平均分配內容元素,間距也是平均分配

備註:27分開始,使用margin-right:auto,auto可以把剩餘空間推擠出來
  • align-items
align-items 剛好和 justify-content 相反,align-items 決定了交錯軸方向,回想一下最上面講的 Flexbox 盒子模型,具有 cross start 與 cross end 左右兩個端點,align-items 與 align-self 就是按照這個方式做設定,設定值總共有下列五個。( 範例:https://codepen.io/chunwen/pen/wOaeXz)

flex-start:對齊最上面的 cross start
flex-end:對齊最下面的 cross end
center:垂直置中
stretch:預設值,將內容元素全部撐開至 Flexbox 的高度
baseline:以所有內容元素的基線作為對齊標準

Tips:注意 stretch 在高度被限制的情況下不會正常伸展

  • align-self
align-self 的設定與 align-items 相同,但目的不同,align-self 的作用在於覆寫已經套用 align-items 的屬性, align-items 是針對子元素

  • align-content
主要針對多行版本(範例:https://codepen.io/chunwen/pen/qvdPmj)

這個屬性負責的是讓內容的元素換行,因為當我們把父元素的 display 設定為 flex 或 inline-flex 的時候,子元素就是以單行的方式,彈性撐滿父元素,所以就要利用 flex-wrap 來換行,共有三個設定值。

nowrap:預設值,單行
wrap:多行
wrap-reverse:多行,但內容元素反轉

  • order
剛剛在 flex-wrap 的屬性裏頭看到了可以把元素反轉,order 這個屬性更是可以直接指定一個數字,就可以由小到大的排列順序,沒有寫的話就往後排。

Tips:順序由小排到大,order:1開始,接續2、3、4中間不能斷

  • flex(影片42分開始) 範例
flex 其實是由三個屬性組合而成,依照先後順序分別是「flex-grow」、「flex-shrink」和「flex-basis」,如果 flex 只填了一個數值 ( 無單位 ),那麼預設就是以 flex-grow 的方式呈現,至於三個屬性的解釋如下:

flex-grow:數字,無單位,當子元素的 flex-basis 長度「小」於它自己在父元素分配到的長度,按照數字做相對應的「伸展」比例分配,預設值為 0,不會進行彈性變化,不可為負值,設為 1 則會進行彈性變化。

flex-shrink:數字,無單位,當子元素的 flex-basis 長度「大」於它自己在父元素分配到的長度,按照數字做相對應的「壓縮」比例分配,預設值為 1,設為 0 的話不會進行彈性變化,不可為負值。

flex-basis:子元素的基本大小,作為父元素的大小比較基準,預設值為 0,也因為預設值為 0,所以沒有設定此屬性的時候,會以直接採用 flex-grow 屬性,flex-basis 也可以設為 auto,如果設為 auto,就表示子元素以自己的基本大小為單位。

三個屬性可以分開設定,也可以合在一起用一個 flex 統一設定

  • Flex-grow 公式
(剩餘可分配寬度 / 總分配等分) * 分配等分 + 固定佔有寬度=一個元素寬度  原理說明:https://css-tricks.com/flex-grow-is-weird/


  • Flex-shrink 公式
相反計算方式
固定空間 - (多餘可分配的空間 / 總分配等分 * 分配等分)

*白話文: 多的空間拿出來分一分*

以上資料整理自:
六角學院flex共筆
六角學院卡斯柏blog
六角學院影片教學
oxxo 部落格



參考資料(建議閱讀順序):
說明為何要使用flex-box/介紹flex練習小遊戲 6 Reasons to Start Using Flexbox(1)
六角學院flex共筆(2)
六角學院卡斯柏blog(2)
六角學院影片教學(3)

若還有不了解地方可以再參考下面文件
非常詳細部落格(2)

留言