HTMLのすべての要素は目に見えない「箱(ボックス)」として扱われます。この箱の構造を理解することが、CSSレイアウトを自在に操る第一歩です。ボックスモデルを理解しないと、「幅を200pxに設定したのに実際は244pxになった」「要素間のスペースが意図と違う」といった問題に悩まされます。このレッスンでは4層のボックス構造、box-sizing による計算方式の切り替え、そして縦方向のmarginで起きる「margin相殺」を徹底解説します。
CSSボックスモデル:content / padding / border / margin
CSS のボックスモデルは内側から順に以下の4層で構成されます。
┌────────────────────────────────┐ ← margin(外余白)
│ ┌──────────────────────────┐ │ ← border(枠線)
│ │ ┌──────────────────┐ │ │ ← padding(内余白)
│ │ │ │ │ │
│ │ │ content │ │ │ ← コンテンツ領域
│ │ │ │ │ │
│ │ └──────────────────┘ │ │
│ └──────────────────────────┘ │
└────────────────────────────────┘
テキスト・画像・子要素が実際に表示される領域です。width と height プロパティで直接指定する領域です(box-sizing: content-box の場合)。
.box { width: 200px; height: 150px; }
コンテンツとボーダーの間のスペースです。背景色はpaddingまで広がります。
/* 全方向同じ値 */
.box { padding: 16px; }
/* 縦 | 横 の2値 */
.box { padding: 12px 24px; }
/* 上 | 右 | 下 | 左 の4値(時計回り) */
.box { padding: 8px 16px 8px 16px; }
/* 個別指定 */
.box { padding-top: 8px; padding-right: 16px; }
paddingの外側を囲む枠線です。border: 太さ スタイル 色 の順で指定します。
.box { border: 2px solid #e5e7eb; }
.circle { border: 4px solid #2563eb; border-radius: 50%; }
主なborderスタイル: solid(実線)/ dashed(破線)/ dotted(点線)/ none(なし)
ボーダーの外側のスペースです。要素と要素の間隔を設定します。auto を使うと中央揃えができます。
.box { margin: 16px; }
.centered { width: 800px; margin: 0 auto; } /* 左右中央揃え */
.no-margin { margin: 0; }
💡 paddingとmarginの使い分け: コンテンツ内部の余白にはpadding、要素間のスペースにはmarginを使います。背景色はpaddingまで広がりますが、marginには広がりません。この違いが視覚的なデザインの意図と一致します。
CSSの width と height がどこまでを含む幅かを決めるプロパティです。
width / height は contentのみのサイズを指定します。実際の要素サイズは padding と border が加算されます。
.box {
box-sizing: content-box; /* デフォルト */
width: 200px;
padding: 20px;
border: 2px solid black;
/* 実際の幅: 200 + 20*2 + 2*2 = 244px */
}
width / height に content + padding + border が含まれます。指定した幅がそのまま要素の占める幅になるため、直感的で設計しやすいです。
.box {
box-sizing: border-box; /* 推奨 */
width: 200px;
padding: 20px;
border: 2px solid black;
/* 実際の幅: 200px(変わらない) */
}
現代の CSS では以下のように全要素に border-box を適用するのが標準的です。
*, *::before, *::after {
box-sizing: border-box;
}
⚠️ 新規プロジェクトでは必ず
border-boxをリセットする:content-boxのままではwidth: 50%の要素が padding によって 50% を超え、意図しない改行やはみ出しが発生します。CSSリセットの冒頭にこの1行を入れることが業界標準です。
隣接するブロック要素の縦方向(top / bottom)のmarginは、大きい方の値のみが採用されます。これを「margin相殺」または「マージンコラプス」と呼びます。
<p class="a">段落A</p>
<p class="b">段落B</p>
.a { margin-bottom: 30px; }
.b { margin-top: 20px; }
/* 実際の間隔: max(30, 20) = 30px */
30 + 20 = 50px になると思いがちですが、実際は 30px になります。
| 条件 | 詳細 |
|---|---|
| 隣接するブロック要素 | 縦方向に隣接する場合のみ相殺 |
| 親子間のmargin | 親に border/padding がない場合、子のmarginが親を突き抜ける |
| 空要素の自己相殺 | contentも padding/borderもない要素は上下marginが相殺される |
overflow: hidden display: flow-root などが設定されている場合も相殺されない/* 親子間の相殺を防ぐ */
.parent { padding-top: 1px; } /* わずかなpaddingでOK */
.parent { overflow: hidden; }
.parent { display: flow-root; } /* 最も意味的に正確 */
💡 Flexboxを使えばmargin相殺を気にしなくて済む: Flexboxのコンテナ内では子要素間のmargin相殺は発生しません。現代のレイアウトではFlexboxやGrid、そして
gapプロパティを使うことで、margin相殺による混乱を避けられます。
要素の display プロパティによってボックスモデルの挙動が変わります。
| display | 挙動 | width/height | padding/margin |
|---|---|---|---|
block | 行全体を占有 | 有効 | 全方向有効 |
inline | コンテンツ幅のみ | 無効 | 左右のみ有効 |
inline-block | インライン配置 + ブロック特性 | 有効 | 全方向有効 |
flex | フレックスコンテナ | 有効 | 全方向有効 |
インライン要素(<span>, <a> など)に width を指定しても効かない理由がここにあります。display: inline-block に変更することで幅・高さを指定できます。
span { display: inline-block; width: 100px; padding: 8px 16px; }
Chrome / Edge の DevTools(F12)では、選択した要素のボックスモデルを視覚的に確認できます。
⚠️ DevToolsで確認しながら開発する: 「なぜかサイズがズレる」「余白が意図と違う」という問題の9割はボックスモデルの計算ミスです。コードを書きながらDevToolsのボックスモデル図を常に確認する習慣が、フロントエンド開発スキルを最速で上げるコツです。
以下のワークを実施してください。
content-box と border-box の両方で width: 200px; padding: 20px; border: 2px solid black; を設定し、実際にブラウザで表示されるサイズをDevToolsで計測してください。<p> 要素に異なるmarginを設定し、実際の間隔をDevToolsで確認してください。次に親要素に display: flow-root を追加して相殺が解消されることを確認してください。margin: 0 auto で画面中央に配置し、ウィンドウ幅を変えても中央に保たれることを確認してください。<span> 要素にデフォルト状態で width を設定し効かないことを確認後、display: inline-block に変更して有効になることを確認してください。ボックスモデルはcontent・padding・border・marginの4層で構成され、すべてのHTML要素に適用されます。box-sizing: border-box を全要素に適用するのが現代の標準で、これにより width 指定と実際の表示幅が一致します。縦方向の隣接するmarginは相殺が発生し、大きい方だけが採用されます。Flexbox / Grid の子要素では相殺が起きないため、現代的なレイアウト手法の方が予測しやすいです。DevToolsのボックスモデル表示を活用し、常に実際の値を確認しながら開発しましょう。次のレッスンでは Flexbox を使った実践的なレイアウト技法を学びます。
全問正解でこのレッスンが「完了」になり、コースの全レッスンを完了すると修了証が発行されます。解説つき・何度でも挑戦できます。
Q1.width: 50%の要素を2つ横に並べ、paddingを付けたら折り返してしまいました。本文に沿った対策はどれですか。
Q2.上の段落にmargin-bottom: 30px、下の段落にmargin-top: 20pxを指定しました。2つの段落の間隔はどうなりますか。
Q3.<span>にwidth: 100pxを指定しても幅が変わりません。本文に沿った対処はどれですか。
完全無料・クレジットカード不要
実践Webデザイン - Figma完全マスター講座
Auto LayoutはFigmaが他のデザインツールと一線を画す最大の機能です。
30分本文は無料で閲覧可
デザイン基礎 - 視覚コミュニケーション入門
レイアウトはデザインの「骨格」です。
35分本文は無料で閲覧可
WordPress HP制作完全講座
WordPress 5.0から標準搭載されたブロックエディタ(Gutenberg)は、ドラッグ&ドロップとブロックの組み合わせでリッチなコン
30分本文は無料で閲覧可
WordPress HP制作完全講座
ホームページ(HP)を作る前に最も重要なのが「なぜ作るのか」という目的の明確化です。
30分無料公開
WordPress HP制作完全講座
WordPressでHPを公開するには、サーバー(サイトのデータを保存・配信する場所) と ドメイン(サイトのアドレス) の2つが必要です。
30分無料公開
WordPress HP制作完全講座
サーバーとドメインの準備が整ったら、いよいよWordPressのインストールです。
30分無料公開
各レッスンの理解度チェックに合格すると ✓ がつきます