【CSS】CSS Gridの使い方|基本から実務レイアウトまで完全ガイド

Webページのレイアウトを組むとき、floatFlexboxだけでは複雑な配置に苦労した経験はありませんか? ヘッダー・サイドバー・メインコンテンツ・フッターを思い通りに並べたい、カード型UIをレスポンシブに配置したい――そんなとき頼りになるのがCSS Gridです。

CSS Gridは行と列の2次元レイアウトを直感的に定義できるCSSの仕組みです。Flexboxが「1方向の並び」を得意とするのに対し、Gridは行と列を同時に制御できるため、ページ全体のレイアウトから細かなUIパーツまで幅広く対応できます。

この記事では、CSS Gridの基本プロパティから実務で使えるレイアウトパターンまで、コード付きで体系的に解説します。初心者の方でも手を動かしながら理解できるよう、ステップバイステップで進めていきます。

この記事で学べること

  • CSS Gridの基本概念とFlexboxとの違い
  • grid-template-columns / rows、fr単位、repeat()、minmax() の使い方
  • gap プロパティによる余白制御
  • grid-column / grid-row / span によるアイテム配置
  • grid-template-areas による直感的なレイアウト定義
  • 整列プロパティ(justify-items、align-items、place-items など)
  • 実務で使えるレイアウトパターン集(カードグリッド・聖杯レイアウト・ダッシュボードなど)
  • FlexboxとGridの使い分け基準
スポンサーリンク

CSS Gridとは(Flexboxとの違い)

CSS Grid Layout(以下 CSS Grid)は、Webページの要素を行(row)と列(column)の2次元グリッド上に配置するためのレイアウトシステムです。2017年に主要ブラウザで対応が揃い、現在ではすべてのモダンブラウザで安定して使用できます。

CSS Gridの最大の特徴は、親要素(グリッドコンテナ)にプロパティを設定するだけで、子要素(グリッドアイテム)が自動的にグリッド上に配置される点です。

CSS – Gridの最小構成
.container {  display: grid;  grid-template-columns: 1fr 1fr 1fr;  gap: 16px;}

たったこれだけで、子要素が3列の等幅グリッドに自動配置されます。Flexboxでは flex-wrapwidth の計算が必要な場面でも、Gridなら直感的に記述できます。

FlexboxとGridの違い早見表

FlexboxとGridはどちらもモダンなレイアウト手法ですが、得意分野が異なります。以下の表で違いを確認しましょう。

比較項目 Flexbox CSS Grid
レイアウトの方向 1次元(横 or 縦) 2次元(横 + 縦)
得意な用途 ナビバー、ボタン群、1行の並び ページ全体、カードグリッド、複雑な配置
配置の起点 コンテンツ(内容に応じて伸縮) レイアウト(枠を先に定義)
折り返し flex-wrap で可能(行間の制御が弱い) 自動配置 + 行列とも完全制御
セルの結合 不可 span で複数セルにまたがれる
エリア名での配置 不可 grid-template-areas で可能

ポイント:FlexboxとGridは「どちらが優れている」ではなく「用途が違う」ツールです。実務では両方を組み合わせて使うのが一般的です。ページ全体のレイアウトはGrid、ナビバーやボタン群などの1列の並びはFlexbox、と使い分けましょう。

Gridの基本(display: grid と列・行の定義)

CSS Gridを使うには、まず親要素に display: grid を指定してグリッドコンテナにします。次に grid-template-columnsgrid-template-rows で列と行のサイズを定義します。

display: grid でグリッドコンテナにする

HTML
<div class="grid-container">  <div>Item 1</div>  <div>Item 2</div>  <div>Item 3</div>  <div>Item 4</div>  <div>Item 5</div>  <div>Item 6</div></div>
CSS
.grid-container {  display: grid;  grid-template-columns: 200px 200px 200px;}

この例では3列×200pxのグリッドが作られ、6つの子要素が3列×2行に自動配置されます。display: grid を指定した要素がグリッドコンテナ、その直接の子要素がグリッドアイテムになります。

