Bootstrap: グリッドシステム
最終更新:2026-08-26
1. はじめに
(1) 前提条件
- 6つのブレイクポイントシステム(xs/sm/md/lg/xl/xxl)を理解していること
- レスポンシブ表示ユーティリティクラス
d-{breakpoint}-*に精通していること
(2) 🎯 学習目標
- 12カラムグリッドシステムの3層構造(Container > Row > Column)を理解する
- レスポンシブなカラムの使い方(
col-12 col-md-6 col-lg-4)をマスターする offset-*を使ったカラムオフセットの使用方法を学ぶ- グリッドのネストとガター制御をマスターする
- 独立して完全なページレイアウトを構築できるようになる
(3) 課題
Aliceは前回のレッスンでFlexboxを使ってナビバーを作成しました。今度は、彼女のホームページのメインコンテンツのレイアウトを作成したいと考えています。それは、左サイドバー(3カラム)+ 右コンテンツエリア(9カラム)です。従来のCSSレイアウトで、複雑なレスポンシブなマルチカラム構造を実装するのは非常に面倒です。
(4) 解決策
Bootstrapのグリッドシステムを使えば、<div class="row"><div class="col-3">サイドバー</div><div class="col-9">コンテンツ</div></div> と記述するだけです。グリッドはBootstrapのコアとなるレイアウトツールであり、12カラムのFlexboxグリッドに基づいています。row + col-* を使うことで、任意の複雑さのページレイアウトを構築できます。
考え方のヒント: グリッドはExcelのスプレッドシートのようなものです。1行が
rowで、均等に12の等分に分けられます。col-4は4部分を占め、col-8は8部分を占め、合計でちょうど12になります。
(5) メリット
グリッドシステムを使用した結果、Aliceはわずか数行のタグで、左3カラム、右9カラムという古典的なブログレイアウトを完成させました。ブレイクポイントサフィックスと組み合わせることで、レスポンシブな適応を容易に実現しました。
2. 基本構造
グリッドは常にContainer -> Row -> Column のネスト構造に従います:
<div class="container">
<div class="row">
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
</div>
</div>
出力: Bootstrap 5.3 のスタイルが適用されたコンポーネント(例:ボタン、カード、カルーセル、折りたたみなど)。ページはデフォルトでBootstrapのデフォルトテーマ(ライト)とレスポンシブグリッドを使用します。
▶ サンプル 基本グリッドレイアウト
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Grid Basics</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
.demo-col { background: #0d6efd; color: #fff; padding: 1rem; border: 1px solid #fff; text-align: center; }
</style>
</head>
<body>
<div class="container py-4">
<div class="row mb-3">
<div class="col demo-col">col (4/12)</div>
<div class="col demo-col">col (4/12)</div>
<div class="col demo-col">col (4/12)</div>
</div>
<div class="row mb-3">
<div class="col-4 demo-col" style="background: #198754;">col-4</div>
<div class="col-8 demo-col" style="background: #dc3545;">col-8</div>
</div>
<div class="row">
<div class="col-3 demo-col" style="background: #6f42c1;">col-3</div>
<div class="col demo-col" style="background: #fd7e14;">col (auto)</div>
<div class="col-3 demo-col" style="background: #20c997;">col-3</div>
</div>
</div>
</body>
</html>
出力: Bootstrap 5.3 のスタイルが適用されたコンポーネント(例:ボタン、カード、カルーセル、折りたたみなど)。ページはデフォルトでBootstrapのデフォルトテーマ(ライト)とレスポンシブグリッドを使用します。
(1) カラムの挙動比較
| クラス | 挙動 | ユースケース |
|---|---|---|
col |
残りのスペースを均等に分割 | 等幅カラム |
col-{n} |
n/12 の固定幅 | 固定比率のレイアウト |
col-auto |
コンテンツに合わせた幅 | ボタングループ、バッジ |
col-{breakpoint} |
ブレイクポイント未満で全幅、以上で比例 | レスポンシブレイアウト |
3. レスポンシブカラム
<div class="row">
<div class="col-12 col-md-6 col-lg-4 bg-primary p-3 text-white">サイドバー</div>
<div class="col-12 col-md-6 col-lg-8 bg-info p-3 text-white">コンテンツ</div>
</div>
出力: Bootstrap 5.3 のスタイルが適用されたコンポーネント(例:ボタン、カード、カルーセル、折りたたみなど)。ページはデフォルトでBootstrapのデフォルトテーマ(ライト)とレスポンシブグリッドを使用します。
| 構文 | < 768px | 768-991px | >= 992px |
|---|---|---|---|
col-12 col-md-6 col-lg-4 |
全幅 | 1/2幅 | 1/3幅 |
col-6 col-md-4 col-xl-3 |
1/2幅 | 1/3幅 | 1/4幅 |
col-md-8 |
全幅 | 2/3幅 | 2/3幅 |
4. 複数行と折り返し
1行のカラムの合計数が12を超えると、余分なカラムは自動的に次の行に折り返されます:
<div class="row">
<div class="col-4 bg-primary p-3 text-white">4</div>
<div class="col-4 bg-success p-3 text-white">4</div>
<div class="col-4 bg-danger p-3 text-white">4</div>
<div class="col-4 bg-warning p-3">4(次の行に折り返し)</div>
<div class="col-4 bg-info p-3 text-white">4</div>
</div>
出力: Bootstrap 5.3 のスタイルが適用されたコンポーネント(例:ボタン、カード、カルーセル、折りたたみなど)。ページはデフォルトでBootstrapのデフォルトテーマ(ライト)とレスポンシブグリッドを使用します。
5. オフセット
<div class="row">
<div class="col-3 bg-primary p-3 text-white">サイドバー</div>
<div class="col-6 offset-3 bg-info p-3 text-white">右に3カラムオフセット</div>
</div>
<div class="row">
<div class="col-6 offset-3 bg-success p-3 text-white text-center">
中央揃えカラム (col-6 + offset-3)
</div>
</div>
出力: Bootstrap 5.3 のスタイルが適用されたコンポーネント(例:ボタン、カード、カルーセル、折りたたみなど)。ページはデフォルトでBootstrapのデフォルトテーマ(ライト)とレスポンシブグリッドを使用します。
| 構文 | 効果 |
|---|---|
col-6 offset-3 |
6カラム中央揃え |
col-4 offset-4 |
4カラム中央揃え |
col-8 offset-2 |
8カラム左オフセット |
6. ネスト
カラムの中にさらに row + col のセットをネストします:
<div class="row">
<div class="col-8 bg-light p-3">
<h6>メインセクション</h6>
<div class="row">
<div class="col-6 bg-primary text-white p-2">ネストされた6</div>
<div class="col-6 bg-success text-white p-2">ネストされた6</div>
</div>
</div>
<div class="col-4 bg-info p-3 text-white">サイドバー</div>
</div>
出力: Bootstrap 5.3 のスタイルが適用されたコンポーネント(例:ボタン、カード、カルーセル、折りたたみなど)。ページはデフォルトでBootstrapのデフォルトテーマ(ライト)とレスポンシブグリッドを使用します。 ネストされたグリッド内のカラムの合計も12ですが、これは親カラム(コンテナではなく)に対して計算されます。
7. ガター
<div class="row g-0">
<div class="col-6"><div class="bg-primary text-white p-3">g-0: 間隔なし</div></div>
<div class="col-6"><div class="bg-success text-white p-3">g-0: 間隔なし</div></div>
</div>
<div class="row g-4 mt-2">
<div class="col-6"><div class="bg-primary text-white p-3">g-4: 24px間隔</div></div>
<div class="col-6"><div class="bg-success text-white p-3">g-4: 24px間隔</div></div>
</div>
出力: Bootstrap 5.3 のスタイルが適用されたコンポーネント(例:ボタン、カード、カルーセル、折りたたみなど)。ページはデフォルトでBootstrapのデフォルトテーマ(ライト)とレスポンシブグリッドを使用します。
| クラス | 水平方向 | 垂直方向 |
|---|---|---|
g-0 |
0 | 0 |
g-3 |
1rem | 1rem |
g-5 |
3rem | 3rem |
gx-4 |
1.5rem | 0 |
gy-4 |
0 | 1.5rem |
8. グリッドアーキテクチャとリファレンス
(1) グリッドシステムアーキテクチャ
graph TB
subgraph コンテナ層
A[.container / .container-fluid] --> B[最大幅 + 水平パディング]
end
subgraph 行層
B --> C[.row]
C --> D[コンテナのパディングを相殺するネガティブマージン]
C --> E[ガター間隔制御]
end
subgraph カラム層
D --> F[.col-*]
E --> F
F --> G[12カラムフレックスシステム]
F --> H[レスポンシブブレイクポイント col-md-*]
F --> I[オフセット offset-*]
F --> J[順序 order-*]
end
subgraph サブコンテンツ
G --> K[ネストされたグリッド row > col]
H --> K
I --> K
end
出力: Bootstrap 5.3 のスタイルが適用されたコンポーネント(例:ボタン、カード、カルーセル、折りたたみなど)。ページはデフォルトでBootstrapのデフォルトテーマ(ライト)とレスポンシブグリッドを使用します。
(2) グリッドレベルリファレンス
| レベル | 要素 | クラス | 幅 | 説明 |
|---|---|---|---|---|
| コンテナ | <div> |
container |
レスポンシブ固定幅 | 中央揃え、最大幅を制限 |
| コンテナ | <div> |
container-fluid |
100% | 全幅 |
| コンテナ | <div> |
container-{sm|md|lg|xl|xxl} |
対応するブレイクポイント | 指定されたブレイクポイントまで全幅 |
| 行 | <div> |
row |
100% + ネガティブマージン | フレックスコンテナ |
| カラム | <div> |
col |
自動分割 | 自動サイジング |
| カラム | <div> |
col-{n} |
n/12 | 固定比率 |
| カラム | <div> |
col-{bp}-{n} |
レスポンシブ | ブレイクポイント以上で比例 |
(3) グリッドブレイクポイントカラムリファレンス
| クラス名 | <576px | >=576px | >=768px | >=992px | >=1200px | >=1400px |
|---|---|---|---|---|---|---|
col-12 |
100% | 100% | 100% | 100% | 100% | 100% |
col-sm-6 |
100% | 50% | 50% | 50% | 50% | 50% |
col-md-4 |
100% | 100% | 33.3% | 33.3% | 33.3% | 33.3% |
col-lg-3 |
100% | 100% | 100% | 25% | 25% | 25% |
col-xl-2 |
100% | 100% | 100% | 100% | 16.67% | 16.67% |
col-12 col-md-6 col-lg-4 |
100% | 100% | 50% | 33.3% | 33.3% | 33.3% |
col-6 col-md-4 col-xl-3 |
50% | 50% | 33.3% | 33.3% | 25% | 25% |
▶ サンプル ブログページレイアウト
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Blog Layout</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container py-4">
<header class="mb-4">
<h1>My Blog</h1>
<p class="text-muted">テクノロジーと思想を共有</p>
</header>
<div class="row g-4">
<!-- メインコンテンツ -->
<article class="col-12 col-lg-8">
<div class="card mb-3">
<div class="card-body">
<h2 class="card-title h4">動作するグリッドレイアウト</h2>
<p class="card-text text-muted small">2026年1月20日</p>
<p>col-8 + col-4 を使用して、記事エリアが左、サイドバーが右の古典的なブログレイアウトを作成します。</p>
<button class="btn btn-sm btn-primary">続きを読む</button>
</div>
</div>
<div class="card">
<div class="card-body">
<h2 class="card-title h4">Bootstrap 5の新機能</h2>
<p class="card-text text-muted small">2026年1月18日</p>
<p>Bootstrap 5は、CSS変数、改善されたグリッドシステム、新しいユーティリティクラスを導入しています。</p>
<button class="btn btn-sm btn-primary">続きを読む</button>
</div>
</div>
</article>
<!-- サイドバー -->
<aside class="col-12 col-lg-4">
<div class="bg-light p-4 rounded">
<h5>著者について</h5>
<p class="small mb-0">フロントエンド技術とUIデザインに情熱を持つフルスタック開発者。</p>
</div>
<div class="bg-light p-4 rounded mt-3">
<h5>カテゴリ</h5>
<ul class="list-unstyled small mb-0">
<li>フロントエンド (12)</li>
<li>バックエンド (8)</li>
<li>デザイン (5)</li>
</ul>
</div>
</aside>
</div>
</div>
</body>
</html>
出力: Bootstrap 5.3 のスタイルが適用されたコンポーネント(例:ボタン、カード、カルーセル、折りたたみなど)。ページはデフォルトでBootstrapのデフォルトテーマ(ライト)とレスポンシブグリッドを使用します。
▶ サンプル ダッシュボードグリッド
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dashboard Grid</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container-fluid py-4 bg-light" style="min-height: 100vh;">
<h3 class="mb-4">ダッシュボード</h3>
<!-- 統計行 -->
<div class="row g-3 mb-4">
<div class="col-6 col-xl-3">
<div class="bg-primary text-white p-3 rounded">
<h6 class="mb-1">ユーザー</h6>
<h3 class="mb-0">1,284</h3>
</div>
</div>
<div class="col-6 col-xl-3">
<div class="bg-success text-white p-3 rounded">
<h6 class="mb-1">注文</h6>
<h3 class="mb-0">356</h3>
</div>
</div>
<div class="col-6 col-xl-3">
<div class="bg-warning text-dark p-3 rounded">
<h6 class="mb-1">売上</h6>
<h3 class="mb-0">$12,450</h3>
</div>
</div>
<div class="col-6 col-xl-3">
<div class="bg-info text-white p-3 rounded">
<h6 class="mb-1">アクティビティ</h6>
<h3 class="mb-0">78%</h3>
</div>
</div>
</div>
<!-- チャート + テーブル -->
<div class="row g-3">
<div class="col-12 col-lg-8">
<div class="bg-white p-4 rounded shadow-sm">
<h5>チャートエリア</h5>
<div class="bg-light" style="height: 200px;"></div>
</div>
</div>
<div class="col-12 col-lg-4">
<div class="bg-white p-4 rounded shadow-sm">
<h5>最近のアクティビティ</h5>
<ul class="list-unstyled small mb-0">
<li class="mb-2">Zhang Sanが新しいアカウントを登録</li>
<li class="mb-2">Li Siが注文を提出</li>
<li>Wang Wuがプロフィールを更新</li>
</ul>
</div>
</div>
</div>
</div>
</body>
</html>
出力: Bootstrap 5.3 のスタイルが適用されたコンポーネント(例:ボタン、カード、カルーセル、折りたたみなど)。ページはデフォルトでBootstrapのデフォルトテーマ(ライト)とレスポンシブグリッドを使用します。
▶ サンプル ネストされたグリッド
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Nested Grid</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
.outer { background: #e9ecef; border: 2px dashed #0d6efd; padding: 1rem; }
.inner { background: #0d6efd; color: #fff; padding: 0.75rem; border: 1px solid #fff; text-align: center; }
</style>
</head>
<body>
<div class="container py-4">
<h3 class="mb-3">ネストされたグリッドデモ</h3>
<div class="row">
<div class="col-8">
<div class="outer">
<h6>メインカラム col-8</h6>
<div class="row g-2">
<div class="col-6"><div class="inner">ネストされた col-6</div></div>
<div class="col-6"><div class="inner">ネストされた col-6</div></div>
<div class="col-4"><div class="inner">ネストされた col-4</div></div>
<div class="col-4"><div class="inner">ネストされた col-4</div></div>
<div class="col-4"><div class="inner">ネストされた col-4</div></div>
</div>
<p class="small mt-2 mb-0">ネストされたグリッドの12カラムは親カラムに対して計算されます</p>
</div>
</div>
<div class="col-4">
<div class="outer" style="height: 100%;">
<h6>サイドバー col-4</h6>
<p class="small mb-0">サイドバーの高さはメインカラムのコンテンツに自動的に合わせられます</p>
</div>
</div>
</div>
</div>
</body>
</html>
出力: Bootstrap 5.3 のスタイルが適用されたコンポーネント(例:ボタン、カード、カルーセル、折りたたみなど)。ページはデフォルトでBootstrapのデフォルトテーマ(ライト)とレスポンシブグリッドを使用します。
▶ サンプル レスポンシブ商品グリッド
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Product Grid</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container py-4">
<h3 class="mb-4">商品リスト</h3>
<div class="row g-3 g-lg-4">
<div class="col-6 col-md-4 col-lg-3">
<div class="card">
<img src="https://via.placeholder.com/300x200/0d6efd/fff?text=Product1" class="card-img-top" alt="">
<div class="card-body">
<h6 class="card-title">商品名</h6>
<p class="card-text text-danger fw-bold mb-0">$99.00</p>
</div>
</div>
</div>
<div class="col-6 col-md-4 col-lg-3">
<div class="card">
<img src="https://via.placeholder.com/300x200/198754/fff?text=Product2" class="card-img-top" alt="">
<div class="card-body">
<h6 class="card-title">商品名</h6>
<p class="card-text text-danger fw-bold mb-0">$149.00</p>
</div>
</div>
</div>
<div class="col-6 col-md-4 col-lg-3">
<div class="card">
<img src="https://via.placeholder.com/300x200/dc3545/fff?text=Product3" class="card-img-top" alt="">
<div class="card-body">
<h6 class="card-title">商品名</h6>
<p class="card-text text-danger fw-bold mb-0">$199.00</p>
</div>
</div>
</div>
<div class="col-6 col-md-4 col-lg-3">
<div class="card">
<img src="https://via.placeholder.com/300x200/ffc107/000?text=Product4" class="card-img-top" alt="">
<div class="card-body">
<h6 class="card-title">商品名</h6>
<p class="card-text text-danger fw-bold mb-0">$59.00</p>
</div>
</div>
</div>
</div>
<p class="text-muted small mt-3">
レスポンシブ: モバイル2カラム (col-6) → タブレット3カラム (col-md-4) → デスクトップ4カラム (col-lg-3)、間隔 g-3 → g-lg-4
</p>
</div>
</body>
</html>
出力: Bootstrap 5.3 のスタイルが適用されたコンポーネント(例:ボタン、カード、カルーセル、折りたたみなど)。ページはデフォルトでBootstrapのデフォルトテーマ(ライト)とレスポンシブグリッドを使用します。
❓ よくある質問
col-4 + col-4 は 8/12 を占め、4/12 が空きます。残りのスペースを埋める必要がある場合は、col(自動サイズ)を使用してください。gap-* の違いは何ですか?g-*(ガター)はグリッド固有のもので、row に適用することでカラム間の間隔を制御します。gap-* は汎用のフレックス/グリッドユーティリティクラスです。グリッドレイアウトでは、g-* が推奨されます。row の中に入っていない;(2) row がコンテナ(container/container-fluid)の外にある;(3) カラムの合計幅が12を超え、折り返しが発生している。col と col-12 は同じですか?col は flex: 1 0 0% を使用し、他の col 要素間で利用可能なスペースを均等に分割します。col-12 は固定の width: 100% を持っています。align-items-* や align-self-* ユーティリティクラスを直接使用できます。row に align-items-center を追加すると、行内のすべてのカラムが垂直方向に中央揃えになります。特定の col に align-self-end を追加すると、下端に配置されます。📖 まとめ
- グリッドの3層構造:
container > .row > .col-* - 12カラムシステム:
col-6= 50%,col-4= 33.3%,col-3= 25% - ブレイクポイントサフィックスによるレスポンシブ実装:
col-12 col-md-6 col-lg-4 offset-*によるカラムオフセット;ネストされたグリッドのカラム合計は依然として12g-*によるガター間隔の制御
📝 練習問題
- ⭐ 標準的なブログレイアウトを作成: モバイルで全幅表示、デスクトップで左
col-8記事エリア + 右col-4サイドバー。 - ⭐⭐ グリッドを使用して4カラムのカードグリッドを実装: モバイルで1カラム (
col-12)、タブレットで2カラム (col-md-6)、デスクトップで4カラム (col-lg-3)、カード間にはg-4の間隔を設定。 - ⭐⭐⭐ 非対称レイアウトを作成: サイドバー
col-3+ コンテンツエリアcol-6+ 右側の小さなウィジェットcol-3。
前回のレッスン: レスポンシブデザイン · 次のレッスン: ナビバー