カテゴリ: CSS 更新日: 2025/11/05

CSSのマージン相殺(margin collapsing)とは?上下の余白が消える理由を初心者向けに解説!

マージン相殺(margin collapsing)とは?上下の余白が消える理由
マージン相殺(margin collapsing)とは?上下の余白が消える理由

先生と生徒の会話形式で理解しよう

生徒

「先生、CSSで段落と段落の間に余白を作ろうと思ってmarginを設定したのに、思ったより間が狭くなってしまいました。なんでですか?」

先生

「それは『マージン相殺(margin collapsing)』が起きている可能性が高いですね。」

生徒

「マージン相殺?初めて聞きました。どういうことなんですか?」

先生

「では、初心者にも分かりやすく、図や具体例を使って解説していきましょう。」

1. マージン相殺(margin collapsing)とは?

1. マージン相殺(margin collapsing)とは?
1. マージン相殺(margin collapsing)とは?

まず、マージン(margin)とは、ボックスとボックスの「外側の余白」のことです。HTMLの要素同士が縦に並ぶとき、上の要素の下マージン(margin-bottom)と、下の要素の上マージン(margin-top)がくっつくように作用します。

このとき、2つのマージンは単純に「足される(合計)」のではなく、「大きい方だけが反映される」というルールがあります。これが「マージン相殺(margin collapsing)」です。

つまり、上下の余白が重なって1つのマージンにまとめられるイメージです。CSS初心者の方が「余白が思ったより狭い!」と感じる原因の多くは、このマージン相殺にあります。

2. 実際のマージン相殺の例を見てみよう

2. 実際のマージン相殺の例を見てみよう
2. 実際のマージン相殺の例を見てみよう

下の例では、2つの段落(pタグ)にそれぞれマージンを設定しています。どちらもmargin: 30px;にしているので、普通に考えると間の余白は60pxになりそうですが…実際には30pxしか開きません。


<style>
p {
    margin: 30px;
    background-color: #e0f7fa;
    border: 1px solid #0097a7;
}
</style>

<p>上の段落です。</p>
<p>下の段落です。</p>
ブラウザ表示

これは、上の段落の下マージン30pxと、下の段落の上マージン30pxが「重なり合って1つの30px」になっているからです。これがまさにマージン相殺の仕組みです。

3. マージン相殺が起きる3つの代表的なパターン

3. マージン相殺が起きる3つの代表的なパターン
3. マージン相殺が起きる3つの代表的なパターン

① 縦に並ぶブロック要素同士

最もよくあるパターンです。たとえば段落(pタグ)や見出し(h1〜h6)、divタグなど、縦方向に積み重なった要素の上下マージンが重なります。

② 親要素と子要素のマージン

実は、子要素の上マージンが親要素にくっついて相殺されることもあります。例えば、親のdivに背景色をつけていても、子のpタグの上マージンが外側に飛び出してしまうことがあります。


<style>
.box {
    background-color: #f1f8e9;
    border: 2px solid #8bc34a;
}
p {
    margin-top: 40px;
    background-color: #dcedc8;
}
</style>

<div class="box">
    <p>子要素の段落です。</p>
</div>
ブラウザ表示

このように、親と子の間でもマージンが合体してしまい、思った位置に余白がつかないことがあります。

③ 空の要素

中身が何も入っていない空の要素でも、上下のマージンが相殺されます。つまり、内部にコンテンツがないと「上」と「下」のマージンが1つにまとまってしまうのです。

4. なぜCSSはマージン相殺を採用しているの?

4. なぜCSSはマージン相殺を採用しているの?
4. なぜCSSはマージン相殺を採用しているの?

マージン相殺のルールは、見た目を自然に整えるためにCSSの仕様として決められています。もし相殺されず、上下のマージンがすべて足し算されたら、ちょっとした調整のたびに余白がどんどん広がってしまいます。

たとえばブログの記事本文の段落間などで、1つ1つの要素がそれぞれマージンを持っていたら、余白が倍になってしまいます。相殺のおかげで見た目がスッキリ揃うのです。

5. マージン相殺を防ぐ方法

5. マージン相殺を防ぐ方法
5. マージン相殺を防ぐ方法

「余白が消えて困る!」という場合は、いくつかの回避方法があります。これらを知っておくと、思い通りのデザインを作りやすくなります。

① 親要素にパディングやボーダーをつける

親要素にpadding(内側の余白)やborder(境界線)をつけると、マージン相殺は発生しません。マージンの間に“壁”ができるイメージです。


<style>
.box {
    background-color: #f3e5f5;
    border: 1px solid #9c27b0;
    padding: 1px; /* わずかでもOK */
}
p {
    margin-top: 40px;
}
</style>

<div class="box">
    <p>マージン相殺を防いだ例です。</p>
</div>
ブラウザ表示

② 親要素にoverflow: hidden;を指定する

CSSのプロパティで「overflow: hidden;」をつけても、マージン相殺を防ぐことができます。スクロールなどの設定に使われることもありますが、ここでは“相殺防止”にも使える便利な方法です。


<style>
.box {
    background-color: #e3f2fd;
    overflow: hidden;
}
p {
    margin-top: 40px;
}
</style>

<div class="box">
    <p>overflowで相殺を防止しています。</p>
</div>
ブラウザ表示

③ display: flow-root; を使う

最近では、「display: flow-root;」を使う方法もおすすめです。これは親要素を“新しい独立したブロック”として扱わせるもので、マージン相殺を防げるだけでなく、floatなどのレイアウト崩れ対策にも使えます。

6. まとめ:マージン相殺を理解して、余白を正しくコントロールしよう

6. まとめ:マージン相殺を理解して、余白を正しくコントロールしよう
6. まとめ:マージン相殺を理解して、余白を正しくコントロールしよう

マージン相殺は、CSSのボックスモデルの中でもとても重要なルールです。知らないと「なぜ余白が消えるの?」と混乱しやすい部分ですが、仕組みを理解すればデザインが一気に思い通りになります。

marginやpadding、borderの基本を押さえながら、「どの余白が相殺されるのか」「どうすれば防げるのか」を意識して使うことで、より美しいWebページが作れるようになります。

関連記事:
カテゴリの一覧へ
新着記事
CSSのダブルボーダーや点線・破線を完全ガイド!初心者でもわかるdotted・dashed・doubleの使い方
Bootstrapの$theme-colorsを拡張!ブランドカラー追加の完全ガイド【map-merge】
CSSの境界線を部分的に設定する方法を完全ガイド!初心者でもわかるborder-topなどの使い方
BootstrapのSass変数を完全ガイド!初心者でもわかる色・余白・フォント設定
人気記事
No.1
Java&Spring記事人気No1
CSSで文字の間隔を調整する方法!初心者でもわかるletter-spacingとword-spacingの使い方
No.2
Java&Spring記事人気No2
CSSのtext-alignの使い方完全ガイド!初心者でもわかる文字揃えの基本
No.3
Java&Spring記事人気No3
Bootstrap 3から5への一気移行ガイド!初心者でもわかる段階的リファクタリングの進め方
No.4
Java&Spring記事人気No4
CSSの文字間・単語間の調整と影の付け方を完全ガイド!初心者でもわかるテキスト装飾術