CSS Gridとは
CSS Grid(グリッドレイアウト)は、Webページを行(row)と列(column)で構成されるグリッド状に分割し、要素を配置するレイアウトシステムです。Flexboxが一次元(一方向)のレイアウトに特化しているのに対し、CSS Gridは二次元(縦横両方向)のレイアウトを直感的に実現できます。
CSS Gridの特徴
CSS Gridは、複雑なレイアウトを驚くほどシンプルなコードで実現できる、現代Web開発に欠かせない技術です。
- 二次元レイアウト 行と列を同時に定義し、要素を自由に配置できる
- 直感的な設計 グリッドの構造を視覚的にイメージしやすく、コードに落とし込める
- 柔軟な配置 要素をグリッド内の任意の位置に配置でき、重ねることも可能
- レスポンシブ対応 メディアクエリと組み合わせて、画面サイズに応じたレイアウト変更が容易
- 保守性の高さ レイアウト構造が明確で、後からの修正や拡張がしやすい
CSS Gridの実用例
実際のWebサイトでは、以下のようなレイアウトパターンでCSS Gridが活用されています。
グリッドコンテナーとグリッドアイテム
CSS Gridも、Flexboxと同様に親要素(グリッドコンテナー)と子要素(グリッドアイテム)の関係で成り立っています。親要素にdisplay: gridを指定することで、グリッドレイアウトが有効になります。
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 Gridには2つの表示方法があります。
- display: grid グリッドコンテナーがブロックレベル要素として動作(横幅いっぱいに広がる)
- display: inline-grid グリッドコンテナーがインライン要素として動作(コンテンツ幅に収まる)
ほとんどの場合、display: gridを使用します。
グリッドトラック(行と列の定義)
グリッドトラックとは、グリッドの行(row)または列(column)のことを指します。grid-template-columnsとgrid-template-rowsプロパティで、グリッドの列数・行数とそれぞれのサイズを定義します。
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;
} 実際に試してみよう
以下のコードエディタで、grid-template-columnsの値を変更して、列の幅がどのように変わるか試してみてください。
fr(fraction)は、利用可能な空間を比率で分配する単位です。
例えば、1fr 2fr 1frの場合、利用可能な空間を4つに分割し、最初の列に1/4、2番目の列に2/4(半分)、3番目の列に1/4を割り当てます。
固定幅(200px など)がある場合は、それを引いた残りの空間をfrで分配します。
grid-template-rows(行の定義)
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を追加して、行の高さを制御してみてください。
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-fillやauto-fitを使うと、利用可能な空間に応じて自動的に列数を調整できます。minmax()と組み合わせることで、画面幅に応じた完全レスポンシブなグリッドが実現できます。
- auto-fill 可能な限り多くのトラックを作成し、空のトラックも保持する
- auto-fit アイテムに応じてトラックを作成し、空のトラックは折りたたまれる
レスポンシブデザインでは、通常auto-fitを使用します。
/* 最小200px、最大1frの列を自動的に配置 */
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
} この指定により、画面幅に応じて列数が自動的に変化するレスポンシブなグリッドレイアウトが実現できます。
グリッドラインとグリッドセル
CSS Gridの構造を理解するために、重要な用語を押さえておきましょう。
グリッドライン
グリッドラインは、グリッドを区切る線のことです。行と列のそれぞれにライン番号が振られています。
- 列ライン(垂直) 左から順に1, 2, 3…と番号が振られる
- 行ライン(水平) 上から順に1, 2, 3…と番号が振られる
- 負の番号 右端・下端から-1, -2, -3…と逆順でも指定可能
グリッドラインの番号を使うことで、アイテムを任意の位置に配置したり、複数のセルにまたがって配置したりできます。
グリッドセル
グリッドセルは、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の値を変更して、アイテム間の隙間がどのように変わるか試してみてください。
gapはアイテム間にのみ余白を作り、コンテナーの端には余白を作りません。これに対して、marginはすべての方向に余白を作ります。
グリッドレイアウトでは、アイテム間の隙間にはgapを、コンテナーの外側の余白にはpaddingを使うのが一般的です。
グリッドアイテムの配置
ここまでは、グリッドアイテムが自動的に配置される方法を見てきました。しかし、CSS Gridの真価は、アイテムを任意の位置に配置できることにあります。
自動配置
デフォルトでは、グリッドアイテムは左上から順番に、行優先で自動的に配置されます。
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に変更して、配置方向がどのように変わるか確認してみてください。
アイテムの明示的な配置
グリッドラインを使って、アイテムを任意の位置に配置することもできます。これは次回のレッスンで詳しく学びますが、基本的な考え方を紹介します。
/* アイテムを特定の位置に配置 */
.item-1 {
grid-column: 1 / 3; /* 列ライン1から3まで(2列分) */
grid-row: 1 / 2; /* 行ライン1から2まで(1行分) */
} このように、グリッドラインの番号を指定することで、アイテムを複数のセルにまたがって配置したり、特定の位置に配置したりできます。
理解度チェッククイズ
CSS Grid基礎ミニクイズ
.grid-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
} .grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: 100px 150px;
}
/* 6個のアイテムがある場合 */ .grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
①: 1rem;
} まとめ
- 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 アイテムの自動配置方向を制御
次回は、グリッドラインを使ったアイテムの配置方法と、実用的なレイアウトパターンを学びます。