Webページのレイアウトを組むとき、floatやFlexboxだけでは複雑な配置に苦労した経験はありませんか? ヘッダー・サイドバー・メインコンテンツ・フッターを思い通りに並べたい、カード型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の最大の特徴は、親要素(グリッドコンテナ)にプロパティを設定するだけで、子要素(グリッドアイテム)が自動的にグリッド上に配置される点です。
たったこれだけで、子要素が3列の等幅グリッドに自動配置されます。Flexboxでは flex-wrap や width の計算が必要な場面でも、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-columns と grid-template-rows で列と行のサイズを定義します。
display: grid でグリッドコンテナにする
この例では3列×200pxのグリッドが作られ、6つの子要素が3列×2行に自動配置されます。display: grid を指定した要素がグリッドコンテナ、その直接の子要素がグリッドアイテムになります。
display: inline-grid を使うと、グリッドコンテナ自体がインライン要素として振る舞います。テキストの中にグリッドを埋め込みたい場面で使いますが、実務ではほとんど使いません。
grid-template-columns(列の定義)
grid-template-columns は列の数とそれぞれの幅を定義するプロパティです。値をスペース区切りで並べた数だけ列が作られます。
grid-template-rows(行の定義)
grid-template-rows は行の高さを定義します。指定しなければ行の高さはコンテンツに応じて自動決定されます。
この例では1行目が100px、2行目が200pxの高さになります。3行目以降のアイテムがある場合、明示的に定義されていない行は auto(コンテンツの高さ)になります。
fr単位(余った空間を比率で分配)
fr(fraction)は、グリッドコンテナの余った空間を比率で分配する単位です。CSS Gridで最も重要な単位と言えます。
fr は % と似ていますが、gap(余白)を自動的に差し引いてから分配してくれる点が異なります。% だと gap の分だけはみ出すことがありますが、fr ならその心配がありません。
ポイント:fr 単位はグリッドレイアウトで最もよく使う単位です。% よりも柔軟で、gap との相性も良いため、迷ったら fr を使いましょう。
repeat() で繰り返しを簡潔に書く
同じ幅の列を何度も書くのは面倒です。repeat() 関数を使えば繰り返しを簡潔に記述できます。
minmax() で最小・最大幅を指定
minmax(min, max) は列や行のサイズに最小値と最大値を設定する関数です。レスポンシブデザインで特に役立ちます。
auto-fill と auto-fit(列数を自動で決める)
repeat() の第1引数に auto-fill または auto-fit を指定すると、コンテナ幅に応じて列数を自動決定できます。メディアクエリなしでレスポンシブなグリッドが作れる強力な機能です。
| キーワード | 動作 | 余った空間 |
|---|---|---|
auto-fill |
入るだけ列を作る(空の列も維持) | 空の列トラックとして残る |
auto-fit |
入るだけ列を作り、空の列を潰す | 既存の列に分配される |
ポイント:実務では auto-fit の方がよく使われます。アイテム数が少ないときに余った空間をアイテムに分配してくれるため、見た目が自然になります。auto-fill は空の列が残るため、特定のグリッド幅を維持したい場合に使います。
行と列のギャップ(gap、row-gap、column-gap)
グリッドアイテム間の余白は gap プロパティで設定します。margin を使う必要がないため、計算が簡単でレイアウトが崩れにくくなります。
かつては grid-gap、grid-row-gap、grid-column-gap という名前でしたが、現在は gap、row-gap、column-gap に統一されています。古い名前でも動作しますが、新しい名前を使いましょう。
gap はアイテム間のみに適用されます。グリッドコンテナの外側(端)には余白が入りません。コンテナの外側に余白が欲しい場合は、コンテナに padding を追加します。
アイテムの配置(grid-column、grid-row、span)
デフォルトではグリッドアイテムは1セルずつ順番に配置されますが、grid-column と grid-row を使うと、特定の位置に配置したり複数セルにまたがらせることができます。
グリッド線(Grid Line)を理解する
CSS Gridでは列と列の境界、行と行の境界に番号が振られた線(グリッド線)があります。3列のグリッドなら、列のグリッド線は左端が1、右端が4です。
grid-column / grid-row で位置を指定
span で「何セル分」と指定する
グリッド線の番号ではなく、何セル分またがるかを span で指定することもできます。こちらの方が直感的です。
ポイント:実務では span を使う方が多いです。「2列分またがる」の方が「グリッド線1から3」よりも意味が伝わりやすく、コードの可読性が上がります。
grid-column と grid-row はショートハンドです。個別に書く場合は以下のプロパティを使います。
| ショートハンド | 個別プロパティ | 説明 |
|---|---|---|
grid-column |
grid-column-start / grid-column-end |
列方向の開始線 / 終了線 |
grid-row |
grid-row-start / grid-row-end |
行方向の開始線 / 終了線 |
grid-template-areas で直感的にレイアウト
grid-template-areas は、グリッドの各セルに名前(エリア名)を付けて、視覚的にレイアウトを定義できるプロパティです。CSSの中でレイアウトの形がそのまま見えるため、非常に直感的です。
基本的な使い方
各アイテムは grid-area プロパティでエリア名を指定して配置します。
CSSの grid-template-areas を見るだけで「ヘッダーは2列にまたがり、サイドバーは左、メインは右、フッターも2列にまたがる」というレイアウトが一目でわかります。
空のセルを作る(ドット記法)
エリア名の代わりにドット(.)を使うと、そのセルを空にできます。
2行目の左端のセルには何も配置されません。レイアウトに空白を作りたいときに便利です。
レスポンシブ対応(メディアクエリとの組み合わせ)
grid-template-areas はメディアクエリと組み合わせることで、画面幅に応じてレイアウトを切り替えることが簡単にできます。
ポイント:grid-template-areas は、レイアウトの全体像を把握しやすく、チーム開発でもコードレビューがしやすいという大きなメリットがあります。ページ全体のレイアウトには積極的に使いましょう。
注意:grid-template-areas で定義するエリアは長方形でなければなりません。L字型やT字型のエリアは定義できません。また、各行の列数は必ず揃える必要があります。
整列(justify / align / place)
CSS Gridにはアイテムの整列を制御するプロパティが複数あります。「コンテナ内でグリッド全体をどこに置くか」と「セル内でアイテムをどこに置くか」の2つのレベルで整列を制御できます。
セル内のアイテム整列(justify-items / align-items)
グリッドセルの中でアイテムをどの位置に配置するかを制御します。
| プロパティ | 方向 | 対象 | デフォルト |
|---|---|---|---|
justify-items |
水平(横) | セル内のアイテム | stretch |
align-items |
垂直(縦) | セル内のアイテム | stretch |
place-items |
両方 | セル内のアイテム | stretch |
justify-content |
水平(横) | グリッド全体 | start |
align-content |
垂直(縦) | グリッド全体 | start |
place-content |
両方 | グリッド全体 | start |
グリッド全体の整列(justify-content / align-content)
グリッドのトラック(列や行)の合計サイズがコンテナより小さい場合に、グリッド全体をコンテナ内のどこに配置するかを制御します。
justify-content と align-content には、start / end / center の他に、space-between(両端揃えで均等配置)、space-around(均等配置+半分の余白)、space-evenly(完全均等配置)も指定できます。Flexboxと同じ感覚で使えます。
個別アイテムの整列(justify-self / align-self)
特定のアイテムだけ、コンテナの設定とは異なる整列にしたい場合は、アイテム側に justify-self / align-self を指定します。
CSS Gridで要素を完全に中央揃えにしたい場合は、place-items: center を使うのが最も簡潔です。たった3行で水平・垂直の中央配置が実現できます。
実務でよく使うレイアウトパターン集
ここからは、CSS Gridを使った実務で頻出するレイアウトパターンを紹介します。コピー&ペーストして、そのままプロジェクトに組み込めるコードです。
パターン1: レスポンシブカードグリッド
最もよく使うパターンです。auto-fit と minmax() を組み合わせることで、メディアクエリなしでカードが画面幅に応じて自動的に折り返されます。
この1行 grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)) だけで、画面幅が広ければ3〜4列、狭ければ1列に自動調整されます。カード型UIの定番パターンです。
パターン2: 聖杯レイアウト(Holy Grail Layout)
「ヘッダー・左サイドバー・メインコンテンツ・右サイドバー・フッター」というWebサイトの定番レイアウトです。CSS Gridなら簡潔に実装できます。
パターン3: ダッシュボード風グリッド
管理画面やダッシュボードでは、異なるサイズのパネルを組み合わせたレイアウトがよく使われます。span を使ってパネルの大きさを変えます。
grid-auto-rows: minmax(150px, auto) を使うことで、明示的に行数を定義しなくても、パネルが追加されるたびに自動的に行が作られます。コンテンツ量に合わせて高さも自動調整されます。
パターン4: 画像ギャラリー
画像ギャラリーでは、異なるサイズの画像を美しく並べるレイアウトが求められます。CSS Gridの span を使えば、特定の画像を目立たせるレイアウトが簡単に作れます。
object-fit: cover を使うと、画像のアスペクト比を保ちながらグリッドセルいっぱいに表示されます。画像が切り取られるのが気になる場合は object-fit: contain に変更してください。
FlexboxとGridの使い分け
FlexboxとCSS Gridは互いに排他的なものではなく、組み合わせて使うのが実務の基本です。ここでは具体的な使い分けの基準を示します。
Gridが適しているケース
| ユースケース | 理由 |
|---|---|
| ページ全体のレイアウト | ヘッダー・サイドバー・メイン・フッターを2次元で配置 |
| カードグリッド | auto-fit + minmax() でレスポンシブに |
| ダッシュボード | 異なるサイズのパネルをspan で配置 |
| 画像ギャラリー | 行と列を同時に制御して美しく配置 |
| フォームレイアウト | ラベルと入力欄を2列で整然と並べる |
Flexboxが適しているケース
| ユースケース | 理由 |
|---|---|
| ナビゲーションバー | 1行に並べて、右端にボタンを配置 |
| ボタン群 | 横並び + 間隔調整 |
| メディアオブジェクト | アイコン + テキストの横並び |
| 中央揃え(簡単なもの) | 1要素の中央配置 |
| コンテンツの順序変更 | order プロパティで並び替え |
組み合わせの例
実務では外側のレイアウトをGrid、内側のコンポーネントをFlexboxで構成するのが一般的です。
ポイント:「行と列の両方を制御したい」→ 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-areas や span を取り入れて、より複雑なレイアウトに挑戦してみてください。
特に repeat(auto-fit, minmax(250px, 1fr)) は、レスポンシブなカードグリッドを作るときの万能パターンです。このパターンだけでも覚えておくと、実務ですぐに役立ちます。