display: inline-grid を使うと、グリッドコンテナ自体がインライン要素として振る舞います。テキストの中にグリッドを埋め込みたい場面で使いますが、実務ではほとんど使いません。

grid-template-columns(列の定義)

grid-template-columns は列の数とそれぞれの幅を定義するプロパティです。値をスペース区切りで並べた数だけ列が作られます。

CSS
/* 固定幅で3列 */grid-template-columns: 100px 200px 150px;/* パーセントで3列 */grid-template-columns: 25% 50% 25%;/* 固定幅 + 残りを自動 */grid-template-columns: 200px auto 200px;

grid-template-rows(行の定義)

grid-template-rows は行の高さを定義します。指定しなければ行の高さはコンテンツに応じて自動決定されます。

CSS
.grid-container {  display: grid;  grid-template-columns: 1fr 1fr 1fr;  grid-template-rows: 100px 200px;}

この例では1行目が100px、2行目が200pxの高さになります。3行目以降のアイテムがある場合、明示的に定義されていない行は auto(コンテンツの高さ)になります。

fr単位(余った空間を比率で分配)

fr(fraction)は、グリッドコンテナの余った空間を比率で分配する単位です。CSS Gridで最も重要な単位と言えます。

CSS
/* 3列を等幅に */grid-template-columns: 1fr 1fr 1fr;/* 左を1、中央を2、右を1の比率 */grid-template-columns: 1fr 2fr 1fr;/* サイドバー200px固定 + メインが残り全部 */grid-template-columns: 200px 1fr;

fr% と似ていますが、gap(余白)を自動的に差し引いてから分配してくれる点が異なります。% だと gap の分だけはみ出すことがありますが、fr ならその心配がありません。

ポイント:fr 単位はグリッドレイアウトで最もよく使う単位です。% よりも柔軟で、gap との相性も良いため、迷ったら fr を使いましょう。

repeat() で繰り返しを簡潔に書く

同じ幅の列を何度も書くのは面倒です。repeat() 関数を使えば繰り返しを簡潔に記述できます。

CSS
/* この2つは同じ意味 */grid-template-columns: 1fr 1fr 1fr 1fr;grid-template-columns: repeat(4, 1fr);/* 200px を3回繰り返し */grid-template-columns: repeat(3, 200px);/* パターンの繰り返しも可能 */grid-template-columns: repeat(3, 1fr 2fr);/* → 1fr 2fr 1fr 2fr 1fr 2fr(6列)*/

minmax() で最小・最大幅を指定

minmax(min, max) は列や行のサイズに最小値と最大値を設定する関数です。レスポンシブデザインで特に役立ちます。

CSS
/* 最小200px、最大1frの3列 */grid-template-columns: repeat(3, minmax(200px, 1fr));/* 行の高さ: 最小100px、コンテンツに合わせて伸びる */grid-template-rows: minmax(100px, auto);

auto-fill と auto-fit(列数を自動で決める)

repeat() の第1引数に auto-fill または auto-fit を指定すると、コンテナ幅に応じて列数を自動決定できます。メディアクエリなしでレスポンシブなグリッドが作れる強力な機能です。

CSS
/* auto-fill: 最小250pxの列を詰められるだけ詰める */grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));/* auto-fit: auto-fillと似ているが、空の列を潰す */grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
キーワード 動作 余った空間
auto-fill 入るだけ列を作る(空の列も維持) 空の列トラックとして残る
auto-fit 入るだけ列を作り、空の列を潰す 既存の列に分配される

ポイント:実務では auto-fit の方がよく使われます。アイテム数が少ないときに余った空間をアイテムに分配してくれるため、見た目が自然になります。auto-fill は空の列が残るため、特定のグリッド幅を維持したい場合に使います。

行と列のギャップ(gap、row-gap、column-gap)

