CSS Grid 是什麼?網頁版面配置語法、切版範例與 Flexbox 判斷
css grid 是建立欄與列的 CSS Grid 版面配置工具,適合網站骨架、dashboard、卡片列表與設計稿切版。掌握 display: grid、grid-template-columns、gap 與 Grid / Flexbox 選用邏輯,能更穩定完成複雜網頁排版。
css grid 是什麼?它解決哪一種版面問題?
CSS Grid 是 CSS 的格線佈局系統,適合處理欄與列同時存在的二維版面配置,常用在網站骨架、儀表板與卡片列表。
如果你已經會基本 HTML 與 CSS,學 Grid 的重點不是背完整規格,而是看懂「父層建立格線、子元素放進格線」這個分工。Grid 特別適合需要穩定對齊的版面,例如首頁區塊、後台 dashboard、作品集卡片牆、左右欄內容頁。
40 字定義
CSS Grid 讓一個容器產生欄與列,子元素可以依照格線線號、區域名稱或自動流向放到指定位置。
二維版面配置的核心觀念
Flexbox 主要沿著單一方向排列內容,Grid 則同時處理水平與垂直方向。當你在切版時同時在意「第幾欄」與「第幾列」,通常就進入 CSS Grid 版面配置的範圍。
父層加上 display: grid 後,直接子元素會變成 grid item。格線由 column、row、track、gap 組成,版面穩定度通常比用 margin 硬推位置更好。
最小 display: grid 範例
用途:建立一個最小可跑的三欄卡片區,適合用來確認 Grid 是否生效。
.cards {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 24px;
}
解釋:.cards 是 grid container,裡面的直接子元素會平均分成三欄,gap 控制欄與列之間的距離。
常見錯誤:把 display: grid 寫在每張卡片上,卻沒有寫在卡片共同父層,版面就不會形成同一組格線。
CSS Grid 和 Flexbox 怎麼選?
選 Grid 或 Flexbox,先看問題有沒有同時牽涉欄與列。整體版面骨架用 Grid,按鈕、選單、卡片內容多半用 Flexbox。
實務上兩者常一起用:外層用 Grid 排 header、sidebar、main,內層用 Flexbox 排 icon、文字、按鈕。硬把所有東西都交給同一套語法,反而會讓 CSS 變難維護。
Flexbox 適合單軸排列
Flexbox 很適合處理一排或一欄內容,例如導覽列、按鈕群組、表單欄位、卡片內的標題與價格。你只需要控制主軸方向、對齊與間距時,用 Flexbox 會比較直覺。
Grid 適合整體骨架
Grid 適合先畫出頁面的結構,例如左側 sidebar、右側內容、上方 header、底部 footer。版面需要跨欄、跨列、固定欄寬與彈性欄寬混用時,Grid 的語意會更清楚。
| 判斷點 | 優先選 Grid | 優先選 Flexbox |
|---|---|---|
| 排列方向 | 同時控制欄與列 | 只控制一排或一欄 |
| 常見用途 | 頁面骨架、dashboard、卡片列表 | 導覽列、按鈕群組、卡片內文 |
| 對齊方式 | 依格線位置對齊 | 依內容流向對齊 |
| 維護方式 | 先定義容器規則 | 多從內容排列出發 |
navbar、dashboard、card list 決策表
| 情境 | 建議 | 原因 |
|---|---|---|
| navbar 裡的 logo、選單、按鈕 | Flexbox | 內容沿水平軸排列,重點是置中與間距 |
| 後台 dashboard 的側欄與主內容 | Grid | 需要穩定的二維版面骨架 |
| 商品或文章卡片列表 | Grid | 欄數會隨寬度改變,卡片要對齊 |
| 卡片內的標題、摘要、按鈕 | Flexbox | 同一張卡片內通常是單軸內容流 |
如果你想深入 Flexbox 的定位,可以接著看 CSS Flexbox 教學,把兩套版面工具分清楚會比死背語法更有效。
CSS Grid 名詞中英對照怎麼看?
學 Grid 最容易卡在名詞。先把 container、item、line、track、cell、area 對齊中文概念,再讀文件會快很多。
台灣讀者常把 column 和 row 翻成「欄」與「列」後仍然混淆,建議直接用視覺方向記:column 是直向欄位,row 是橫向列帶。
名詞表
| 英文 | 常用中文 | 實作理解 |
|---|---|---|
| Grid Container | 格線容器 | 寫 display: grid 的父層 |
| Grid Item | 格線項目 | 容器的直接子元素 |
| Grid Line | 格線線 | 欄與列的邊界線,可用線號定位 |
| Grid Track | 格線軌道 | 兩條線之間的一欄或一列 |
| Grid Cell | 格線儲存格 | 一欄一列交會的小格 |
| Grid Area | 格線區域 | 多個 cell 組成的命名區塊 |
| Gap | 間距 | 欄與列之間的空隙 |
台灣讀者容易混淆的列與欄
grid-template-columns 控制欄,會影響左右方向的分割;grid-template-rows 控制列,會影響上下方向的分割。屬性名稱看的是被建立的軌道,不是元素移動方向。
中英對照最小範例
一個 3 欄 2 列的版面,可以想成 3 個 column tracks 與 2 個 row tracks。單一格子是 cell,跨多格後才會形成 area。這個心智模型比只翻譯名詞更可靠。
CSS Grid 父層屬性怎麼寫?
父層屬性負責建立格線規則,最常用的是 display: grid、欄列模板、gap、fr、repeat() 與 minmax()。
多數 Grid 切版問題都可以先從父層解掉。先決定欄數、列高、間距與自動填滿規則,再讓子元素依需要跨欄或指定位置。
| 屬性或函式 | 寫在哪裡 | 用途 | 最小範例 |
|---|---|---|---|
display: grid |
父層 | 建立 grid container | display: grid; |
grid-template-columns |
父層 | 定義欄寬 | grid-template-columns: 240px 1fr; |
grid-template-rows |
父層 | 定義列高 | grid-template-rows: auto 1fr; |
gap |
父層 | 設定欄列間距 | gap: 24px; |
repeat() |
父層 | 重複建立軌道 | repeat(3, 1fr) |
minmax() |
父層 | 設定最小與最大尺寸 | minmax(240px, 1fr) |
display: grid
用途:把父層變成 grid container,讓直接子元素進入同一組格線。
.page {
display: grid;
}
解釋:只寫這一行時,瀏覽器會建立隱含格線,子元素仍會依文件順序排列。
常見錯誤:以為加上 display: grid 就會自動變成多欄,實際欄數仍要用模板或自動填滿規則定義。
columns 與 rows
用途:建立固定側欄加彈性內容區,常用在部落格文章頁或後台管理頁。
.article-layout {
display: grid;
grid-template-columns: 280px minmax(0, 1fr);
grid-template-rows: auto;
gap: 32px;
}
解釋:第一欄固定 280px,第二欄吃掉剩餘空間。minmax(0, 1fr) 可以降低內容把欄位撐爆的機率。
常見錯誤:只寫 1fr 卻放進很長的連續文字或表格,導致主內容溢出容器。
gap
用途:統一管理格線間距,避免每個 item 都各自寫 margin。
.feature-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
column-gap: 32px;
row-gap: 40px;
}
解釋:column-gap 控制左右欄距,row-gap 控制上下列距。只要欄列間距一致,也可以直接用 gap。
常見錯誤:在 grid item 上混用大量 margin,後續改版時很難判斷真正的版面間距來源。
fr、repeat()、minmax() 組合
用途:建立可自動適應寬度的卡片列表,少寫多組 media query。
.post-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 24px;
}
解釋:minmax(240px, 1fr) 讓每張卡片最小 240px,空間足夠時平均分配剩餘寬度。
常見錯誤:把 1fr 寫成 1 fr。中間不能有空白,否則語法無效。
CSS Grid 子元素怎麼放到指定位置?
子元素屬性負責指定 item 放在哪裡,常用 grid-column、grid-row、span 與起訖線控制跨欄跨列。
父層定義版面地圖,子元素決定自己占哪一塊。這個分工很適合做首頁主視覺、重點卡片、排行榜、側欄摘要等不規則區塊。
| 屬性 | 寫在哪裡 | 用途 | 最小範例 |
|---|---|---|---|
grid-column |
子元素 | 指定欄位起訖 | grid-column: 1 / 3; |
grid-row |
子元素 | 指定列位起訖 | grid-row: 1 / 2; |
span |
子元素 | 指定跨幾欄或幾列 | grid-column: span 2; |
grid-area |
子元素 | 放入命名區域 | grid-area: main; |
起訖線
用途:讓重點卡片從第一條欄線跨到第三條欄線,形成較寬的視覺權重。
.featured-card {
grid-column: 1 / 3;
grid-row: 1 / 2;
}
解釋:1 / 3 指的是從線 1 到線 3,中間會跨過兩個欄位。
常見錯誤:把線號當成格子數。三條線之間只有兩個欄位,這點在 DevTools overlay 裡看最清楚。
span
span 適合你不在乎從哪條線開始,只想讓某個 item 多占幾欄。卡片列表裡的精選文章、報表裡的總覽卡,常用這種寫法。
命名線與 area 的差異
命名線是替格線線號取名,適合精準定位;area 是替一塊矩形區域命名,適合頁面骨架。新手先學 area 會比較直覺,做複雜設計系統時再補命名線。
跨兩欄卡片範例
用途:在三欄卡片列表中,讓第一張重點內容跨兩欄。
.card-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
.card—wide { grid-column: span 2; }
解釋:.card--wide 仍然是同一個 grid item,只是它占用兩個 column tracks。
常見錯誤:在手機版忘記取消跨欄,導致窄螢幕仍嘗試排成多欄。小螢幕可改成 grid-column: auto;。
如何用 grid-template-areas 像畫平面圖一樣切版?
grid-template-areas 可以用名稱畫出版面區塊,特別適合 header、sidebar、main、footer 這類網站骨架。
這種寫法的好處是可讀性高。設計、行銷或 no-code 使用者就算不熟線號,也能看懂哪一塊內容放在哪裡。
header、sidebar、main、footer
用途:建立典型內容網站骨架,上方 header、左側 sidebar、右側 main、底部 footer。
.site-layout { display: grid; grid-template-columns: 260px minmax(0, 1fr); grid-template-areas: "header header" "sidebar main" "footer footer"; gap: 24px; }.site-header { grid-area: header; }
.site-sidebar { grid-area: sidebar; }
.site-main { grid-area: main; }
.site-footer { grid-area: footer; }
解釋:每一行字串代表一列,字串裡的名稱代表欄位區域。相同名稱連在一起,就會形成同一個 area。
常見錯誤:area 名稱拼錯,例如模板寫 sidebar,子元素寫 side-bar,瀏覽器不會幫你猜。
桌機與手機 area 切換
用途:桌機保留 sidebar,手機改成單欄順序,讓內容先於補充導覽。
@media (max-width: 768px) {
.site-layout {
grid-template-columns: 1fr;
grid-template-areas:
"header"
"main"
"sidebar"
"footer";
}
}
解釋:手機版只改父層模板,就能調整整個區塊順序,不必在 HTML 裡搬動元素。
常見錯誤:只改欄數,忘記同步改 grid-template-areas,造成模板欄位數和字串欄位數不一致。
area 必須是矩形的提醒
grid-template-areas 的同名區域必須形成完整矩形,不能做 L 形或斷裂形狀。我的做法是先用 area 處理大骨架,再用內層 Grid 或 Flexbox 處理細節,CSS 會乾淨很多。
如何從設計稿拆成 CSS Grid?
從設計稿拆 Grid,要先看內容區塊,再拆欄列,最後把命名、間距、斷點整理成可維護的 CSS 規則。
很多切版問題不是語法不會,而是一開始把區塊拆錯。看到設計稿先不要急著寫 grid-template-columns,先判斷哪些區塊應該共享同一組格線。
先看內容區塊
把頁面切成 header、hero、features、article list、sidebar、footer 等內容區塊。只有在同一個視覺群組裡需要對齊的元素,才適合放進同一個 grid container。
再拆欄列
拆欄列時先問三件事:有哪些欄是固定寬度、哪些欄要彈性伸縮、哪些區塊需要跨欄。這一步會直接決定 px、fr、minmax() 的使用方式。
最後整理成可維護 CSS
可維護的 Grid CSS 會把容器、區塊命名、RWD 規則分開。設計系統裡常會把欄距、最大寬度、斷點整理成 token,可延伸閱讀 設計系統與版面規範。
| 步驟 | 要做的事 | 產出 |
|---|---|---|
| 1 | 標出內容區塊 | 區塊清單 |
| 2 | 找出共用對齊線 | 主要欄線 |
| 3 | 決定固定欄與彈性欄 | 欄寬規則 |
| 4 | 命名區域或特殊卡片 | area 或 item class |
| 5 | 補上斷點與防溢出 | RWD CSS |
5 步驟切版流程
用途:把設計稿中的首頁 feature 區塊整理成可重複使用的 Grid 模組。
.feature-section { --grid-gap: 24px; display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(280px, 0.8fr); gap: var(--grid-gap); align-items: start; }
.feature-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(—grid-gap); }
解釋:外層處理主要文案與列表比例,內層再處理 feature list。不要讓所有元素擠在同一個大 Grid 裡。
常見錯誤:為了貼合設計稿而寫過多魔術數字,後續換內容長度就會破版。
CSS Grid 如何做響應式版面?
響應式 Grid 常用 minmax()、auto-fit、auto-fill、media query 與 container query 控制欄數。
卡片列表不一定要每個斷點手寫欄數。若卡片有合理最小寬度,可以讓瀏覽器自動判斷一列能放幾張,維護成本會低很多。
minmax()
minmax() 用來設定欄位最小與最大值。常見寫法是 minmax(240px, 1fr),代表卡片至少 240px,空間足夠時再平均分配。
auto-fit vs auto-fill
auto-fit 會讓空欄位收合,常用在卡片數量不固定的版面。auto-fill 會保留可填入的欄位軌道,適合你需要維持格線節奏的情境。
container query 使用情境
當元件會被放在不同寬度的容器中,例如同一張卡片可能出現在首頁、側欄、列表頁,container query 比只看整個 viewport 更貼近元件實際空間。
用途:讓 card list 依照容器寬度改欄數,而不只依照螢幕寬度。
.card-shell { container-type: inline-size; }.card-list { display: grid; grid-template-columns: 1fr; gap: 20px; }
@container (min-width: 640px) { .card-list { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
解釋:容器夠寬時,內部列表才切成兩欄。這對可重用元件很有幫助。
常見錯誤:把 container query 當成 media query 的完全替代。頁面級版面仍常需要 media query 控制整體骨架。
RWD 卡片列表範例
用途:建立不用手動列出多個斷點的響應式卡片列表。
.responsive-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 24px;
}
解釋:容器寬度足夠時會增加欄數,寬度不足時會自然降成較少欄。
常見錯誤:最小寬度設太大,例如 360px,手機版可能需要水平捲動。卡片最小寬度要依內容和容器一起測。
CSS Grid 常見錯誤怎麼排除?
Grid 常見問題多半來自語法空白、內容溢出、隱含列高、area 不連續,以及誤解 subgrid 的使用方式。
排錯時先打開 DevTools 的 Grid overlay,看線號、gap、area 是否符合預期,再檢查內容本身有沒有超過可用寬度。不要一開始就亂加 overflow: hidden。
1fr 不要寫成 1 fr
fr 是一個 CSS 單位,數字和單位必須黏在一起。1 fr 會被視為無效值,瀏覽器可能直接忽略整條宣告。
內容溢出
長網址、表格、程式碼、沒有換行的英文,都可能把 1fr 欄位撐開。我的習慣是主內容欄用 minmax(0, 1fr),再針對內文元素處理換行與最大寬度。
用途:處理 sidebar 加主內容版面中,主內容被長文字撐爆的情況。
.content-layout { display: grid; grid-template-columns: 280px minmax(0, 1fr); gap: 32px; }
.content-layout main { min-width: 0; overflow-wrap: break-word; }
解釋:minmax(0, 1fr) 和 min-width: 0 可以讓主內容欄真的縮回可用寬度。
常見錯誤:只在外層加 overflow: hidden,表面上切掉問題,實際內容可讀性可能變差,也可能影響版面穩定。談到版面位移時,可補看 CLS 版面位移修正。
subgrid 正確觀念
subgrid 是讓子層沿用父層格線的能力,適合卡片內部內容要跟外層欄線對齊的情境。正確方向是寫在 grid-template-columns 或 grid-template-rows 的值,不是寫 display: subgrid。正式發布前仍建議查 MDN 相容性表。
排錯表
| 問題 | 可能原因 | 處理方式 |
|---|---|---|
| 欄位沒有出現 | 只寫 display: grid |
補上 grid-template-columns |
| CSS 宣告無效 | 1fr 寫成 1 fr |
移除數字與單位之間的空白 |
| 主內容溢出 | 1fr 欄被內容撐開 |
使用 minmax(0, 1fr) 與 min-width: 0 |
| area 無效 | 名稱不連續或不是矩形 | 讓同名區域形成完整矩形 |
| 手機版仍多欄 | 沒有改 RWD 規則 | 在小螢幕改成單欄或調整 area |
subgrid 沒生效 |
寫成 display: subgrid |
改查正確語法與目標瀏覽器支援 |
CSS Grid 產生器、DevTools、視覺化編輯器怎麼用?
Grid 工具適合輔助理解與檢查,不適合無腦複製。產生器做初稿,DevTools 驗證格線,最後回到 CSS 整理。
對設計、行銷、no-code 製作者來說,工具能把抽象格線變成可看的線和區塊。重點是讀懂輸出的 CSS,而不是把工具當成切版黑盒。
產生器怎麼用
CSS Grid Generator 可以快速設定 rows、columns、gap,適合用來試版面骨架。產生後要檢查是否有太多固定尺寸,正式專案通常要改成 fr、minmax() 或設計系統 token。
DevTools 怎麼看格線
Chrome、Firefox 等瀏覽器 DevTools 都能顯示 Grid overlay。打開後先看三件事:線號是否符合預期、gap 是否來自 Grid、area 名稱是否對到子元素。
視覺化編輯器如何對應 CSS
視覺化編輯器常把欄數、列高、間距、對齊用面板呈現。你看到的欄位數通常對應 grid-template-columns,間距對應 gap,區塊命名可能對應 grid-area 或內部 class。
用途:把產生器輸出的固定欄寬,改成比較適合正式網站的彈性欄寬。
.generator-output { display: grid; grid-template-columns: 300px 300px 300px; gap: 20px; }
.cleaned-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
解釋:第一段像工具初稿,第二段比較適合放進會變動寬度的網站容器。
常見錯誤:把工具輸出的固定 pixel 欄寬直接放到正式頁,桌機看似正常,平板和手機很快就破版。
不要只複製貼上
工具給的是起點,不是最終版。產生器負責快速試圖,DevTools 負責驗證,人工整理負責命名、斷點、可維護性。這一步做完,Grid 才會變成團隊能長期使用的 CSS。
學完 CSS Grid 下一步怎麼練?
練 Grid 的順序應該從單一卡片列表開始,再做頁面骨架、RWD、area 切換,最後練設計稿拆解。
不要一開始就挑太複雜的 dashboard。先把父層欄列、子元素跨欄、手機版單欄這三件事練熟,再補進工具與 DevTools。
練習順序
- 用
display: grid做三欄卡片列表。 - 加入
repeat(auto-fit, minmax())做響應式。 - 用
grid-column: span 2做重點卡片。 - 用
grid-template-areas做 header、sidebar、main、footer。 - 拿一張真實設計稿,照 5 步驟拆成 Grid。
推薦資源
語法查證建議看 MDN CSS Grid Layout,完整參考可看 CSS-Tricks Complete Guide to Grid。互動練習可用 CSS Grid Garden,範例學習可看 Grid by Example。需要快速試格線時,可用 CSS Grid Generator 產生初稿。
站內下一篇閱讀路徑
如果 CSS 基礎還不穩,先回到 CSS 基礎教學。如果你在判斷一排元素怎麼對齊,看 Flexbox 會更直接。等到版面規則開始重複出現在多個頁面,再延伸到 design system 的 grid token。
CSS Grid 是什麼?
CSS Grid 是 CSS 的二維版面配置系統,可以在父層建立欄與列,再讓子元素放進指定格線位置。它適合用在頁面骨架、卡片列表、dashboard、左右欄內容區等需要穩定對齊的版面。
CSS Grid 和 Flexbox 差在哪?
Grid 擅長同時處理欄與列,適合整體版面骨架;Flexbox 擅長單軸排列,適合導覽列、按鈕群組與卡片內部內容。實務切版常把兩者混用。
display: grid 之後,哪些元素會變成 grid item?
寫上 display: grid 的元素會成為 grid container,它的直接子元素會變成 grid item。孫層元素不會自動變成同一組 grid item,除非它自己的父層也建立 Grid。
fr、repeat()、minmax() 分別什麼時候用?
fr 用來分配剩餘空間,repeat() 用來重複建立欄或列,minmax() 用來設定最小與最大尺寸。常見組合是 repeat(auto-fit, minmax(240px, 1fr))。
grid-template-areas 適合新手嗎?
適合。它用命名區域畫出版面,對 header、sidebar、main、footer 這類骨架很直覺。要注意同名 area 必須形成矩形,名稱也要和子元素的 grid-area 對上。
auto-fit 和 auto-fill 差在哪?
auto-fit 會讓空欄位收合,常用在卡片數量不固定的列表。auto-fill 會保留可填入的欄位軌道,適合需要維持格線節奏的版面。
subgrid 是什麼?可以寫 display: subgrid 嗎?
subgrid 讓子層沿用父層的欄或列格線,適合需要內外對齊的複雜版面。不能寫 display: subgrid,應查正確語法並在發布前確認目標瀏覽器支援。
為什麼 Grid 版面會溢出或高度怪怪的?
常見原因包含長文字撐開 1fr 欄位、item 預設最小寬度影響縮放、內容高度不一致、area 設定錯誤。可先用 DevTools 看格線,再檢查 minmax(0, 1fr)、min-width: 0 與換行規則。
CSS Grid 產生器可以直接拿來切正式網站嗎?
可以當初稿,但不建議原封不動貼上正式網站。產生器常輸出固定尺寸,仍要依專案改成可維護的命名、彈性欄寬、RWD 規則與設計系統間距。
新手學 CSS Grid 的練習順序是什麼?
先練三欄卡片列表,再練 auto-fit 響應式,接著練跨欄卡片、grid-template-areas 頁面骨架,最後拿真實設計稿拆欄列與斷點。
CSS Grid 會取代 Flexbox 嗎?
不會。Grid 和 Flexbox 解決的問題不同。Grid 適合二維版面與頁面骨架,Flexbox 適合單軸內容排列。成熟的切版通常會把 Grid 用在外層,Flexbox 用在元件內層。
CSS Flexbox 教學:彈性盒子屬性、範例與常見問題
學會 css flexbox 的核心概念、display flex、主軸與交叉軸、justify-content、align-items、gap 與 flex 屬性用法,搭配 flexbox 教學範例、常見排版陷阱與除錯清單,判斷何時該用彈性盒子完成導覽列、卡片與表單排列。
css教學入門:從選擇器與基本語法學會網頁顏色、字型和版面設定
css教學新手先掌握 CSS 基本語法、選擇器、屬性與屬性值,再練習設定文字顏色、字型、間距、背景和基礎版面,理解 HTML、CSS、JavaScript 的分工,寫出可閱讀又好維護的網頁樣式。
2026 前端技術概述:HTML、CSS、JavaScript 各自功能與應用
深入說明前端三劍客的角色與使用情境,解析 HTML 結構、CSS 樣式與 JavaScript 互動,讓你快速掌握 coding 必備知識,提升網站開發效率。