CSS Gridで2次元レイアウトを組む — grid-template・fr単位・areasの実践ガイド
この章の目次開く
- 基本の使い方 — display: grid と grid-template-columns
- fr 単位 — 「余った空間の何分の何か」
- grid-template-columns / rows のパターン
- grid-template-areas — 名前でレイアウトを視覚的に定義
- アイテムの配置 — span で複数セルをまたぐ
- gap — アイテム間の間隔
- 実務でよく使うパターン
- レスポンシブカードグリッド(メディアクエリ不要)
- サイドバー付きレイアウト
- ダッシュボード風のタイル配置
- Flexbox vs Grid の使い分け
- よくあるハマりどころ
- auto-fill で意図しない隙間が出る
- grid-template-areas の綴りミス
- IE11はGridの旧仕様しかサポートしない
- ちゃんと使うためのポイント
- 参考リンク
CSS Gridは、行と列の2次元でレイアウトを制御できる仕組みです。Flexboxが1軸(横または縦)のレイアウトに適しているのに対し、Gridは行と列を同時に操作できるため、ページ全体のレイアウトや複雑なグリッドUIに向いています。
学習者Flexbox を覚えたばかりなのに Grid も…?2つの違いと使い分けがよく分からない。
Flexboxは「1列の中でどう並べるか」を制御するツール、Gridは「ページ全体を行と列の碁盤の目に区切る」ツールです。役割が違うので、両方使えるとレイアウトの引き出しが一気に広がります。

