AI先生のロボットキャラクター
第2章 - セクション4

CSS Gridの基本

グリッドコンテナーとアイテム、行と列による二次元レイアウト

男子生徒のアイコン

Flexboxで色々なレイアウトができるようになりました!でも、もっと複雑なグリッド状のレイアウトを作りたいときはどうすればいいんですか?

AI先生のアイコン

そんな時こそ、CSS Gridの出番だよ。Flexboxが一次元のレイアウトに最適なのに対して、CSS Gridは二次元のレイアウト、つまり行と列を同時に制御できる強力な技術なんだ。

女子生徒のアイコン

二次元って、縦と横を同時に考えられるってことですか?

AI先生のアイコン

その通り。例えば、Webサイトのヘッダー、サイドバー、メインコンテンツ、フッターのような複雑なレイアウトも、CSS Gridなら直感的に実装できるんだ。まずは基本から見ていこう。

CSS Gridとは

CSS Grid(グリッドレイアウト)は、Webページを行(row)と列(column)で構成されるグリッド状に分割し、要素を配置するレイアウトシステムです。Flexboxが一次元(一方向)のレイアウトに特化しているのに対し、CSS Gridは二次元(縦横両方向)のレイアウトを直感的に実現できます。

FlexboxとCSS Gridの違い
一次元と二次元のレイアウトシステム
Flexbox
一次元レイアウト
1
2
3
横方向または縦方向の一方向
ナビゲーション、ボタン配置
コンテンツに応じた柔軟な配置
CSS Grid
二次元レイアウト
1
2
3
4
5
6
縦横両方向を同時に制御
ページ全体のレイアウト構造
複雑なグリッドデザイン

CSS Gridの特徴

CSS Gridは、複雑なレイアウトを驚くほどシンプルなコードで実現できる、現代Web開発に欠かせない技術です。

  • 二次元レイアウト 行と列を同時に定義し、要素を自由に配置できる
  • 直感的な設計 グリッドの構造を視覚的にイメージしやすく、コードに落とし込める
  • 柔軟な配置 要素をグリッド内の任意の位置に配置でき、重ねることも可能
  • レスポンシブ対応 メディアクエリと組み合わせて、画面サイズに応じたレイアウト変更が容易
  • 保守性の高さ レイアウト構造が明確で、後からの修正や拡張がしやすい
女子生徒のアイコン

CSS Gridを使うと、どんなレイアウトが作れるんですか?

AI先生のアイコン

例えば、ヘッダー、サイドバー、メインコンテンツ、フッターのような典型的なWebサイトのレイアウトや、画像ギャラリー、カードグリッド、ダッシュボードなど、あらゆる二次元的なデザインを実現できるよ。

CSS Gridの実用例

実際のWebサイトでは、以下のようなレイアウトパターンでCSS Gridが活用されています。

CSS Gridの実用例
典型的なレイアウトパターン
Webサイトレイアウト
Header
Side
Main
Footer
画像ギャラリー
カードグリッド
ダッシュボード
男子生徒のアイコン

すごい!こんなに複雑なレイアウトも、CSS Gridなら作れるんですね。

AI先生のアイコン

そうだね。それでは、CSS Gridの基本的な仕組みから順番に学んでいこう。

グリッドコンテナーとグリッドアイテム

CSS Gridも、Flexboxと同様に親要素(グリッドコンテナー)と子要素(グリッドアイテム)の関係で成り立っています。親要素にdisplay: gridを指定することで、グリッドレイアウトが有効になります。

グリッドコンテナーとアイテムの関係
親子関係でレイアウトを制御
グリッドコンテナー(親要素)
グリッドアイテム
1
グリッドアイテム
2
グリッドアイテム
3
グリッドアイテム
4
グリッドアイテム
5
グリッドアイテム
6
親要素display: grid を指定
子要素が自動的にグリッドアイテムになる
グリッドコンテナーでレイアウト構造を定義

基本的なHTML構造

CSS Gridを使用する場合の基本的なHTML構造は以下の通りです。

