在昨天的文章中,我們深入探討了Flexbox(彈性盒佈局) 的進階控制,學會了元件如何在「一條軸線」上因應空間進行伸展與擠壓。
但是,如果當網頁佈局變得更加複雜:例如同時需要精準對齊「橫向的行(Rows)」與「縱向的列(Columns)」時,如果單靠Flexbox透過多層父子容器嵌套來達成,程式碼就會變得非常亂且難以維護。
這時候,我們就需要CSS現代佈局的第二大核心支柱:Grid網格佈局(Grid Layout)。
在看程式碼範例之前,我們必須先釐清這兩者在空間思維上的本質差異:
| 佈局系統 | 幾何維度 | 設計核心 | 適合的場景 |
|---|---|---|---|
| Flexbox | 一維佈局(一條線) | 內容驅動:由元件本身決定大小與內容,來控制軸線上的排版與空間分配。 | 導覽列、元件水平/垂直排列、工具列。 |
| Grid | 二維佈局(棋盤格) | 佈局驅動:先規劃好整體的網格結構(格子),元件再像棋子一樣放入格子中。 | 大型網頁主架構、複雜的儀表板(Dashboard)、不規則的圖片牆。 |
要玩Grid,必須先在腦海中建立一張「棋盤圖」,並認得以下四個核心名詞:
display: grid;,它就成為了「網格容器」,而其直屬的子元件則自動成為「網格項目」。1開始編號的。要在父容器上畫出格子,我們主要使用以下兩個屬性:
grid-template-columns:定義縱向有幾列、每列多寬。grid-template-rows:定義橫向有幾行、每行多高。這裡引入一個 Grid 專屬的全新幾何單位:fr(Fraction,比例片段),它會自動計算並瓜分剩餘空間,非常好用。
<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<meta charset="UTF-8">
<title>Day17 Grid 網格佈局基礎</title>
<style>
/* 讓最上面的標題文字水平置中 */
h2 {
text-align: center;
margin-top: 30px;
}
.grid-container {
display: grid;
/* 定義三列:寬度分別為 1fr、2fr、1fr(依比例瓜分寬度) */
grid-template-columns: 1fr 2fr 1fr;
/* 定義兩行:高度皆為 120px(使用 repeat 函數簡寫) */
grid-template-rows: repeat(2, 120px);
/* 設定格子之間的間距(外邊距)為 10px */
gap: 10px;
background-color: #ede6e6;
padding: 10px;
max-width: 600px;
margin: 0 auto 30px auto;
}
.grid-item {
background-color: #2c3e50;
color: white;
display: flex;
justify-content: center;
align-items: center;
font-size: 1.2rem;
font-weight: bold;
border-radius: 4px;
}
</style>
</head>
<body>
<h2>我的第一個二維網格 (3 x 2 Grid)</h2>
<div class="grid-container">
<div class="grid-item">項目 1</div>
<div class="grid-item">項目 2</div>
<div class="grid-item">項目 3</div>
<div class="grid-item">項目 4</div>
<div class="grid-item">項目 5</div>
<div class="grid-item">項目 6</div>
</div>
</body>
</html>

當你打開這段程式碼時,你會明顯看到:
.grid-item上寫任何寬高或浮動屬性,子元件就自動乖乖地填入我們規劃好的6個格子裡。fr的威力和彈性:中間的「項目 2」與「項目 5」因為分到了 2fr,其寬度剛好會是左右兩側(1fr)的兩倍大,且會隨著視窗拉伸自動縮放!gap完美的間距:以前用margin做多欄排版時,最討厭邊緣元件溢出,Grid的gap屬性只會在格子與格子之間產生縫隙,容器邊緣依然完美貼齊。今天我們成功從一維的線性思維,升到了二維的網格棋盤思維,掌握了 grid-template-*、fr單位與repeat()函數,你就已經拿到了建構大型網頁外殼的骨架鑰匙。
在明天(Day 18),我將介紹網頁元素的自由定位利器:position 屬性,我們將暫時打破標準排版流的幾何束縛,學會如何使用Relative、Absolute與Fixed,讓元件在網頁畫面上隨意指定座標,明天見。