マージンの相殺について

ブロックレベル要素の上下マージンに起こる「マージン相殺」現象について。

display: inline-block;
float

なお、上記などがかかってる場合では起きない。

<div class="box">
<div class="box">


.box {
 margin: 20px

上記の場合縦に並んだBOXの隙間は20px+20pxにはならず、20pxになる。 

<div class="box1">
<div class="box2">


.box1 {
 margin: 20px
 
.box2 {
 margin: 30px

上記のようにすると、大きい方のマージン要素が適用され、BOXの隙間は30pxとなる。

入れ子になったマージンの相殺

入れ子になった要素の上下マージンも相殺される。親となる要素のmargin-topと先頭の子要素のmargin-topは相殺され、子の要素のmargin-topは親要素の外側に突き抜けます。                       この相殺は親要素のmargin-topが0の場合にも起こります。margin-bottomも同様。

<div class="parent">
  <div class="child"></div>
</div>
 

.parent {
 background-color: yellow;
 width: 200px;
 height: 100px;

.child {
 background-color: pink;
 width: 50%;
 height: 50px;
 margin-top: 20px ; /ここは反映されない
}

ただし、親要素と子要素のマージンを分けられるようなborderやpadding、インラインコンテンツが存在する場合には相殺されない。

.parent {
 border: 1px dashed black;

上記を親要素に入れてれば、子要素のmargin-topは働く。

解決策はいろいろありますが、

1親要素にpadding-topを指定する
2子要素にmargin-topを指定する
3親または子にインラインコンテンツを指定する
4親または子にinline-blockを指定する

などが挙げられる。

ただし子要素にmargin-topを設定する場合は、マージンの相殺によって子要素が親要素の上に突き出てしまい、レイアウトに謎の空白が現れることがある。その為、親要素と最初の子要素の間に余白を撮りたい場合には、親要素にpaddingを指定することで回避できる為、1.2を選択するのであれば1の一択になる。


この記事が気に入ったらサポートをしてみませんか?