<div class="grid-container">
    <div class="grid-item">アイテム1</div>
    <div class="grid-item">アイテム2</div>
    <div class="grid-item">アイテム3</div>
    <div class="grid-item">アイテム4</div>
    <div class="grid-item">アイテム5</div>
    <div class="grid-item">アイテム6</div>
</div>

グリッドコンテナーの有効化

親要素にdisplay: gridを指定するだけで、CSS Gridが有効になります。

.grid-container {
    display: grid;
}

ただし、これだけでは列数や行数が定義されていないため、すべてのアイテムが縦に並びます。実際のグリッドレイアウトを作るには、行と列の定義が必要です。

実際に試してみよう

以下のコードエディタで、display: gridを指定して、グリッドコンテナーがどのように機能するか確認してみてください。

CSSコード:
プレビュー:
display: gridとdisplay: inline-grid

CSS Gridには2つの表示方法があります。

  • display: grid グリッドコンテナーがブロックレベル要素として動作(横幅いっぱいに広がる)
  • display: inline-grid グリッドコンテナーがインライン要素として動作(コンテンツ幅に収まる)

ほとんどの場合、display: gridを使用します。

女子生徒のアイコン

display: gridを指定するだけで、子要素が自動的にグリッドアイテムになるんですね。

AI先生のアイコン

その通り。ただし、レイアウトを制御するには行と列の定義が必要だよ。次はそれを見ていこう。

グリッドトラック(行と列の定義)

グリッドトラックとは、グリッドの行(row)または列(column)のことを指します。grid-template-columnsgrid-template-rowsプロパティで、グリッドの列数・行数とそれぞれのサイズを定義します。

グリッドトラックの構造
行と列でグリッドを構成
列トラック1
列トラック2
列トラック3
行トラック1
行トラック2
1
2
3
4
5
6
列トラック(Column Track) 縦方向の列を定義
行トラック(Row Track) 横方向の行を定義

grid-template-columns(列の定義)

grid-template-columnsは、グリッドの列数とそれぞれの幅を指定します。

基本的な指定方法

  • 固定値(px) grid-template-columns: 200px 300px 200px; - 3列、それぞれ200px、300px、200pxの幅を指定。画面サイズに関係なく固定サイズで表示される
  • 比率(fr) grid-template-columns: 1fr 2fr 1fr; - 3列、1:2:1の比率で分配。
    利用可能な空間を比率に応じて自動分配
  • パーセント grid-template-columns: 25% 50% 25%; - 3列、コンテナー幅に対するパーセント指定。レスポンシブ対応に便利
  • repeat()関数 grid-template-columns: repeat(3, 1fr); - 3列、均等幅(1fr)。
    同じパターンを繰り返す簡潔な記法。第1引数に繰り返し回数、第2引数にサイズパターンを指定。
  • 混合指定 grid-template-columns: 200px 1fr 200px; - 3列、固定幅と可変幅を組み合わせて指定。
    両端を固定し、中央を伸縮させるなど柔軟なレイアウトを実現
/* 3列のグリッド、各列は均等幅 */
.grid-container {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
}

/* repeat()を使った簡潔な書き方 */
.grid-container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
}

/* 固定幅とフレキシブル幅の組み合わせ */
.grid-container {
    display: grid;
    grid-template-columns: 200px 1fr 300px;
}
男子生徒のアイコン

待って、例えば6個のアイテムがある場合、grid-template-columns: repeat(3, 1fr);のように3列のグリッドを指定すると、どう配置されるんですか?

AI先生のアイコン

大事なポイントだね。3列を指定すると、4個目以降のアイテムは自動的に次の行に配置されるんだ。つまり6個のアイテムは自動的に2行×3列のグリッドになる。

女子生徒のアイコン

行数を指定しなくても、自動で作ってくれるんですね!

AI先生のアイコン

そういうこと。これを「暗黙的なグリッド」と呼ぶよ。grid-template-columnsだけ指定すれば、必要な行は自動生成される。

実際に試してみよう

