おはようッ、戦うエンジニア諸君!🚀 今日は HTML/CSS の“あるある”バグ――子要素のマージンが親要素をすり抜ける現象に挑むッ! その挙動、仕様を知れば必ず制御できる。解析の狼煙を上げよッ!🔥
Contents
◆ 問題コード
<!-- マージン可視化サンプル -->
<body>
<div class="container-wrap">
<!-- マージン相殺が起きる要素 -->
<div class="container">
<p class="intro">ようこそ、</p>
</div>
<!-- 隣接するブロック要素 -->
<div class="container">
<p class="intro">団長のデバッグ道場へ!</p>
</div>
</div>
</body>
<style>
body {
background-color: #fdd; /* ページ全体を薄赤に */
margin: 0;
padding: 0;
}
.container-wrap {
background-color: #ddd; /* 親要素の背景をグレーに */
}
.container {
background: #000000; /* 子要素の背景を黒に */
}
.intro {
margin: 20px 0; /* この margin が相殺される */
background: #fff;
padding: 8px;
}
</style>
◆ 実際の表示結果
このコードをブラウザに適用すると、以下のように背景色がレンダリングされます:
- body:ピンク(
#fdd
) - .container-wrap:グレー(
#ddd
) - .container:黒(
#000
) - .intro:白背景(
#fff
)+上下20pxの余白

本来であれば、この上下20pxの余白は黒い<div class="container">
の内側に現れるはずですが、実際には:
- .container同士の隙間にはグレーの.container-wrap背景が見え
- .container-wrapの上下にはピンクのbody背景が見えています
これは CSS のMargin Collapse(マージン相殺)により、子要素のマージンが親要素の外側(あるいは隣接する要素間)に“折りたたまれる”ためです。 次節では、このマージン相殺を回避する具体的なテクニックをご紹介します。
◆ 知的深堀り —— Margin Collapse の真実
CSS の Margin Collapse ルールにより、隣接するブロック要素同士の上下 margin は合算され、 特に親要素と最初の子要素の上下 margin は“折りたたまれる”性質がある。 その結果、.container
上端ではなく親の外側にスペースが現れるのだ。
◆ 解決の一手 —— 4つのアプローチ
- padding を使う
.container { padding-top:1px; }
などで margin を押し戻す。 - overflow を指定
.container { overflow: hidden; }
でブロックフォーマットコンテキストを生成。 - border を挿入
.container { border-top:1px solid transparent; }
で collapse を抑制。 - display: flow-root
.container { display: flow-root; }
で独立した BFC を作成。
◆ 団長からのワンポイント
「仕様を知る者は挙動を支配する」―― CSS の“隠れたルール”を味方につければ、バグは恐れるに足らず。 真の武器はドキュメントを読み解く力だッ!
◆ おすすめ学び直しアイテム
- 現場のプロが教える HTML&CSSコーディングの新標準ガイド — Flexbox/Grid/BEM だけでなく、Margin Collapse や BFC も丁寧に解説。
- TechAcademy CSSコース — 動画+ハンズオンで CSS の挙動を体験的に学べるオンライン講座。
※一部リンクにアフィリエイト広告を含みます。学びのエネルギーとしてご活用ください。