グリッドアイテム間の余白は gap プロパティで設定します。margin を使う必要がないため、計算が簡単でレイアウトが崩れにくくなります。

CSS
.grid-container {  display: grid;  grid-template-columns: repeat(3, 1fr);  /* 行と列のギャップを同時に設定 */  gap: 20px;  /* 行と列を個別に設定 */  gap: 20px 40px; /* row-gap column-gap */  /* 個別プロパティ */  row-gap: 20px;  column-gap: 40px;}

かつては grid-gapgrid-row-gapgrid-column-gap という名前でしたが、現在は gaprow-gapcolumn-gap に統一されています。古い名前でも動作しますが、新しい名前を使いましょう。

gapアイテム間のみに適用されます。グリッドコンテナの外側(端)には余白が入りません。コンテナの外側に余白が欲しい場合は、コンテナに padding を追加します。

アイテムの配置(grid-column、grid-row、span)

デフォルトではグリッドアイテムは1セルずつ順番に配置されますが、grid-columngrid-row を使うと、特定の位置に配置したり複数セルにまたがらせることができます。

グリッド線(Grid Line)を理解する

CSS Gridでは列と列の境界、行と行の境界に番号が振られた線(グリッド線)があります。3列のグリッドなら、列のグリッド線は左端が1、右端が4です。

グリッド線の番号(3列の場合)
  列線1    列線2    列線3    列線4    |        |        |        |    v        v        v        v    +--------+--------+--------+ <-- 行線1    | col 1  | col 2  | col 3  |    +--------+--------+--------+ <-- 行線2    | col 1  | col 2  | col 3  |    +--------+--------+--------+ <-- 行線3

grid-column / grid-row で位置を指定

CSS
.item-a {  /* 列線1から列線3まで(2列分)*/  grid-column: 1 / 3;  /* 行線1から行線2まで(1行分)*/  grid-row: 1 / 2;}.item-b {  /* 列線3から列線4まで(1列分)*/  grid-column: 3 / 4;  /* 行線1から行線3まで(2行分)*/  grid-row: 1 / 3;}

span で「何セル分」と指定する

グリッド線の番号ではなく、何セル分またがるかspan で指定することもできます。こちらの方が直感的です。

CSS
.header {  /* 3列分にまたがる */  grid-column: span 3;}.sidebar {  /* 2行分にまたがる */  grid-row: span 2;}.featured {  /* 2列×2行にまたがる */  grid-column: span 2;  grid-row: span 2;}

ポイント:実務では span を使う方が多いです。「2列分またがる」の方が「グリッド線1から3」よりも意味が伝わりやすく、コードの可読性が上がります。

grid-columngrid-row はショートハンドです。個別に書く場合は以下のプロパティを使います。

ショートハンド 個別プロパティ 説明
grid-column grid-column-start / grid-column-end 列方向の開始線 / 終了線
grid-row grid-row-start / grid-row-end 行方向の開始線 / 終了線

grid-template-areas で直感的にレイアウト

grid-template-areas は、グリッドの各セルに名前(エリア名)を付けて、視覚的にレイアウトを定義できるプロパティです。CSSの中でレイアウトの形がそのまま見えるため、非常に直感的です。

基本的な使い方

CSS
.layout {  display: grid;  grid-template-columns: 200px 1fr;  grid-template-rows: 60px 1fr 40px;  grid-template-areas:    "header  header"    "sidebar main"    "footer  footer";  gap: 16px;  min-height: 100vh;}

各アイテムは grid-area プロパティでエリア名を指定して配置します。

CSS
.header  { grid-area: header; }.sidebar { grid-area: sidebar; }.main    { grid-area: main; }.footer  { grid-area: footer; }
HTML
<div class="layout">  <header class="header">ヘッダー</header>  <aside class="sidebar">サイドバー</aside>  <main class="main">メインコンテンツ</main>  <footer class="footer">フッター</footer></div>