以下のコードエディタで、grid-template-columnsの値を変更して、列の幅がどのように変わるか試してみてください。

CSSコード:
プレビュー:
frユニットとは

fr(fraction)は、利用可能な空間を比率で分配する単位です。


例えば、1fr 2fr 1frの場合、利用可能な空間を4つに分割し、最初の列に1/4、2番目の列に2/4(半分)、3番目の列に1/4を割り当てます。


固定幅(200px など)がある場合は、それを引いた残りの空間をfrで分配します。

grid-template-rows(行の定義)

grid-template-rowsは、グリッドの各行の高さを指定するプロパティです。

女子生徒のアイコン

6個のアイテムに3列を指定したら2行になりましたよね。この「2行」って、どうやって決まってるんですか?

AI先生のアイコン

前回も触れたけど、それはアイテムの総数÷列数で自動的に決まるんだ。6個÷3列=2行ということだね。

男子生徒のアイコン

じゃあ、grid-template-rowsは何のためにあるんですか?

AI先生のアイコン

grid-template-rows行数を決めるものではなく、各行の高さを指定するためのプロパティなんだ。行数は列数とアイテム数で自動的に決まるけど、それぞれの行をどのくらいの高さにするかは自分で決められる。

/* 3列を指定→6個のアイテムは自動的に2行になる */
.grid-container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    /* 行数は指定していないが、6個÷3列=2行になる */
}

/* 2行の高さを指定する */
.grid-container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-template-rows: 100px 150px;  /* 1行目100px、2行目150px */
}

/* 行の高さを統一する場合 */
.grid-container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-template-rows: repeat(2, 150px);  /* 両方とも150px */
}

実際に試してみよう

grid-template-rowsを追加して、行の高さを制御してみてください。

CSSコード:
プレビュー:
男子生徒のアイコン

frって便利ですね!比率で指定できるから、レスポンシブ対応も簡単そうです。

AI先生のアイコン

そうだね。frを使えば、画面サイズに応じて自動的に調整されるから、柔軟なレイアウトが作れるよ。

repeat()関数の活用

repeat()関数を使うと、同じパターンを繰り返す記述を簡潔にできます。

/* 通常の書き方 */
grid-template-columns: 1fr 1fr 1fr 1fr;

/* repeat()を使った書き方 */
grid-template-columns: repeat(4, 1fr);

/* 複雑なパターンも繰り返せる */
grid-template-columns: repeat(3, 100px 200px);
/* 結果: 100px 200px 100px 200px 100px 200px */

minmax()関数

minmax()関数は、グリッドトラックの最小値と最大値を指定できる関数です。レスポンシブデザインで、一定の範囲内でサイズを柔軟に調整したい場合に活用します。

/* 最小200px、最大1frで伸縮 */
grid-template-columns: minmax(200px, 1fr);

/* 最小100px、最大300pxの範囲で調整 */
grid-template-columns: repeat(3, minmax(100px, 300px));

/* 最小は内容に応じて、最大は均等幅 */
grid-template-columns: minmax(auto, 1fr);

第1引数が最小値、第2引数が最大値を表します。利用可能な空間に応じて、この範囲内でトラックのサイズが自動調整されます。

auto-fillとauto-fit

repeat()関数と組み合わせて、auto-fillauto-fitを使うと、利用可能な空間に応じて自動的に列数を調整できます。minmax()と組み合わせることで、画面幅に応じた完全レスポンシブなグリッドが実現できます。

auto-fitとauto-fillの違い
  • auto-fill 可能な限り多くのトラックを作成し、空のトラックも保持する
  • auto-fit アイテムに応じてトラックを作成し、空のトラックは折りたたまれる

レスポンシブデザインでは、通常auto-fitを使用します。

/* 最小200px、最大1frの列を自動的に配置 */
.grid-container {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 1rem;
}

この指定により、画面幅に応じて列数が自動的に変化するレスポンシブなグリッドレイアウトが実現できます。

CSSコード:
プレビュー:

グリッドラインとグリッドセル

