サイトロゴ等身大のWeb制作

HTML/CSS/Fabricjs

入れ子の、親子同士や上下間のmarginの相殺

ページイメージ

公開:2015-08-14

更新:

CSSのmarginで、入れ子(ネスト)にした子要素のmarginが親からはみ出る場合に、親子同士や上下間で相殺される様子を試し、そのソースコードと結果の図です。

ページ内目次

基本形

入れ子の親子や上下のmargin相殺

先ず入れ子にした要素を上下に配置します。親要素のborder・padding・heightはありません。

  • 親要素=parent=薄い色
  • 子要素=child=濃い色

現時点では各要素のmarginは0(ゼロ)としています。

背景のグリッドは灰色が25px、黒が50pxです。

<div id="boxA-parent">    //Ap
  <div id="boxA-child"">  //Ac
    <p>boxAp/Ac</p>
  </div>
</div>

<div id="boxB-parent">    //Bp
  <div id="boxB-child">   //Bc
    <p>boxBp/Bc</p>
  </div>
</div>
#boxA-parent	{
  background-color: pink;
  width: 150px;
  margin-bottom: 0;
}

#boxA-child	{
  background-color: red;
  width: 100px;
  height: 100px;
  margin-bottom: 0;
}

#boxB-parent	{
  background-color: lightblue;
  width: 150px;
  margin-top: 0;
}

#boxB-child	{
  background-color: blue;
  width: 100px;
  height: 100px;
  margin-top: 0;
}

上の要素だけに親子共にmargin

上の要素だけに、親子共それぞれにmarginを指定します。

図の矢印は、太い方が親要素、細い方が子要素のものです。

親要素のmargin大

#boxA-parent	{
  background-color: pink;
  width: 150px;
  margin-bottom: 100px;
}

#boxA-child	{
  background-color: red;
  width: 100px;
  height: 100px;
  margin-bottom: 50px;
}
親子のmargin相殺

子要素のmargin大

#boxA-parent	{
  background-color: pink;
  width: 150px;
  margin-bottom: 50px;
}

#boxA-child	{
  background-color: red;
  width: 100px;
  height: 100px;
  margin-bottom: 100px;
}
親子のmargin相殺

100 + 50 = 150px とはならずに親子どちらかの大きい方のみが適用されました。

下側要素(boxB)にかけた、上向きのmarginでも同様でした。

上下の親子全てにmargin

上下の親子全てにmarginを指定します。

#boxA-parent	{
  background-color: pink;
  width: 150px;
  margin-bottom: 100px;
}

#boxA-child	{
  background-color: red;
  width: 100px;
  height: 100px;
  margin-bottom: 50px;
}

#boxB-parent	{
  background-color: lightblue;
  width: 150px;
  margin-top: 25px;
}

#boxB-child	{
  background-color: blue;
  width: 100px;
  height: 100px;
  margin-top: 75px;
}
上下親子のmargin相殺

同様に各marginの値を変えてみるとこうなりました。

上下親子のmargin相殺 上下親子のmargin相殺

入れ子の、親子同士や上下間のmarginの相殺のまとめ

入れ子ではない場合と同様に

  • 上下の要素間のmarginが相殺される
  • 入れ子の子要素のmarginが親要素からはみ出る

となりました。いずれも全ての中で最も大きい値のみが適用されました。

ただしこれは親要素のborder・padding・heightいずれもない場合で、これらがあると違いが出てきます。それは別記事でご確認願います。

ちなみにpaddingの場合は相殺されません。