CSSの grid-template-areas を見るだけで「ヘッダーは2列にまたがり、サイドバーは左、メインは右、フッターも2列にまたがる」というレイアウトが一目でわかります。

空のセルを作る(ドット記法)

エリア名の代わりにドット(.)を使うと、そのセルを空にできます。

CSS
grid-template-areas:  "header header header"  ".      main   sidebar"  "footer footer  footer";

2行目の左端のセルには何も配置されません。レイアウトに空白を作りたいときに便利です。

レスポンシブ対応(メディアクエリとの組み合わせ)

grid-template-areas はメディアクエリと組み合わせることで、画面幅に応じてレイアウトを切り替えることが簡単にできます。

CSS – レスポンシブ対応
/* モバイル: 1列レイアウト */.layout {  display: grid;  grid-template-columns: 1fr;  grid-template-areas:    "header"    "main"    "sidebar"    "footer";  gap: 16px;}/* デスクトップ: 2列レイアウト */@media (min-width: 768px) {  .layout {    grid-template-columns: 240px 1fr;    grid-template-areas:      "header  header"      "sidebar main"      "footer  footer";  }}

ポイント:grid-template-areas は、レイアウトの全体像を把握しやすく、チーム開発でもコードレビューがしやすいという大きなメリットがあります。ページ全体のレイアウトには積極的に使いましょう。

注意:grid-template-areas で定義するエリアは長方形でなければなりません。L字型やT字型のエリアは定義できません。また、各行の列数は必ず揃える必要があります。

整列(justify / align / place)

CSS Gridにはアイテムの整列を制御するプロパティが複数あります。「コンテナ内でグリッド全体をどこに置くか」と「セル内でアイテムをどこに置くか」の2つのレベルで整列を制御できます。

セル内のアイテム整列(justify-items / align-items)

グリッドセルの中でアイテムをどの位置に配置するかを制御します。

CSS
.grid-container {  display: grid;  grid-template-columns: repeat(3, 200px);  grid-template-rows: repeat(2, 150px);  /* 水平方向(インライン軸)の整列 */  justify-items: center; /* start | end | center | stretch */  /* 垂直方向(ブロック軸)の整列 */  align-items: center; /* start | end | center | stretch */  /* 両方を一括指定 */  place-items: center; /* align-items justify-items */}
プロパティ 方向 対象 デフォルト
justify-items 水平(横) セル内のアイテム stretch
align-items 垂直(縦) セル内のアイテム stretch
place-items 両方 セル内のアイテム stretch
justify-content 水平(横) グリッド全体 start
align-content 垂直(縦) グリッド全体 start
place-content 両方 グリッド全体 start

グリッド全体の整列(justify-content / align-content)

グリッドのトラック(列や行)の合計サイズがコンテナより小さい場合に、グリッド全体をコンテナ内のどこに配置するかを制御します。

CSS
.grid-container {  display: grid;  grid-template-columns: repeat(3, 150px);  height: 500px;  /* グリッド全体を水平方向の中央に */  justify-content: center;  /* グリッド全体を垂直方向の中央に */  align-content: center;  /* 両方を一括指定 */  place-content: center;}

justify-contentalign-content には、start / end / center の他に、space-between(両端揃えで均等配置)、space-around(均等配置+半分の余白)、space-evenly(完全均等配置)も指定できます。Flexboxと同じ感覚で使えます。

個別アイテムの整列(justify-self / align-self)

特定のアイテムだけ、コンテナの設定とは異なる整列にしたい場合は、アイテム側に justify-self / align-self を指定します。

CSS
.grid-container {  justify-items: start; /* 全体はstart */}.special-item {  justify-self: end; /* このアイテムだけend */  align-self: center; /* このアイテムだけ垂直中央 */}

CSS Gridで要素を完全に中央揃えにしたい場合は、place-items: center を使うのが最も簡潔です。たった3行で水平・垂直の中央配置が実現できます。

CSS – 最短の中央揃え
.center-wrapper {  display: grid;  place-items: center;  min-height: 100vh;}