CSS Gridの構造を理解するために、重要な用語を押さえておきましょう。

グリッドの構造要素
ライン、セル、エリアの関係
1
2
3
4
1
2
3
4
セル
エリア
グリッドライン
グリッドライン
グリッドを区切る線。番号で指定して要素を配置する基準になる
グリッドセル
1つの行と1つの列で囲まれた最小単位の領域
グリッドエリア
複数のセルをまとめた領域。要素を配置する単位

グリッドライン

グリッドラインは、グリッドを区切る線のことです。行と列のそれぞれにライン番号が振られています。

  • 列ライン(垂直) 左から順に1, 2, 3…と番号が振られる
  • 行ライン(水平) 上から順に1, 2, 3…と番号が振られる
  • 負の番号 右端・下端から-1, -2, -3…と逆順でも指定可能

グリッドラインの番号を使うことで、アイテムを任意の位置に配置したり、複数のセルにまたがって配置したりできます。

女子生徒のアイコン

グリッドラインの番号って、どういうときに使うんですか?

AI先生のアイコン

例えば、ヘッダーをページ全体の幅に広げたいときなどに使うよ。後で詳しく見ていくね。

グリッドセル

グリッドセルは、1つの行と1つの列で囲まれた最小単位の領域です。表計算ソフトのセルと同じようなイメージです。

通常、グリッドアイテムは自動的に1つのセルに配置されますが、複数のセルにまたがって配置することもできます。

グリッドエリア

グリッドエリアは、複数のグリッドセルをまとめた領域です。グリッドラインで囲まれた任意の矩形領域を指します。

1つのセルだけのエリアも、複数のセルをまたぐエリアも、どちらもグリッドエリアと呼ばれます。

グリッドギャップ(隙間の調整)

グリッドアイテム間の隙間を調整するには、gapプロパティ(旧名: grid-gap)を使用します。Flexboxのgapと同じように、アイテム間の余白を簡潔に指定できます。

gapプロパティの使い方

  • gap 行と列の両方の隙間を一度に指定
  • row-gap 行間の隙間のみ指定
  • column-gap 列間の隙間のみ指定
/* 行と列の両方に同じ隙間を設定 */
.grid-container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 1rem;
}

/* 行と列で異なる隙間を設定 */
.grid-container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 2rem 1rem; /* 行 列 の順 */
}

/* 行と列を個別に指定 */
.grid-container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    row-gap: 2rem;
    column-gap: 1rem;
}

実際に試してみよう

以下のコードエディタで、gapの値を変更して、アイテム間の隙間がどのように変わるか試してみてください。

CSSコード:
プレビュー:
gapとmarginの違い

gapはアイテム間にのみ余白を作り、コンテナーの端には余白を作りません。これに対して、marginはすべての方向に余白を作ります。


グリッドレイアウトでは、アイテム間の隙間にはgapを、コンテナーの外側の余白にはpaddingを使うのが一般的です。

男子生徒のアイコン

gapを使えば、簡単にアイテム間の隙間を調整できるんですね。Flexboxと同じで便利です。

AI先生のアイコン

そうだね。gapはFlexboxとGridの両方で使える共通のプロパティだから、覚えやすいよ。

グリッドアイテムの配置

ここまでは、グリッドアイテムが自動的に配置される方法を見てきました。しかし、CSS Gridの真価は、アイテムを任意の位置に配置できることにあります。

自動配置

デフォルトでは、グリッドアイテムは左上から順番に、行優先で自動的に配置されます。

自動配置の流れ
左上から右下へ順番に配置
1
2
3
4
5
6

grid-auto-flow(配置方向の制御)

grid-auto-flowプロパティで、アイテムの自動配置方向を変更できます。

  • row 行優先で配置(デフォルト)- 左から右、上から下
  • column 列優先で配置 - 上から下、左から右
  • dense 空いたスペースを効率的に埋める(後で詳しく説明)
/* 列優先で配置 */
.grid-container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-template-rows: repeat(2, 100px);
    grid-auto-flow: column;
}

