CSS | Flexbox
2022-01-25
CSS Flexbox 相較於 Float ,更適合處理一維度的 Components 例如 Navbar, Card 等,對於一維度的元素延展以及對齊非常方便。
Flex Properties
Flex-Direction
flex-direction
用來控制 Flex 的 Main Axis 以及 Cross Axis,決定元素的排列方向是水平或者垂直。
flex-direction: row;
/* Default Direction */
flex-direction: row-reverse;
flex-direction: column;
flex-direction: column-reverse;
Flex-Wrap
預設的情況下 flex-wrap
是不自動換行,也就是 no wrap,flex 會把所有的元素使勁塞在同一列。
flex-wrap: no-wrap;
flex-wrap: wrap
flex-wrap: wrap-reverse
Flew-Flow
flex-flow
是簡寫技巧,相當於 flex-direction
+ flex-wrap
。
flex-flow: row-reverse wrap;
Justify-Content
Justify-Content
是使用 Flex 最常使用的 CSS 屬性,可以控制 Main Axis 中元素的對齊方式 (Alignment)。尤其適合處理一維的 Components 例如 Navbar 以及 Card 的對齊方式。
Justify-Content
是每一個 CSS 人 Flexbox Lover 不可以錯過的重要屬性 😊
justify-content: flex-start
/* Default */
justify-content: end
justify-content: center
justify-content: space-between
justify-content: space-around
justify-content: space-evenly
Align-Items
align-items
預設為 strech
對於沒有設定 Height 的元素,會自動伸展自 Flex 容器的最大高度,解決了以往多欄元素要保持高度一致的困難。
例如以往 Bootsrap3 的 Grid System 不同 Col 因為有不同的元素高度,會讓高度較高的元素干擾到換列的元素。這個問題在 Bootsrap 4 改採 Flex 設計 Grid System 後已經不復存在。
以下示範將 Flex Container 的高度調整為 200px
align-items: stretch
/* Default */
除了有自帶高度的元素外,會被拉升到與容器同樣高度。
align-items: flex-start
元素依照自己的高度,並由開頭開始對齊。
align-items: flex-end
元素依照自己的高度,並由底端開始對齊。
align-items: center
元素依照自己的高度,並由中間進行對齊。
align-items: baseline
baseline
的屬性效果尚無法正確呈現 🙄
Align-Content
align-content
需要搭配 flex-wrap
一起使用,如果單獨使用不會有任何效果。而搭配 flex-wrap
則可以用於控制多列元素的對齊方式。
相對於 justify-content
是對 Main Axis 進行對齊設定; align-content
是用於對 Cross Axis 進行對齊設定。
以下示範將 Flex Container 的高度調整為 300px
align-content: stretch
/* Default */
在預設的 strech
下,如果元素本身沒有高度,會被均分自動延伸到最大高度:
但如果元素有高度就不受影響例如橘色塊或者海草綠色塊。
align-content: flex-start
align-content: flex-end
align-content: space-between
align-content: space-around
align-content: center
Gap
gap
會令 Flex 容器下的元素增加邊距,可以和 justify-content
混合使用。
預設沒有 gap
的情況下,元素是彼此先鄰的,微小的距離是來自於 border
。
gap: 1rem
gap: 2rem 1rem
gap
可以分別對 Cross Axis 以及 Main Axis 指定數值。
Order
使用 order
可以調整 flex 容器個別元素的順序,數值越小的順序越高,預設元素的 order
都是 0。
<div class="d-flex">
<div class="box R" style="order: 1"></div>
<div class="box G"></div>
<div class="box B" style="order: -1"></div>
</div>
<div class="d-flex" style="flex-direction: column">
<div class="box bg-R"></div>
<div class="box bg-G"></div>
<div class="box bg-B" style="order: -1"></div>
</div>
Flex-Grow
使用 flex-grow
會忽略原本元素的寬度,會將扣除未設定 flex-grow
並且具有 width 的元素的 width,並將剩下的 width 按照 flex-grow
之和去分配給各具有 flex-grow
的元素。
例如下列範例,藍色元素寬度為 250px,則會以 Flex 容器的 850px 先減去 250px,在分為 3 等份,其中橘色塊佔有 2 等份、草綠色佔有 1 等份。
<div class="d-flex">
<div class="box R" style="flex-grow: 2"></div>
<div class="box G" style="flex-grow: 1"></div>
<div class="w-box B"></div>
</div>
需要注意的是使用 flex-grow
因為元素會自動長胖到容器寬度,所以這時 justify-content
就不再有作用。
Flex-Shrink
flex-basis
flex-shrink
flex
= flex-basis
+ flex-grow
Flex-Basis
align-self
應用
Navbar
Navbar 左右分列項目。
<div class="nav">
<div>Website Logo</div>
<div>User</div>
</div>
.nav {
display: flex;
justify-content: space-between;
}
Card
<div class="card">
<div></div>
<div></div>
</div>
.card {
display: flex;
}