この記事で学べること
- CSS Gridの基本概念と用語(グリッドコンテナ、グリッドアイテム、トラック、セル、ライン)
- グリッドを定義するための主要プロパティ(grid-template-columns、grid-template-rows)
- アイテムの配置方法(grid-column、grid-row、grid-area)
- 便利な関数(repeat、minmax、auto-fill、auto-fit)
- 実践的なレイアウトパターンの実装
- FlexboxとGridの適切な使い分け
概要
CSS Grid(グリッドレイアウト)は、Webページのレイアウトを2次元(行と列)で構築するためのCSSモジュールです。従来のfloatやFlexboxでは難しかった複雑なレイアウトを、より直感的かつ効率的に実現できます。
CSS Gridを使用することで、以下のようなメリットがあります。
- 2次元レイアウト: 行と列の両方を同時に制御できる
- 宣言的なコード: どのような見た目にするかを明確に記述できる
- レスポンシブ対応: メディアクエリなしでも柔軟なレイアウトが可能
- コード量の削減: 従来の方法より少ないCSSで複雑なレイアウトを実現
CSS Gridの基本用語
Gridを理解するためには、まず基本的な用語を押さえておく必要があります。
グリッドコンテナとグリッドアイテム
<!-- グリッドコンテナ: display: gridを指定した親要素 -->
<div class="grid-container">
<!-- グリッドアイテム: コンテナの直接の子要素 -->
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
</div>
/* グリッドコンテナの基本設定 */
.grid-container {
display: grid; /* これでグリッドコンテナになる */
}
グリッドの構成要素
| 用語 | 説明 |
|---|---|
| グリッドライン | グリッドを構成する水平・垂直の線。番号または名前で参照できる |
| グリッドトラック | 2本の隣接するグリッドラインの間のスペース(行または列) |
| グリッドセル | 4本のグリッドラインで囲まれた最小単位 |
| グリッドエリア | 1つ以上のグリッドセルで構成される長方形の領域 |
グリッドの定義
grid-template-columnsとgrid-template-rows
グリッドの列と行のサイズを定義する基本プロパティです。
.container {
display: grid;
/* 3列のグリッド: 各列100pxの固定幅 */
grid-template-columns: 100px 100px 100px;
/* 2行のグリッド: 各行50pxの固定高さ */
grid-template-rows: 50px 50px;
}
さまざまなサイズ指定方法
/* 固定値(px) */
grid-template-columns: 200px 300px 100px;
/* パーセンテージ(%) */
grid-template-columns: 25% 50% 25%;
/* fr単位(fraction: 残りスペースの分割) */
grid-template-columns: 1fr 2fr 1fr; /* 1:2:1の比率 */
/* 組み合わせ */
grid-template-columns: 200px 1fr 200px; /* 両端固定、中央は可変 */
/* auto(コンテンツに合わせる) */
grid-template-columns: auto 1fr auto;
fr単位の詳細
fr単位(fraction)は、利用可能なスペースを割合で分割する単位です。固定サイズの要素を除いた残りのスペースを分配します。
.container {
display: grid;
width: 800px;
/* 200px固定 + 残り600pxを1:2で分割(200px, 400px) */
grid-template-columns: 200px 1fr 2fr;
}
repeat()関数
同じサイズのトラックを繰り返し定義する場合、repeat()関数が便利です。
/* Before: 冗長な記述 */
grid-template-columns: 1fr 1fr 1fr 1fr;
/* After: repeat()を使用 */
grid-template-columns: repeat(4, 1fr); /* 4列、各1fr */
repeat()のパターン
/* 単純な繰り返し */
grid-template-columns: repeat(3, 100px); /* 100px 100px 100px */
/* パターンの繰り返し */
grid-template-columns: repeat(2, 1fr 2fr); /* 1fr 2fr 1fr 2fr */
/* 他の値との組み合わせ */
grid-template-columns: 200px repeat(3, 1fr) 200px;
minmax()関数
トラックの最小値と最大値を指定できる関数です。レスポンシブデザインに非常に便利です。
.container {
display: grid;
/* 各列は最小200px、最大1frまで広がる */
grid-template-columns: repeat(3, minmax(200px, 1fr));
}
minmax()の使用例
/* 最小100px、最大auto(コンテンツに応じて拡大) */
grid-template-columns: minmax(100px, auto) 1fr;
/* 最小0、最大200px(200pxを超えない) */
grid-template-columns: 1fr minmax(0, 200px);
/* サイドバー + メインコンテンツのレイアウト */
grid-template-columns: minmax(200px, 300px) 1fr;
auto-fillとauto-fit
コンテナの幅に応じて自動的に列数を調整する、レスポンシブグリッドの要となる機能です。
auto-fill
コンテナに収まる限り、トラックを繰り返し生成します。空のトラックも維持されます。
.container {
display: grid;
/* 最小200pxの列をコンテナに収まる限り生成 */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
auto-fit
auto-fillと似ていますが、空のトラックは折りたたまれ、アイテムがスペースを埋めます。
.container {
display: grid;
/* アイテムがスペースを埋める */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
auto-fillとauto-fitの違い
<div class="grid-auto-fill">
<div>1</div>
<div>2</div>
</div>
<div class="grid-auto-fit">
<div>1</div>
<div>2</div>
</div>
.grid-auto-fill {
display: grid;
/* 空のトラックが残る(アイテムは左寄せ) */
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
}
.grid-auto-fit {
display: grid;
/* 空のトラックが折りたたまれる(アイテムが広がる) */
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
}
アイテムの配置
grid-columnとgrid-row
グリッドアイテムをどのラインからどのラインまで配置するかを指定します。
.item {
/* 列ライン1から3まで(2列分) */
grid-column: 1 / 3;
/* 行ライン1から2まで(1行分) */
grid-row: 1 / 2;
}
配置の省略記法
/* 開始ライン / 終了ライン */
grid-column: 1 / 3;
/* spanを使用(何トラック分かを指定) */
grid-column: 1 / span 2; /* ライン1から2トラック分 */
grid-column: span 2; /* 現在位置から2トラック分 */
/* 終了ラインのみ指定(1トラックを暗黙指定) */
grid-column: 2; /* ライン2から1トラック分 */
/* 負の値(最後から数える) */
grid-column: 1 / -1; /* 最初から最後まで */
grid-area
grid-row-start、grid-column-start、grid-row-end、grid-column-endを一括指定します。
.item {
/* 行開始 / 列開始 / 行終了 / 列終了 */
grid-area: 1 / 1 / 3 / 4;
}
名前付きグリッドライン
ラインに名前を付けると、配置がより直感的になります。
.container {
display: grid;
grid-template-columns:
[sidebar-start] 200px
[sidebar-end main-start] 1fr
[main-end];
grid-template-rows:
[header-start] 80px
[header-end content-start] 1fr
[content-end footer-start] 60px
[footer-end];
}
.header {
grid-column: sidebar-start / main-end;
grid-row: header-start / header-end;
}
.sidebar {
grid-column: sidebar-start / sidebar-end;
grid-row: content-start / content-end;
}
.main {
grid-column: main-start / main-end;
grid-row: content-start / content-end;
}
grid-template-areas
視覚的にレイアウトを定義できる強力なプロパティです。
.container {
display: grid;
grid-template-columns: 200px 1fr 200px;
grid-template-rows: 80px 1fr 60px;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }
grid-template-areasのルール
/* 空のセルはピリオド(.)で表す */
grid-template-areas:
"header header header"
"sidebar main ."
"footer footer footer";
/* 各エリアは長方形でなければならない */
/* NG: L字型やT字型は不可 */
gapプロパティ
グリッドアイテム間の間隔を設定します。
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
/* 行と列の間隔を同時に指定 */
gap: 20px;
/* 行と列を別々に指定 */
gap: 20px 30px; /* 行間 列間 */
/* 個別プロパティ */
row-gap: 20px;
column-gap: 30px;
}
アイテムの整列
justify-items / align-items
グリッドセル内でのアイテムの配置を制御します。
.container {
display: grid;
grid-template-columns: repeat(3, 200px);
grid-template-rows: repeat(2, 150px);
/* 水平方向(インライン軸)の配置 */
justify-items: start; /* 左寄せ */
justify-items: end; /* 右寄せ */
justify-items: center; /* 中央 */
justify-items: stretch; /* 伸張(デフォルト) */
/* 垂直方向(ブロック軸)の配置 */
align-items: start; /* 上寄せ */
align-items: end; /* 下寄せ */
align-items: center; /* 中央 */
align-items: stretch; /* 伸張(デフォルト) */
}
place-items(省略記法)
.container {
/* align-items justify-items の順 */
place-items: center center;
place-items: center; /* 両方とも center */
}
justify-content / align-content
グリッド全体をコンテナ内でどう配置するかを制御します。
.container {
display: grid;
width: 800px;
height: 600px;
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(2, 100px);
/* 水平方向のグリッド配置 */
justify-content: start; /* 左寄せ */
justify-content: end; /* 右寄せ */
justify-content: center; /* 中央 */
justify-content: space-between; /* 両端揃え */
justify-content: space-around; /* 均等配置 */
justify-content: space-evenly; /* 完全均等 */
/* 垂直方向のグリッド配置 */
align-content: start;
align-content: end;
align-content: center;
align-content: space-between;
align-content: space-around;
align-content: space-evenly;
}
justify-self / align-self
個別のアイテムの配置を上書きします。
.special-item {
justify-self: center; /* このアイテムだけ水平中央 */
align-self: end; /* このアイテムだけ下寄せ */
}
暗黙的グリッド
定義したグリッドに収まらないアイテムは、自動的に新しいトラックが作成されます。
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: 100px 100px;
/* 暗黙的に作成される行のサイズ */
grid-auto-rows: 150px;
/* 暗黙的に作成される列のサイズ */
grid-auto-columns: 100px;
}
grid-auto-flow
アイテムの自動配置アルゴリズムを制御します。
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
/* row: 行方向に配置(デフォルト) */
grid-auto-flow: row;
/* column: 列方向に配置 */
grid-auto-flow: column;
/* dense: 空きスペースを埋める */
grid-auto-flow: row dense;
}
実践的なレイアウトパターン
基本的な12カラムグリッド
.grid-12 {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 20px;
}
.col-4 { grid-column: span 4; } /* 4カラム分 */
.col-6 { grid-column: span 6; } /* 6カラム分 */
.col-8 { grid-column: span 8; } /* 8カラム分 */
.col-12 { grid-column: span 12; } /* 全幅 */
Holy Grailレイアウト
ヘッダー、フッター、サイドバー2つ、メインコンテンツの古典的なレイアウトです。
.holy-grail {
display: grid;
min-height: 100vh;
grid-template-columns: 200px 1fr 200px;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header header"
"nav main aside"
"footer footer footer";
}
.header { grid-area: header; background: #333; color: white; padding: 1rem; }
.nav { grid-area: nav; background: #f0f0f0; padding: 1rem; }
.main { grid-area: main; padding: 1rem; }
.aside { grid-area: aside; background: #f0f0f0; padding: 1rem; }
.footer { grid-area: footer; background: #333; color: white; padding: 1rem; }
<div class="holy-grail">
<header class="header">Header</header>
<nav class="nav">Navigation</nav>
<main class="main">Main Content</main>
<aside class="aside">Sidebar</aside>
<footer class="footer">Footer</footer>
</div>
レスポンシブカードグリッド
メディアクエリなしで自動的にカラム数が調整されるカードグリッドです。
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 24px;
padding: 24px;
}
.card {
background: white;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
padding: 20px;
}
<div class="card-grid">
<div class="card">Card 1</div>
<div class="card">Card 2</div>
<div class="card">Card 3</div>
<div class="card">Card 4</div>
<div class="card">Card 5</div>
<div class="card">Card 6</div>
</div>
画像ギャラリー(Masonryライク)
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
grid-auto-rows: 10px;
gap: 10px;
}
.gallery-item {
border-radius: 8px;
overflow: hidden;
}
/* アイテムごとにスパンを調整 */
.gallery-item.tall { grid-row: span 20; }
.gallery-item.medium { grid-row: span 15; }
.gallery-item.short { grid-row: span 10; }
.gallery-item img {
width: 100%;
height: 100%;
object-fit: cover;
}
ダッシュボードレイアウト
.dashboard {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: 60px 1fr;
grid-template-areas:
"sidebar header"
"sidebar main";
min-height: 100vh;
}
.dashboard-header {
grid-area: header;
background: white;
border-bottom: 1px solid #e0e0e0;
display: flex;
align-items: center;
padding: 0 24px;
}
.dashboard-sidebar {
grid-area: sidebar;
background: #1a1a2e;
color: white;
padding: 20px;
}
.dashboard-main {
grid-area: main;
padding: 24px;
background: #f5f5f5;
/* メインエリア内のグリッド */
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 24px;
align-content: start;
}
.widget {
background: white;
border-radius: 8px;
padding: 20px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.widget.large {
grid-column: span 2;
}
FlexboxとGridの使い分け
Gridが適している場面
- ページ全体のレイアウト
- 2次元のレイアウト(行と列の両方を制御)
- 複雑で規則的なグリッド構造
- 要素のサイズを親から制御したい場合
Flexboxが適している場面
- 1次元のレイアウト(行または列の一方向)
- コンポーネント内の小さなレイアウト
- コンテンツのサイズに基づいた配置
- アイテムの順序変更や等間隔配置
組み合わせて使う例
/* ページ全体: Grid */
.page {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
}
/* ヘッダー内のナビゲーション: Flexbox */
.header {
grid-area: header;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20px;
}
/* カードグリッド: Grid */
.main {
grid-area: main;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
padding: 20px;
}
/* カード内のレイアウト: Flexbox */
.card {
display: flex;
flex-direction: column;
}
.card-footer {
display: flex;
justify-content: space-between;
margin-top: auto;
}
ブラウザサポートと注意点
ブラウザサポート
2024年現在、CSS Gridは以下のブラウザでサポートされています。
| ブラウザ | サポートバージョン |
|---|---|
| Chrome | 57以降 |
| Firefox | 52以降 |
| Safari | 10.1以降 |
| Edge | 16以降 |
| Opera | 44以降 |
注意点
- サブグリッド(subgrid): 比較的新しい機能のため、ブラウザサポートを確認してください
- IE11: CSS Gridは部分的にしかサポートされていません(-ms-プレフィックスが必要)
- フォールバック: 古いブラウザ向けにはFlexboxやfloatでのフォールバックを検討してください
/* フォールバックの例 */
.container {
display: flex;
flex-wrap: wrap;
}
@supports (display: grid) {
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
}
まとめ
CSS Gridは、Webページのレイアウトを構築するための強力で直感的なツールです。本記事で学んだポイントを振り返りましょう。
主要プロパティの一覧
| プロパティ | 説明 |
|---|---|
display: grid | グリッドコンテナを作成 |
grid-template-columns | 列のサイズと数を定義 |
grid-template-rows | 行のサイズと数を定義 |
grid-template-areas | 名前付きエリアでレイアウト定義 |
gap | アイテム間の間隔 |
grid-column | アイテムの列方向の配置 |
grid-row | アイテムの行方向の配置 |
grid-area | アイテムのエリア配置 |
justify-items / align-items | セル内でのアイテム配置 |
justify-content / align-content | グリッド全体の配置 |
便利な関数と値
| 関数/値 | 説明 |
|---|---|
fr | 残りスペースの分割単位 |
repeat() | トラックの繰り返し定義 |
minmax() | 最小・最大サイズの指定 |
auto-fill | コンテナに収まる限りトラックを生成 |
auto-fit | 空のトラックを折りたたむ |
CSS Gridをマスターすることで、複雑なレイアウトも少ないコードで実現でき、保守性の高いCSSを書くことができます。実際のプロジェクトで積極的に活用してみてください。