概要
マージン領域の上と下は
相殺される事があります。
- 隣接するマージンの相殺
- 親要素と先頭の子要素のマージンの相殺
- 親要素と末尾の子要素のマージンの相殺
- 空の要素のマージンの相殺
隣接するマージンの相殺
隣接兄弟要素の
マージンは相殺されます。
(後ろの兄弟要素が、
そこまでのフロートを
解除 (clear) する必要がある
場合を除きます。)
- <style>
- .cdvSample200 > *{ outline:1px solid; }
- </style>
- <div class="cdvSample200">
- <div style="margin:1em;">マージン1em;</div>
- <div style="margin:2em;">マージン2em;</div>
- </div>
上の要素(margin:1em;)の下マージンと下の要素(margin:2em;)の上マージンは隣接しているので、
マージンの相殺によってより大きい下の要素の上マージン 2em が採用されて表示されます。
1em;
2em;
方眼罫など背景や例示の為の領域の幅は、別途に装飾,指定しています。
(1em間隔の罫線を背景に設定しています。)
輪郭線 (outline) を用いて、境界線 (border) や内側の余白 (padding) など幅,高さに関わる物を出来るだけ避ける(初期値である)様に例示しています。
「隣接兄弟結合子」で対処
- <style>
- .cdvSample210 > *{ outline:1px solid; }
- .cdvSample210 .cdvClassA{ margin:1em; }
- .cdvSample210 .cdvClassB{ margin:2em; }
- .cdvSample210 .cdvClassA + .cdvClassB{ margin-top:3em; }
- </style>
- <div class="cdvSample210">
- <div class="cdvClassA">クラスA</div>
- <div class="cdvClassB">クラスB</div>
- <div class="cdvClassB">クラスB</div>
- </div>
隣接するマージンの相殺をしたくない場合は、「隣接兄弟結合子」を用いて改めて加算した値を指定する方法があります。
パティング領域で対処
- <style>
- .cdvSample220 .cdvClassA,
- .cdvSample220 .cdvClassB > *{ outline:1px solid; }
- .cdvSample220 .cdvClassB{ outline:1px dashed; }
- .cdvSample220 .cdvClassA{ margin:1em; }
- .cdvSample220 .cdvClassB{ margin:0 2em 2em 2em; padding-top:2em; }
- </style>
- <div class="cdvSample220">
- <div class="cdvClassA">クラスA</div>
- <div class="cdvClassB"><div>クラスB</div></div>
- <div class="cdvClassB"><div>クラスB</div></div>
- </div>
常に相殺をしないで個別に確保したいと感じる場合は、それは領域を意識しているという事でそれの包括要素を定義して内側の余白 (padding) を用いるのが意味からしても適切かと思います。
親要素と先頭の子要素のマージンの相殺
親要素と子要素の上輪郭線を
分けられる様な領域がない場合は、
親要素と子要素の
上マージンは相殺されます。
(親のborder-top, padding-top, 子に先行するインラインコンテンツ, フロートの解除 (clear) など)
親要素と末尾の子要素でも、top と bottom の違いだけで同じ様な相殺が起きます。
末尾の場合は高さも関わってきます。
- <style>
- .cdvSample300{ border:1px dashed; }
- .cdvSample300 > *{ outline:1px dashed; }
- .cdvSample300 > * > *{ outline:1px solid; }
- </style>
- <div class="cdvSample300">
- <div style="margin:1em;">
- <div style="margin:2em 1em;">子要素</div>親要素</div>
- </div>
親要素(margin:1em;)の上マージンと先頭の子要素(margin:2em;)の上マージンは
隔てる物がない(親要素の上側の境界(border-top),内側の余白(padding-top) のいずれもがない)ので、
マージンの相殺によってより大きい先頭の子要素の上マージン 2em が採用されて表示されます。
パティング領域で対処
- <style>
- .cdvSample300{ border:1px dashed; }
- .cdvSample300 > *{ outline:1px dashed; }
- .cdvSample300 > * > *{ outline:1px solid; }
- </style>
- <div class="cdvSample300">
- <div style="margin: 1em; padding-top:1px; ">
- <div style="margin: 2em 1em;">子要素</div>親要素</div>
- </div>
親要素と先頭の子要素のマージンの相殺をしたくない場合は、親要素の上側の境界(border-top),内側の余白(padding-top) のいずれかを指定する方法があります。
この方法は領域を確保するので、背景とか幅,高さの計算に注意が必要です。
(border-top:1px solid transparent;)
パティング領域で対処 隙間用要素の作成
- <style>
- .cdvSample320{ border:1px dashed; }
- .cdvSample320 > *{ outline:1px dashed; }
- .cdvSample320 > * > *{ outline:1px dashed; }
- .cdvSample320 > * > * > *{ outline:1px solid; }
- </style>
- <div class="cdvSample320">
- <div style=" margin:1em; ">
- <div style=" padding-top:2em; ">
- <div style=" margin: 0 1em 2em 1em;">孫要素</div></div>親要素</div>
- </div>
常に相殺をしないで個別に確保したいと感じる場合は、それは領域を意識しているという事でそれの包括要素を定義して内側の余白 (padding) を用いるのが意味からしても適切かと思います。
内包要素の違いで上パティングを調整したいが為に内包要素のマージンで代用している場合も、この様に調整用要素を用いた方がましかと思います。
疑似クラスで対処
- <style>
- .cdvSample330{ border:1px solid; }
- .cdvSample330 > *{ outline:1px dashed; width:10em; }
- .cdvSample330 > * > *{ outline:1px solid; width:6em; height:2em; }
- .cdvSample330 .cdvMarginA{ margin:1em; }
- .cdvSample330 .cdvMarginB{ margin:2em; }
- .cdvSample330 .cdvMarginA > .cdvMarginB:first-child{ margin-top:0; }
- </style>
- <div class="cdvSample330">
- <div class="cdvClassA">
- <div class="cdvClassB">子要素</div>
- 親要素
- <div class="cdvClassB">子要素</div>
- 親要素</div>
- </div>
先頭の子要素のマージンはなくても良いという考えなら、兄弟要素のグループの中で最初の要素を表す :first-child 疑似クラスを用いて改めて 0 を指定する方法があるかと。
7行目の .cdvClassB を * (全称セレクタ) に代えれば、cdvClassB に限らず cdvClassA の先頭の子要素であれば全てという指定に出来ます。
また、先頭の子要素と親要素の輪郭の距離は別に良いが、隣接の距離は加算したい場合は、margin-top:0; を望む値に代えればよいです。計算と条件の限定が面倒ですが。
空の要素のマージンの相殺
境界, 内側の余白, コンテンツの各領域が空の場合、(外側の)余白の上側と下側は相殺されます。
- <style>
- .cdvSample400{ border:1px dashed; }
- .cdvSample400 > *{ outline:1px solid; }
- </style>
- <div class="cdvSample400">
- <div style=" margin: 2em 1em 3em 1em; "></div>
- </div>
マージン以外のボーダー,パティング,コンテンツ領域のいづれも無いので、
マージンの相殺によってより大きい下マージン 3em が採用されて表示されます。