跳至主要內容

CSS Grid 佈局完全攻略:從入門到複雜版面設計

9 分鐘閱讀 980 字

CSS Grid 佈局完全攻略:從入門到複雜版面設計

CSS Grid 是現代網頁佈局的革命性工具,讓過去需要 float、position 或 flexbox 組合才能實現的複雜版面,現在用幾行 CSS 就能搞定。本文從基礎語法到進階技巧,帶你全面掌握 Grid 佈局。

Grid 基礎概念

Grid 系統由**容器(Container)項目(Items)**組成。在容器上設定 display: grid 後,直接子元素自動成為 Grid 項目。

.grid-container {
  display: grid;
  grid-template-columns: 200px 1fr 200px; /* 三欄:固定-彈性-固定 */
  grid-template-rows: auto 1fr auto;       /* 三列:自動-彈性-自動 */
  gap: 16px;                               /* 間距(同時設定行列) */
}

fr 單位與 repeat()

fr(fraction)代表可用空間的份額,repeat() 避免重複書寫:

/* 12 欄網格系統 */
.grid {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  gap: 24px;
}

/* 響應式卡片網格:最少 280px,自動填充 */
.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 20px;
}

auto-fill 會盡量填充欄位,auto-fit 則會讓現有項目延伸填滿空間。

項目定位:grid-column 與 grid-row

.item-wide {
  grid-column: 1 / 3;    /* 從第 1 條線到第 3 條線(佔 2 欄) */
  /* 等同於:grid-column: span 2; */
}

.item-tall {
  grid-row: 1 / 4;       /* 佔 3 列 */
}

.hero-banner {
  grid-column: 1 / -1;   /* -1 代表最後一條線,跨越所有欄 */
}

具名網格區域

這是 Grid 最直觀的功能,用視覺化方式定義版面:

.page-layout {
  display: grid;
  grid-template-areas:
    "header  header  header"
    "sidebar main    main"
    "sidebar main    main"
    "footer  footer  footer";
  grid-template-columns: 250px 1fr 1fr;
  grid-template-rows: 60px 1fr 1fr 50px;
  min-height: 100vh;
  gap: 0;
}

.header  { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main    { grid-area: main; }
.footer  { grid-area: footer; }
<div class="page-layout">
  <header class="header">Header</header>
  <aside class="sidebar">Sidebar</aside>
  <main class="main">Main Content</main>
  <footer class="footer">Footer</footer>
</div>

響應式設計與 Grid

結合 Media Query 和 Grid,輕鬆實現響應式版面:

.article-layout {
  display: grid;
  gap: 24px;
  
  /* 手機:單欄 */
  grid-template-columns: 1fr;
  grid-template-areas:
    "header"
    "main"
    "toc"
    "footer";
}

@media (min-width: 768px) {
  .article-layout {
    /* 平板:兩欄 */
    grid-template-columns: 1fr 200px;
    grid-template-areas:
      "header header"
      "main   toc"
      "footer footer";
  }
}

@media (min-width: 1024px) {
  .article-layout {
    /* 桌面:三欄 */
    grid-template-columns: 200px 1fr 200px;
    grid-template-areas:
      "header header  header"
      "toc    main    aside"
      "footer footer  footer";
  }
}

隱式網格

當項目超出定義的網格範圍時,Grid 會自動建立隱式軌道:

.photo-gallery {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  /* 只定義欄,列由內容自動生成 */
  grid-auto-rows: 200px;  /* 每個隱式列高 200px */
  gap: 8px;
}

對齊控制

.grid-container {
  display: grid;
  
  /* 整個網格在容器中的對齊 */
  justify-content: center;   /* 水平對齊(start|end|center|space-between|space-around) */
  align-content: start;      /* 垂直對齊 */
  
  /* 所有項目在各自格子中的對齊 */
  justify-items: stretch;    /* 預設值,填滿格子寬度 */
  align-items: center;       /* 垂直置中 */
}

/* 單個項目覆蓋對齊方式 */
.special-item {
  justify-self: end;
  align-self: start;
}

實戰案例:雜誌式版面

.magazine-grid {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: repeat(4, 200px);
  gap: 12px;
}

.article-featured {
  grid-column: 1 / 4;
  grid-row: 1 / 3;
}

.article-secondary {
  grid-column: 4 / 7;
  grid-row: 1 / 2;
}

.article-list {
  grid-column: 4 / 7;
  grid-row: 2 / 3;
  display: grid;
  grid-template-columns: 1fr;
  gap: 8px;
}

.article-wide {
  grid-column: 1 / -1;
  grid-row: 3 / 4;
}

Grid vs Flexbox:如何選擇

場景 推薦
一維排列(導覽列、按鈕組) Flexbox
二維版面(頁面佈局、卡片網格) Grid
等高多欄卡片 Grid
元素間彈性間距 Flexbox
複雜頁面骨架 Grid

總結

CSS Grid 和 Flexbox 是互補的工具,而非競爭關係。Grid 擅長二維的版面控制,Flexbox 則在一維的對齊場景更直觀。在現代專案中,通常使用 Grid 建構整體頁面骨架,用 Flexbox 處理元件內部的排列。瀏覽器支援已達 98%+,可以放心在正式環境使用。

分享這篇文章