実務でよく使うレイアウトパターン集

ここからは、CSS Gridを使った実務で頻出するレイアウトパターンを紹介します。コピー&ペーストして、そのままプロジェクトに組み込めるコードです。

パターン1: レスポンシブカードグリッド

最もよく使うパターンです。auto-fitminmax() を組み合わせることで、メディアクエリなしでカードが画面幅に応じて自動的に折り返されます。

HTML
<div class="card-grid">  <div class="card">カード1</div>  <div class="card">カード2</div>  <div class="card">カード3</div>  <div class="card">カード4</div>  <div class="card">カード5</div>  <div class="card">カード6</div></div>
CSS – レスポンシブカードグリッド
.card-grid {  display: grid;  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));  gap: 24px;  padding: 24px;}.card {  background: #fff;  border-radius: 12px;  padding: 24px;  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);  transition: transform 0.2s ease, box-shadow 0.2s ease;}.card:hover {  transform: translateY(-4px);  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);}

この1行 grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)) だけで、画面幅が広ければ3〜4列、狭ければ1列に自動調整されます。カード型UIの定番パターンです。

パターン2: 聖杯レイアウト(Holy Grail Layout)

「ヘッダー・左サイドバー・メインコンテンツ・右サイドバー・フッター」というWebサイトの定番レイアウトです。CSS Gridなら簡潔に実装できます。

CSS – 聖杯レイアウト
.holy-grail {  display: grid;  grid-template-columns: 200px 1fr 200px;  grid-template-rows: auto 1fr auto;  grid-template-areas:    "header  header  header"    "nav     main    aside"    "footer  footer  footer";  gap: 16px;  min-height: 100vh;}.holy-grail > header  { grid-area: header; }.holy-grail > nav     { grid-area: nav; }.holy-grail > main    { grid-area: main; }.holy-grail > aside   { grid-area: aside; }.holy-grail > footer  { grid-area: footer; }/* モバイル対応 */@media (max-width: 768px) {  .holy-grail {    grid-template-columns: 1fr;    grid-template-areas:      "header"      "nav"      "main"      "aside"      "footer";  }}

パターン3: ダッシュボード風グリッド

管理画面やダッシュボードでは、異なるサイズのパネルを組み合わせたレイアウトがよく使われます。span を使ってパネルの大きさを変えます。