実際に試してみよう

grid-auto-flowの値をrowからcolumnに変更して、配置方向がどのように変わるか確認してみてください。

CSSコード:
プレビュー:

アイテムの明示的な配置

グリッドラインを使って、アイテムを任意の位置に配置することもできます。これは次回のレッスンで詳しく学びますが、基本的な考え方を紹介します。

/* アイテムを特定の位置に配置 */
.item-1 {
    grid-column: 1 / 3; /* 列ライン1から3まで(2列分) */
    grid-row: 1 / 2;    /* 行ライン1から2まで(1行分) */
}

このように、グリッドラインの番号を指定することで、アイテムを複数のセルにまたがって配置したり、特定の位置に配置したりできます。

女子生徒のアイコン

グリッドラインの番号を使えば、ヘッダーを横幅いっぱいに広げることもできるんですね!

AI先生のアイコン

その通り。次回のレッスンでは、この配置方法を詳しく学んで、実用的なレイアウトを作っていくよ。

理解度チェッククイズ

AI先生のアイコン

それじゃあ、今日学んだCSS Gridの基礎を確認してみよう。6問のクイズに挑戦してみてね!

CSS Grid基礎ミニクイズ

CSS Gridを有効にするために、親要素に設定する必要があるプロパティはどれですか?
display: flex;
display: grid;
grid-container: true;
layout: grid;
8個のアイテムがある場合、次のコードで作成されるグリッドの構造はどれですか?
.grid-container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
}
4列×1行
4列×2行
2列×4行
8列×1行
`fr`ユニットの説明として正しいものはどれですか?
固定サイズを指定する単位(固定レスポンシブの略)
利用可能な空間を比率で分配する単位(fractionの略)
フォントサイズの相対単位(font-relativeの略)
フレックスアイテムの伸縮率を指定する単位
次のコードで、各行の高さはどうなりますか?
.grid-container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: 100px 150px;
}
/* 6個のアイテムがある場合 */
すべての行が100px
すべての行が150px
1行目が100px、2行目が150px
1行目が150px、2行目が100px
グリッドアイテム間の隙間を設定するプロパティはどれですか?
.grid-container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  ①: 1rem;
}
margin
padding
gap
space
`grid-auto-flow`プロパティの説明として正しいものはどれですか?
グリッドの列数を自動的に決定する
グリッドアイテムの自動配置方向を制御する
グリッドの高さを自動調整する
グリッドラインを自動的に生成する

まとめ

男子生徒のアイコン

CSS Gridって、行と列を同時に制御できるから、複雑なレイアウトも作りやすそうですね。

女子生徒のアイコン

grid-template-columnsgrid-template-rowsで構造を定義して、gapで隙間を調整すれば、基本的なグリッドが作れました!

AI先生のアイコン

いいね。今日学んだのは基礎の部分だけど、これがCSS Gridの土台になるよ。次は、アイテムを自由に配置する方法や、実用的なレイアウトパターンを学んでいこう。

CSS Grid基礎のまとめ
  • CSS Grid 二次元レイアウトシステムで行と列を同時に制御
  • display: grid 親要素に指定してグリッドコンテナーを作成
  • grid-template-columns 列数と各列の幅を定義(1fr、px、%など)
  • grid-template-rows 行数と各行の高さを定義
  • repeat()関数 同じパターンを繰り返す記述を簡潔に
  • auto-fit/auto-fill レスポンシブなグリッドレイアウトを実現
  • グリッドライン グリッドを区切る線で番号が振られている
  • グリッドセル 1つの行と列で囲まれた最小単位
  • gap アイテム間の隙間を調整(row-gap、column-gap)
  • grid-auto-flow アイテムの自動配置方向を制御

次回は、グリッドラインを使ったアイテムの配置方法と、実用的なレイアウトパターンを学びます。

学習チェック

このレッスンを理解できたら「完了」をクリックしてください。
後で見直したい場合は「未完了に戻す」で進捗をリセットできます。

レッスン完了!🎉

お疲れさまでした!