はじめに
「flexboxだと縦横のレイアウトが思うように組めない」「カード一覧をきれいに整列させたい」という経験はありませんか?
これらの多くは、Grid(グリッド)レイアウトを使うことで簡単に解決できます。
前回の記事では、要素を1方向に並べるflexboxについて解説しました。
今回は、縦横二次元でレイアウトを組めるCSSの機能「Grid」について、仕組みからサンプルコードまでわかりやすく解説します。
Gridとは?
Gridは、要素を縦横の格子状(グリッド)に配置できるCSSのレイアウト機能です。
flexboxが1方向(行 or 列)のレイアウトを得意とするのに対し、Gridは行と列を同時にコントロールできるのが大きな特徴です。ページ全体のレイアウトや、カード一覧のような整った並びを組むのに向いています。
コンテナとアイテムの関係
Gridも、flexboxと同様に親要素(コンテナ)と子要素(アイテム)という2つの役割で構成されます。
| 役割 | 説明 |
|---|---|
| grid コンテナ | display: grid を指定した親要素。行・列の構成を定義する |
| grid アイテム | grid コンテナの直下にある子要素。配置される側 |

flexboxとGridは「どちらか一方だけ使う」ものではありません。ページ全体の骨組みはGrid、その中の細かい部品(ナビゲーションメニューなど)はflexbox、というように組み合わせて使うのが実践的です。
display: grid(コンテナ化)
Gridを使うには、まず親要素に display: grid を指定します。
書式
.container {
display: grid;
}サンプル
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>.container {
display: grid;
}display: grid を指定しただけでは、子要素(.item)は1列に縦積みされます。列や行の数は、次に紹介する grid-template-columns などで定義していきます。
grid-template-columns / grid-template-rows(列・行の定義)
grid-template-columns は列の数と幅を、grid-template-rows は行の数と高さを指定します。
書式
.container {
display: grid;
grid-template-columns: 値 値 値; /* 列の幅を左から順に指定 */
grid-template-rows: 値 値; /* 行の高さを上から順に指定 */
}サンプル
/* 幅200pxの列を3つ作る */
.container {
display: grid;
grid-template-columns: 200px 200px 200px;
}指定した値の個数がそのまま列(または行)の数になります。
fr単位(余った幅の比率)
Gridには fr(fraction=割合)という専用の単位があります。コンテナの余った幅を比率で分け合うイメージです。
/* 3等分の列を作る */
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
/* 左サイドバー固定、右メインエリアが可変 */
.layout {
display: grid;
grid-template-columns: 240px 1fr;
}
/* 比率2:1:1で分割 */
.ratio-layout {
display: grid;
grid-template-columns: 2fr 1fr 1fr;
}repeat()(繰り返し指定)
同じ幅の列を何度も書くのは冗長なので、repeat() を使うとまとめて指定できます。
/* 1fr 1fr 1fr 1fr と同じ意味 */
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
}
/* 200pxの列を3つ */
.container {
display: grid;
grid-template-columns: repeat(3, 200px);
}grid-template-columns: repeat(3, 1fr); は「1frを3回繰り返す」という意味で、1fr 1fr 1fr と全く同じ結果になります。列数が多い・変更する可能性がある場合は repeat() を使うとメンテナンスしやすくなります。
gap(要素間の余白)
gap は、gridアイテム同士の間隔を指定します。flexboxと同じプロパティ名・使い方です。
書式
.container {
display: grid;
gap: 値; /* 縦横共通 */
gap: 縦の値 横の値; /* 縦横を個別に指定 */
}サンプル
/* アイテム間に24pxの余白(縦横共通) */
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
/* 縦16px・横24pxで個別指定 */
.card-list {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px 24px;
}minmax() と auto-fit / auto-fill(レスポンシブなグリッド)
minmax() と auto-fit(または auto-fill)を組み合わせると、メディアクエリを書かなくても画面幅に応じて列数が自動で変わるレスポンシブなグリッドが作れます。
書式
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(最小幅, 1fr));
}サンプル
/* 最小220px、最大1frで列数が自動調整されるカードグリッド */
.card-list {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 24px;
}このコードでは、コンテナの幅に応じて「220px以上を確保できる列数」が自動的に計算されます。画面が広ければ列数が増え、狭ければ列数が減って折り返される、レスポンシブなカード一覧が完成します。
auto-fit と auto-fill の違いauto-fit は余った列を潰してアイテムを引き伸ばします。auto-fill は余った列を空白のまま残します。アイテム数が少ないときに幅いっぱいに広げたい場合は auto-fit、一定幅を保ちたい場合は auto-fill を使い分けてください。
grid-column / grid-row(アイテムの配置・結合)
grid-column と grid-row は、特定のアイテムが何列目〜何列目(何行目〜何行目)を占めるかを指定します。セルの結合(スパン)に使います。
書式
.item {
grid-column: 開始線 / 終了線;
grid-row: 開始線 / 終了線;
}
/* span を使うと「いくつ分」で指定できる */
.item {
grid-column: span 数;
}サンプル
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
}
/* 見出し用アイテムを4列すべてに広げる */
.item--heading {
grid-column: 1 / 5;
}
/* このアイテムだけ2列分の幅にする */
.item--wide {
grid-column: span 2;
}
/* 2行分の高さにする */
.item--tall {
grid-row: span 2;
}グリッド線(開始線・終了線)は「1」から数えます。grid-column: 1 / 5; は「1本目の線から5本目の線まで」=4列分を占めるという意味です。慣れないうちは span を使う書き方の方が直感的です。
grid-template-areas(エリア名によるレイアウト)
grid-template-areas は、エリアに名前を付けてレイアウトを組む方法です。CSSを見ただけでページの構造がイメージしやすくなります。
書式
.container {
display: grid;
grid-template-areas:
"エリア名1 エリア名2"
"エリア名3 エリア名3";
}
.item {
grid-area: エリア名1;
}サンプル(ヘッダー・サイドバー・メインのページレイアウト)
<div class="layout">
<header class="header">ヘッダー</header>
<nav class="sidebar">サイドバー</nav>
<main class="main">メインコンテンツ</main>
<footer class="footer">フッター</footer>
</div>.layout {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
gap: 16px;
min-height: 100vh;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }grid-template-areas の文字列は、実際のレイアウトの見た目とほぼ同じ形になります。文字列内で同じ名前を並べると、その分だけセルが結合されます(上記の header と footer は横に2セル分結合)。
justify-items / align-items(グリッド内の配置)
justify-items は各セル内の横方向の配置、align-items は各セル内の縦方向の配置を指定します。
書式
.container {
display: grid;
justify-items: 値; /* start / end / center / stretch */
align-items: 値; /* start / end / center / stretch */
}サンプル
/* すべてのアイテムをセルの中央に配置 */
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
justify-items: center;
align-items: center;
}flexboxの justify-content / align-items と名前が似ていますが役割が異なります。Gridの justify-items / align-items は「セルの中でアイテムをどう配置するか」、justify-content / align-content は「グリッド全体をコンテナ内でどう配置するか」を指定します。
サンプル(レスポンシブなカード一覧レイアウト)
Gridのプロパティを組み合わせた、実用的なカード一覧のサンプルです。画面幅に応じて列数が自動で変わります。
HTML
<div class="card-list">
<div class="card">
<h2 class="card-title">記事タイトル1</h2>
<p class="card-text">記事の概要テキストが入ります。</p>
</div>
<div class="card">
<h2 class="card-title">記事タイトル2</h2>
<p class="card-text">記事の概要テキストが入ります。</p>
</div>
<div class="card">
<h2 class="card-title">記事タイトル3</h2>
<p class="card-text">記事の概要テキストが入ります。</p>
</div>
</div>CSS
*,
*::before,
*::after {
box-sizing: border-box;
}
/* 最小220px、収まる分だけ列数が自動で変わるグリッド */
.card-list {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 24px;
max-width: 960px;
margin: 0 auto;
padding: 0 16px;
}
.card {
border: 1px solid #ddd;
border-radius: 8px;
padding: 20px;
background-color: #fff;
}
.card-title {
margin: 0 0 12px 0;
font-size: 1.1rem;
border-bottom: 2px solid #0077cc;
padding-bottom: 8px;
}
.card-text {
margin: 0;
color: #555;
line-height: 1.7;
}このコードでは、画面が広いときは3列、狭くなると2列・1列と自動で折り返されます。メディアクエリを一切書かずにレスポンシブ対応できるのが、Gridならではの強みです。
よくある質問・トラブル対処
Q. flexboxとGrid、どちらを使えばいいか分からない
→ 1方向(横並びだけ・縦並びだけ)のレイアウトなら flexbox、縦横二次元でレイアウトを組みたい場合は Grid を選ぶのが基本です。ページ全体の骨組みはGrid、ナビゲーションメニューなど内部の部品はflexbox、という組み合わせもよく使われます。
Q. grid-template-columnsで列数を増やしたら、はみ出してしまった
→ 固定幅(pxなど)を列数分並べると、コンテナ幅を超えることがあります。1fr や repeat(auto-fit, minmax(...)) を使うと、コンテナ幅に収まるよう自動調整されます。
Q. grid-template-areasで指定した名前通りに配置されない
→ 各アイテム側で grid-area: エリア名; の指定を忘れていないか確認してください。コンテナ側の grid-template-areas だけでは配置は決まりません。
Q. auto-fitとauto-fillの違いがよく分からない
→ アイテム数がグリッドを埋めきらないとき、auto-fit は余ったスペースをアイテムに配分して引き伸ばし、auto-fill は余ったスペースを空の列として残します。見た目を比較しながら試すのが理解の近道です。
おわりに(まとめ)
Gridを使いこなせると、ページ全体のレイアウトやカード一覧のような整った並びを、シンプルなコードで組めるようになります。
- ✅ 親要素に
display: grid;を指定すると縦横の格子状レイアウトが使える - ✅
grid-template-columns/grid-template-rowsで列・行の数と幅を定義する - ✅
fr単位とrepeat()を使うと、可変幅の列を簡潔に指定できる - ✅
repeat(auto-fit, minmax(...))で、メディアクエリなしのレスポンシブなグリッドが作れる - ✅
grid-column/grid-rowでアイテムのセル結合ができる - ✅
grid-template-areasを使うと、エリア名でレイアウト構造を直感的に表現できる
まず display: grid・grid-template-columns・fr単位・gap の4つを押さえましょう。
この4つを理解するだけで、カード一覧やページレイアウトの大半をGridで組めるようになります。
次回は「CSSのpositionプロパティ」について勉強・解説します。
この記事が、少しでも誰かのお役に立てれば幸いです。
関連記事
- 【CSS】flexboxレイアウトの使い方を基本から解説
- 【CSS】ボックスモデルとは?margin・padding・borderの仕組みを解説
- 【CSS】テキスト関連プロパティについて基本解説
- Webページに関する基礎的な勉強を始めます
当サイトの記事で使用したVBAなどのサンプルをDLできます
この記事のサンプルはありません!
ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!

