CSS flex 軸線對齊技巧 - 預設屬性

flex 軸線對齊的排版工具

Flex 排版特性與區塊元素的差別

一般如果使用三個區塊元素進行排版,區塊元素會自動填滿整個空間。

1
2
3
4
5
<div class="container">
<div class="flex-item">1</div>
<div class="flex-item">2</div>
<div class="flex-item">3</div>
</div>

當我們將continaer class 設定flex佈局方式,每一個flex-item都會變成flex 子元素

請注意 flex 排版特性只影響 flex 容器及容器內的第一層子物件而已。

flex 容器有以下預設屬性:

  • flex 容器預設會填滿父容器的寬度
  • flex-direction: row(預設主軸的定義是水平的,由左至右)
  • flex-wrap: nowrap(預設子元素在 Flex 容器裡面是不換行的,子元素會在單一行中排列)

當 flex 容器內的第一層元素被轉換成flex 子元素時,flex 子元素有以下預設屬性:

  • justify-content:flex-start(預設 flex 子元素沿著主軸起始點排序)
  • align-items: stretch(預設交叉軸會將子元素延伸以填滿 flex 容器的高度)
  • flex-basis: auto(預設子元素的大小由內容、widthheight 設定來決定)
  • flex-grow: 0(預設不會有所謂擴展效果。此屬性主要是分配剩餘空間的比例,負值無效)
  • flex-shrink: 1(預設會有收縮效果,此屬性主要是分配超出空間的比例,負值無效)

flex 情境解析 - 理解預設屬性在 flex 排版中的實際作用

這邊直接透過兩種情境快速理解這些特性:

當 flex 子元素總寬度小於 flex 容器預設排版(存在 flex 容器剩餘空間)

 1. 當 flex 子元素總寬度小於 flex 容器預設排版

按照前面所提到的特性去理解(千萬不要死背,會出大事):

【 觀察主軸的方向 - flex 容器預設屬性 】

  • flex-direction: row

確認當前畫面主軸的方向,就可以確認交叉軸的方向。flex 元素會按照主軸的方向排列,當前畫面是由左至右,因此可以判斷當前主軸是由左至右的方向。但是主軸並非永遠都是由左至右(非常重要),軸線的方向會因為 flex 主軸方向設定(flex-direction)、語系方向(HTML dir Attribute)、書寫模式(writing-mode)及內容呈現方向(direction)影響。

【 觀察主軸的方向 - 說明 flex 子元素預設屬性 】

  • flex-basis: auto

預設 flex 子元素的寬度是由其內容撐開的,在未設定widthheight的情況下。因此如果 flex 子元素未設置寬度且flex 子元素內無內容的情況下,flex 子元素會看不到喔!!!

  • justify-content:flex-start

預設 flex 子元素主軸對齊的方向是在主軸起始點。

  • flex-grow: 0

注意到上面的圖中一塊的剩餘空間,這部分是由flex-grow進行管理。只有在 flex 子元素總寬度小於 flex 容器的時候會產生剩餘空間。預設的情況下,這個剩餘空間是不會進行分配的,也就是0

【 觀察交叉軸的方向 - 說明 flex 子元素預設屬性 】

  • align-items: stretch

預設 flex 子元素交叉軸對齊的方向是會延展至容器的高度。

上面還有很多預設屬性沒有說明到!是不是想偷懶 > < ,才不是,因為透過另一個情境搭配說明可以讓大家更能理解。

當 flex 子元素總寬度大於 flex 容器預設排版(存在超出 flex 容器空間)

  • flex-wrap:nowrap(預設不會換行)

不管你在 flex 裡面放多少東西,他會試著把他收縮在同一行當中,不讓 flex 容器內的子容器換行。至於收縮這件事情,則是flex-shrink負責,因此若將flex-shrink設定為 0 (關閉),flex 子容器總寬度大於 flex 容器寬度時,不會嘗試壓縮,就會看到 flex 子元素衝出去 flex 容器的限制。

  • flex-shrink: 1(預設 flex 容器會試著收縮容器內的子容器)

收縮的部分只會發生在flex 子元素總寬度大於flex 容器時。理解上也相對好理解,因為 flex 容器裝不下了,才會需要進行收縮,讓 flex 子元素能安全地待在 flex 容器裡,不要亂跑(不然前端工程師會哭給你看QQ)

這邊可能會想說,你怎麼知道他超出去了容器的寬度限制呢?

這邊試著關掉flex-shrink將其改變成0,不讓 flex 子元素收縮的情況下,會發現其超出容器的寬度。

敲鐘下課囉~今天是睽違半年重新動筆,希望能找到自己撰寫風格 ❤️

資料來源

  • 金魚都能懂的CSS 選取器(我是金魚粉,超級喜歡 Amos 老師,推薦大家都買一本來嗑)