CSS Flex 項目屬性

Flex 項目(容器內的子元素)有專屬的屬性,用來控制自身的伸縮行為和對齊方式。

flex-grow

設定項目的「伸展比例」,決定如何分配容器的剩餘空間。

.item {
  flex-grow: 0; /* 不伸展(預設) */
  flex-grow: 1; /* 伸展,佔據剩餘空間 */
  flex-grow: 2; /* 伸展比例是 1 的兩倍 */
}

範例:分配空間

.container {
  display: flex;
}

.item-a {
  flex-grow: 1;
} /* 佔 1/4 */
.item-b {
  flex-grow: 2;
} /* 佔 2/4 */
.item-c {
  flex-grow: 1;
} /* 佔 1/4 */

flex-shrink

設定項目的「收縮比例」,決定空間不足時如何縮小。

.item {
  flex-shrink: 1; /* 允許收縮(預設) */
  flex-shrink: 0; /* 不收縮 */
  flex-shrink: 2; /* 收縮比例是 1 的兩倍 */
}

範例:防止收縮

.sidebar {
  flex-shrink: 0; /* 側邊欄不縮小 */
  width: 250px;
}

.main {
  flex-shrink: 1; /* 主內容可以縮小 */
}

flex-basis

設定項目的「基礎大小」,在分配剩餘空間之前的初始大小。

.item {
  flex-basis: auto; /* 根據內容或 width/height(預設) */
  flex-basis: 0; /* 完全依賴 flex-grow 分配 */
  flex-basis: 200px; /* 固定基礎大小 */
  flex-basis: 30%; /* 百分比 */
}

flex-basis vs width

  • flex-basis 優先於 width(在主軸方向)
  • flex-basis: auto 時會參考 width 的值
/* flex-basis 會覆蓋 width */
.item {
  width: 100px;
  flex-basis: 200px; /* 實際使用 200px */
}

flex 縮寫

flexflex-growflex-shrinkflex-basis 的縮寫。

.item {
  flex: 0 1 auto; /* 預設值:不伸展、可收縮、自動大小 */
  flex: 1; /* 等同於 flex: 1 1 0 */
  flex: auto; /* 等同於 flex: 1 1 auto */
  flex: none; /* 等同於 flex: 0 0 auto */
  flex: 1 1 200px; /* grow shrink basis */
}

常用值

等同於說明
flex: 1flex: 1 1 0等分空間
flex: autoflex: 1 1 auto根據內容伸縮
flex: noneflex: 0 0 auto不伸縮
flex: 0flex: 0 1 0不伸展,可收縮到 0

order

設定項目的排列順序,數值越小越前面。

.item-a {
  order: 2;
}
.item-b {
  order: 1;
} /* 會排在 item-a 前面 */
.item-c {
  order: 3;
}

預設 order 值是 0,可以使用負值。

.first {
  order: -1; /* 排到最前面 */
}

align-self

覆蓋容器的 align-items,設定單一項目在交叉軸上的對齊方式。

.container {
  display: flex;
  align-items: flex-start;
}

.special-item {
  align-self: flex-end; /* 這個項目靠下對齊 */
  align-self: center; /* 這個項目置中 */
  align-self: stretch; /* 這個項目拉伸 */
  align-self: auto; /* 使用容器的 align-items(預設) */
}

實用範例

等分欄位

.container {
  display: flex;
}

.column {
  flex: 1; /* 每個欄位等分 */
}

固定 + 彈性

.layout {
  display: flex;
}

.sidebar {
  flex: 0 0 250px; /* 固定 250px,不伸縮 */
}

.main {
  flex: 1; /* 佔據剩餘空間 */
}

最小寬度限制

.card {
  flex: 1 1 300px; /* 基礎 300px,可伸縮 */
  min-width: 250px; /* 最小不能小於 250px */
}

輸入框 + 按鈕

.search-box {
  display: flex;
}

.search-input {
  flex: 1; /* 輸入框佔據剩餘空間 */
}

.search-button {
  flex: none; /* 按鈕不伸縮 */
}

垂直佈局中推到底部

.card {
  display: flex;
  flex-direction: column;
}

.card-content {
  flex: 1; /* 內容區域擴展 */
}

.card-footer {
  flex: none; /* 頁腳固定大小 */
}

重新排序

.mobile-menu {
  order: -1; /* 在行動版排到最前面 */
}

@media (min-width: 768px) {
  .mobile-menu {
    order: 0; /* 桌面版恢復原本順序 */
  }
}

單一項目置中

.container {
  display: flex;
  align-items: flex-start;
}

.centered-item {
  align-self: center;
}

常見模式

需求設定
等分空間flex: 1
固定大小flex: noneflex: 0 0 100px
佔據剩餘空間flex: 1
最小寬度flex: 1 1 0; min-width: 200px
單一項目對齊align-self: center
改變順序order: -1