Single Article

マージンの相殺について:CSS

垂直方向のマージンの相殺(margin collapsing)についてです。特に難しいことはないですが、レイアウトする時は気にする必要があると思います。
マージンの相殺は、各ブラウザが実装しても、しなくてもいい仕様だそうです。ここで述べられている内容は、Firefox2, IE6, Opera9ではそのとおりになります。ただし、IE6では”haslayout”になると、マージンの相殺は起こらないようです。ご指摘ありがとうございました。

A.基本

  • 垂直方向のマージンは相殺されて、長い方のマージンになる。フロートしたボックス、及びposition: absoluteのボックスは相殺されない。
    Margin Collapse - Multiple box
  • あるボックスがボックスに内包されている場合、かつ外側のボックスにpaddingとborderが無い場合、垂直方向のマージンは相殺されて長い方のマージンになる。
    Margin Collapse - Innerbox
  • ボックス内が空の場合は、自分自身の上下マージンも相殺されて長い方のマージンにまとまる。
    Margin Collapse - boxself

B.Tips

Tipsというほどではありませんが、垂直マージンの相殺は、複数パラグラフの最初と最後のマージンと途中のマージンを同じにする効果があります。マージンを同じにするだけなら、最初のパラグラフにmargin-topでいくらとか、計算する必要はありません。
Margin Collapse with paragraphs

また、よくある

HTML

<div id="box">
   <p>このパラはmargin 20pxです。</p>
</div>

包含div#boxにmargin:10pxをして、

CSS

div#box {
   margin: 10px;
   background-color:#d5d5d5;
}

p{
   margin: 20px;
   background-color:#6699FF;
}

以下のような結果を期待しても、

このパラはmargin 20pxです。

以下のようになってしまいます。

このパラはmargin 20pxです。

これを期待したようにするためには、垂直方向のpaddingかborderを包含ボックスに入れれば良いです。

CSS

div#box {
   margin: 9px;
   padding: 1px;
   background-color:#d5d5d5;
}

p{
   margin: 20px;
   background-color:#6699FF;
}

これで、期待したとおり(上の方の例)の結果になります。

Related Posts

Trackback URL

2 Comments

  1. iwaim
    Posted 2007/5/27 at 3:38 pm | Permalink

    実装系依存の話は該当する実装系を書くべきだと思います。

    > SBMに「CSSバグ」としている方がいましたが、これは仕様です。
    CSS 2の仕様としてはあくまでも「Vertical margins may collapse between certain boxes:」です。実装する際にcollapseしてもよいというだけなので、必ずcollapseするわけではありません。しない実装系もありえるわけです。
    http://www.w3.org/TR/1998/REC-CSS2-19980512/box.html#collapsing-margins
    2.1のWDでもその点は変わっていません。
    http://www.w3.org/TR/2006/WD-CSS21-20061106/box.html#collapsing-margins

  2. iwaim
    Posted 2007/5/30 at 5:32 am | Permalink

    すばやい対応ありがとうございます。

One Trackback/Pingback

  1. [...] マージンの相殺について:CSS | Tech de Go (tags: css layout) [...]

Post a Comment

Your email is never published nor shared.