HTML
<div class="dashboard">  <div class="panel panel-wide">売上グラフ</div>  <div class="panel">アクセス数</div>  <div class="panel">新規ユーザー</div>  <div class="panel panel-tall">タスク一覧</div>  <div class="panel">お知らせ</div>  <div class="panel">最近の注文</div></div>
CSS – ダッシュボード
.dashboard {  display: grid;  grid-template-columns: repeat(3, 1fr);  grid-auto-rows: minmax(150px, auto);  gap: 20px;  padding: 20px;}.panel {  background: #fff;  border-radius: 12px;  padding: 20px;  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);}/* 2列分の横長パネル */.panel-wide {  grid-column: span 2;}/* 2行分の縦長パネル */.panel-tall {  grid-row: span 2;}/* モバイル対応 */@media (max-width: 768px) {  .dashboard {    grid-template-columns: 1fr;  }  .panel-wide,  .panel-tall {    grid-column: span 1;    grid-row: span 1;  }}

grid-auto-rows: minmax(150px, auto) を使うことで、明示的に行数を定義しなくても、パネルが追加されるたびに自動的に行が作られます。コンテンツ量に合わせて高さも自動調整されます。

パターン4: 画像ギャラリー

画像ギャラリーでは、異なるサイズの画像を美しく並べるレイアウトが求められます。CSS Gridの span を使えば、特定の画像を目立たせるレイアウトが簡単に作れます。

CSS – 画像ギャラリー
.gallery {  display: grid;  grid-template-columns: repeat(4, 1fr);  grid-auto-rows: 200px;  gap: 8px;}.gallery img {  width: 100%;  height: 100%;  object-fit: cover;  border-radius: 8px;  transition: transform 0.3s ease;}.gallery img:hover {  transform: scale(1.05);}/* メイン画像を大きく表示 */.gallery-featured {  grid-column: span 2;  grid-row: span 2;}/* レスポンシブ対応 */@media (max-width: 768px) {  .gallery {    grid-template-columns: repeat(2, 1fr);    grid-auto-rows: 150px;  }}

object-fit: cover を使うと、画像のアスペクト比を保ちながらグリッドセルいっぱいに表示されます。画像が切り取られるのが気になる場合は object-fit: contain に変更してください。

FlexboxとGridの使い分け

FlexboxとCSS Gridは互いに排他的なものではなく、組み合わせて使うのが実務の基本です。ここでは具体的な使い分けの基準を示します。

Gridが適しているケース

ユースケース 理由
ページ全体のレイアウト ヘッダー・サイドバー・メイン・フッターを2次元で配置
カードグリッド auto-fit + minmax() でレスポンシブに
ダッシュボード 異なるサイズのパネルをspan で配置
画像ギャラリー 行と列を同時に制御して美しく配置
フォームレイアウト ラベルと入力欄を2列で整然と並べる

Flexboxが適しているケース

ユースケース 理由
ナビゲーションバー 1行に並べて、右端にボタンを配置
ボタン群 横並び + 間隔調整
メディアオブジェクト アイコン + テキストの横並び
中央揃え(簡単なもの) 1要素の中央配置
コンテンツの順序変更 order プロパティで並び替え

組み合わせの例

実務では外側のレイアウトをGrid、内側のコンポーネントをFlexboxで構成するのが一般的です。

CSS – Grid + Flexboxの組み合わせ
/* ページ全体: Grid */.page {  display: grid;  grid-template-columns: 240px 1fr;  grid-template-rows: auto 1fr auto;  min-height: 100vh;}/* ヘッダー内のナビ: Flexbox */.header-nav {  display: flex;  justify-content: space-between;  align-items: center;  padding: 0 24px;}/* メインエリアのカード: Grid */.card-list {  display: grid;  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));  gap: 20px;}/* カード内部: Flexbox */.card-content {  display: flex;  flex-direction: column;  gap: 12px;}

ポイント:「行と列の両方を制御したい」→ Grid、「1方向に並べたい」→ Flexbox、と覚えておけば迷いません。どちらか一方だけで無理に組もうとせず、適材適所で使い分けましょう。

まとめ

CSS Gridは、Webレイアウトを直感的かつ強力に制御できる仕組みです。この記事で解説した内容を振り返りましょう。

トピック 要点
CSS Gridとは 行と列の2次元レイアウトシステム。Flexboxは1次元、Gridは2次元。
基本プロパティ grid-template-columns / rows で列と行を定義。fr 単位で比率指定。
便利な関数 repeat() で繰り返し、minmax() で最小最大、auto-fit で列数自動化。
gap アイテム間の余白を簡潔に設定。margin 不要。
アイテム配置 grid-column / grid-row / span で位置とサイズを制御。
grid-template-areas エリア名で視覚的にレイアウトを定義。レスポンシブ切り替えも簡単。
整列 justify-items / align-items / place-items でセル内配置。justify-content / align-content でグリッド全体配置。
Flexboxとの使い分け 2次元レイアウト → Grid、1次元の並び → Flexbox。組み合わせて使う。

CSS Gridを使いこなすコツは、まずシンプルなグリッドから始めることです。display: grid + grid-template-columns + gap の3つだけで、多くのレイアウトが実現できます。慣れてきたら grid-template-areasspan を取り入れて、より複雑なレイアウトに挑戦してみてください。

特に repeat(auto-fit, minmax(250px, 1fr)) は、レスポンシブなカードグリッドを作るときの万能パターンです。このパターンだけでも覚えておくと、実務ですぐに役立ちます。