スキップしてメイン コンテンツに移動

【CSS】marginが親要素からはみ出して適用される?

スタイルシートでデザインを作り込んでいく時、思った通りに margin が効いてくれない事があります。


marginは 0px なはずなのに・・・

以下の例を見てください。
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
  <style type='text/css'><!--
body{
  background-color:#ffffff;
  margin: 0;
}
.div1{
  background-color:#ffff00;
  margin: 0px;
}
--></style>
</head>
<body>
  <div class='div1'>
    <h1>タイトル</h1>
    <p>テスト</p>
  </div>
</body>
</html>

<div>要素は背景色を黄色にしています。
<body>要素も<div>要素も margin0px に設定しているので、余白なく黄色い四角が表示されるように思いますが実際は隙間が空いてしまいます。



隙間の正体

この隙間は<h1>要素margin です。
<h1>要素の margin が親要素である <div>要素を超えて適用されています。
このような現象は <div>要素の padding と border が共に 0px の場合に起こります。

margin には接する要素の margin を相殺するという仕様があります。
相殺されるケースは以下のような場合です。

  • 親要素の margin-top と先頭の子要素の margin-top
  • 親要素の margin-bottom と 最後の子要素の margin-bottom
  • 同階層の最初の要素の margin-bottom と 次の要素の margin-top

相殺されると値の大きい方の margin だけが適用されます。



対処方法

親要素のスタイルシートに「overflow: hidden;」を追加します。
overflow はボックス内に要素が入らない場合の挙動を指定するものです。
hidden; ははみ出す部分は非表示にするという指定ですが、親要素の Width や Height が Auto (初期値) の場合はボックスサイズが変わるので問題ありません。
.div1{
  background-color:#ffff00;
  margin: 0px;
  overflow: hidden;
}



コメント