基本の使い方 — display: grid と grid-template-columns
親要素に display: grid を指定し、grid-template-columns で列の数と幅を定義します。
<div class="container">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</div>.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* 3列、均等幅 */
gap: 16px;
}アイテムは定義した列数で自動的に折り返し、3列 × 2行のグリッドになります。
display: grid を付けた要素をグリッドコンテナ、その直接の子要素をグリッドアイテムと呼びます。Flexboxと同じ「親に指定 → 子が並ぶ」の構造です。
fr 単位 — 「余った空間の何分の何か」
fr(fraction)はGrid専用の単位で、利用可能な空間を比率で分配します。
/* 3列均等 */
grid-template-columns: 1fr 1fr 1fr;
/* 左の固定サイドバー + 残りをメイン */
grid-template-columns: 240px 1fr;
/* 左:右 = 1:2 の比率 */
grid-template-columns: 1fr 2fr;px や % と混在できるのがポイントです。「固定幅のサイドバー + 残りをメインコンテンツ」のようなパターンが 240px 1fr の一行で書けます。
grid-template-columns / rows のパターン
列と行のサイズ定義にはいくつかの書き方があります。
/* 固定幅 */
grid-template-columns: 200px 400px 200px;
/* repeat() で繰り返し */
grid-template-columns: repeat(3, 1fr); /* 3列均等 */
grid-template-columns: repeat(4, 100px); /* 100px × 4列 */
/* minmax() で最小・最大を指定 */
grid-template-columns: repeat(3, minmax(200px, 1fr));
/* auto-fill で画面幅に応じて自動的に列数を調整 */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));| パターン | 意味 |
|---|---|
repeat(3, 1fr) | 均等3列 |
200px 1fr | 固定幅 + 残り全部 |
repeat(auto-fill, minmax(200px, 1fr)) | 200px以上で自動的に列数を調整 |
行の高さも同じように指定できます。
grid-template-rows: 60px 1fr 80px; /* ヘッダー・本文・フッター */grid-template-areas — 名前でレイアウトを視覚的に定義
Grid最大の強みの一つが grid-template-areas です。レイアウトを文字列で視覚的に記述できます。
.page {
display: grid;
grid-template-areas:
'header header'
'sidebar main'
'footer footer';
grid-template-columns: 240px 1fr;
grid-template-rows: 60px 1fr 60px;
min-height: 100vh;
}
.header {
grid-area: header;
}
.sidebar {
grid-area: sidebar;
}
.main {
grid-area: main;
}
.footer {
grid-area: footer;
}CSSを見ただけで「ヘッダーは全幅、左にサイドバー、右にメイン、フッターも全幅」というレイアウト構造が想像できます。
先生grid-template-areas
はチーム開発で特に威力を発揮するよ。新しいメンバーがCSSを見たとき、レイアウトの意図が一目で分かるからね。
アイテムの配置 — span で複数セルをまたぐ
アイテムが複数のセルにまたがるように指定できます。
/* 列番号で指定 */
.featured {
grid-column: 1 / 3; /* 1列目のラインから3列目のラインまで(2列分) */
grid-row: 1 / 2;
}
/* span を使う書き方(推奨) */
.wide {
grid-column: span 2; /* 2列分の幅を占める */
}
.tall {
grid-row: span 3; /* 3行分の高さを占める */
}
span の方がコードの意図が明確で読みやすいです。「ライン番号を数える」のは直感的でないため、grid-template-areas か span で書くのがおすすめです。
gap — アイテム間の間隔
Flexboxと同じく gap でアイテム間の余白をまとめて指定できます。
.grid {
display: grid;
gap: 16px; /* 行・列とも 16px */
gap: 8px 16px; /* 行方向 列方向 */
row-gap: 8px; /* 行方向のみ */
column-gap: 16px; /* 列方向のみ */
}margin で調整するのと違い、外側に余計な余白がつかないのが gap の利点です。
実務でよく使うパターン
レスポンシブカードグリッド(メディアクエリ不要)
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 24px;
}auto-fill + minmax の組み合わせで、画面幅に応じて列数が自動調整されます。メディアクエリを1行も書かずにレスポンシブなグリッドが実現できる、Gridの最も強力なパターンです。
サイドバー付きレイアウト
.layout {
display: grid;
grid-template-columns: 260px 1fr;
gap: 24px;
max-width: 1200px;
margin: 0 auto;
}
/* モバイルでは1列に */
@media (max-width: 768px) {
.layout {
grid-template-columns: 1fr;
}
}ダッシュボード風のタイル配置
.dashboard {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
}
.widget-large {
grid-column: span 2;
grid-row: span 2;
}Flexbox vs Grid の使い分け
学習者結局FlexboxとGrid、どっちを使えばいいの?両方できるパターンもあるよね?
| 観点 | Flexbox | Grid |
|---|---|---|
| 次元 | 1次元(行 or 列) | 2次元(行と列) |
| 向いている場面 | ナビ・ボタン並び・カード1行 | ページレイアウト・複数行グリッド |
| アイテム配置の主導権 | アイテム主導(中身に応じて伸縮) | コンテナ主導(枠を先に決める) |
| コンテンツ量が不定のとき | 得意(中身に合わせて伸縮) | やや苦手(枠が先に決まるため) |
実務では両方を組み合わせます。外側のページ構造はGrid、内側のUIコンポーネントはFlexboxというパターンが多いです。
/* ページ全体 → Grid */
.page {
display: grid;
grid-template-columns: 240px 1fr;
}
/* ナビゲーション(Grid内のアイテム)→ Flexbox */
.nav {
display: flex;
flex-direction: column;
gap: 8px;
}よくあるハマりどころ
auto-fill で意図しない隙間が出る
auto-fill は余ったスペースに空のトラックを確保します。アイテムが少ないときに右側が空くのはこのためです。アイテムを引き伸ばしたい場合は auto-fit に変えてみてください。
grid-template-areas の綴りミス
grid-area: heaer;(typo)のように、grid-template-areas で定義した名前と grid-area の値が一致しないと、そのアイテムは配置されません。DevToolsの「Grid」オーバーレイでエリアが表示されるので確認しましょう。
IE11はGridの旧仕様しかサポートしない
IE11では grid-template-areas や gap が使えません。2024年以降のプロジェクトであればIE対応は不要ですが、レガシー環境では注意が必要です。
ちゃんと使うためのポイント
-
fr単位とauto-fill + minmaxの組み合わせはレスポンシブグリッドの定石 grid-template-areasでレイアウトの意図をコードに残す- Flexboxは「1方向の並び」、Gridは「行×列の2次元」と使い分ける
- DevToolsの「Grid」オーバーレイを活用して、ラインやエリアの配置を目視確認する
次の章では、画面サイズに応じてレイアウトを切り替えるレスポンシブデザインとメディアクエリを学びます。
参考リンク
- MDN — グリッドレイアウトの基本概念 — Gridレイアウト基本概念の公式ガイド
- MDN — grid-template-columns — 列定義(repeat・auto-fill等)のリファレンス
- MDN — grid-template-areas — エリア名によるレイアウト定義
- MDN — minmax() —
minmax()関数のリファレンス
