CSS Grid 項目屬性

Grid 項目(容器內的子元素)有專屬的屬性,用來控制項目的位置和跨越範圍。

grid-column 和 grid-row

用格線編號指定項目的位置和跨越範圍。

指定起始和結束格線

.item {
  grid-column-start: 1;
  grid-column-end: 3;
  grid-row-start: 1;
  grid-row-end: 2;
}

/* 縮寫 */
.item {
  grid-column: 1 / 3; /* 從第 1 條線到第 3 條線(佔 2 欄) */
  grid-row: 1 / 2; /* 從第 1 條線到第 2 條線(佔 1 行) */
}

格線編號從 1 開始,也可以用負數從尾端計算(-1 是最後一條線)。

span 關鍵字

span 指定要跨越的軌道數量。

.item {
  grid-column: 1 / span 2; /* 從第 1 條線開始,跨 2 欄 */
  grid-column: span 2; /* 跨 2 欄(位置自動) */
  grid-row: 2 / span 3; /* 從第 2 行開始,跨 3 行 */
}

佔滿整行或整列

.full-width {
  grid-column: 1 / -1; /* 從第一條線到最後一條線 */
}

grid-area

用於 grid-template-areas

配合容器的 grid-template-areas 使用:

.container {
  grid-template-areas:
    'header header'
    'sidebar main'
    'footer footer';
}

.header {
  grid-area: header;
}
.sidebar {
  grid-area: sidebar;
}
.main {
  grid-area: main;
}
.footer {
  grid-area: footer;
}

作為縮寫

grid-area 也可以作為位置的縮寫:

.item {
  grid-area: 1 / 1 / 3 / 4;
  /* 等同於:
     grid-row-start: 1;
     grid-column-start: 1;
     grid-row-end: 3;
     grid-column-end: 4;
  */
}

順序是:row-start / column-start / row-end / column-end

justify-self

覆蓋容器的 justify-items,設定單一項目的「水平」對齊。

.item {
  justify-self: start; /* 靠左 */
  justify-self: end; /* 靠右 */
  justify-self: center; /* 置中 */
  justify-self: stretch; /* 拉伸填滿(預設) */
}

align-self

覆蓋容器的 align-items,設定單一項目的「垂直」對齊。

.item {
  align-self: start; /* 靠上 */
  align-self: end; /* 靠下 */
  align-self: center; /* 置中 */
  align-self: stretch; /* 拉伸填滿(預設) */
}

place-self

align-selfjustify-self 的縮寫。

.item {
  place-self: center; /* 水平垂直都置中 */
  place-self: start end; /* 垂直靠上,水平靠右 */
}

實用範例

跨越多欄

.wide-item {
  grid-column: span 2; /* 佔兩欄 */
}

.full-width {
  grid-column: 1 / -1; /* 佔滿整行 */
}

跨越多行

.tall-item {
  grid-row: span 2; /* 佔兩行 */
}

大卡片

.featured {
  grid-column: span 2;
  grid-row: span 2;
}

指定位置

/* 放在第二欄第二行 */
.specific {
  grid-column: 2;
  grid-row: 2;
}

響應式區域

.container {
  display: grid;
  grid-template-columns: 1fr;
  grid-template-areas:
    'header'
    'main'
    'sidebar'
    'footer';
}

@media (min-width: 768px) {
  .container {
    grid-template-columns: 200px 1fr;
    grid-template-areas:
      'header header'
      'sidebar main'
      'footer footer';
  }
}

.header {
  grid-area: header;
}
.main {
  grid-area: main;
}
.sidebar {
  grid-area: sidebar;
}
.footer {
  grid-area: footer;
}

相簿佈局

.gallery {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 8px;
}

/* 特色圖片 */
.gallery .featured {
  grid-column: span 2;
  grid-row: span 2;
}

項目置中

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

/* 或 */
.centered {
  place-self: center;
}

彈出式定位

.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(3, 100px);
}

/* 重疊放置 */
.overlay {
  grid-column: 1 / -1;
  grid-row: 1 / -1;
  z-index: 1;
}

Grid vs Flexbox 選擇

需求推薦
一維排列(單行或單列)Flexbox
二維佈局(行和列)Grid
內容優先(大小由內容決定)Flexbox
佈局優先(先定義結構)Grid
簡單的水平排列Flexbox
複雜的頁面佈局Grid

兩者可以搭配使用:Grid 用於整體頁面佈局,Flexbox 用於組件內部排列。