【CSS】 上下のマージンは互いに相殺されるようだ。

要素の上と下にマージンをつけて、それを連続で配置すると、相殺されて大きい方のマージンが採用される。

<p>文字列第1段落。</p>
<p>文字列第2段落。</p>
<p>文字列第3段落。</p>

例えばこのHTMLコードで、<p>タグに上に1em、下に1.5emのマージンを設定したとすると、<p>タグと<p>タグの間にあく隙間は、 1+1.5=2.5em にはならず、大きい方の 1.5em となる。

Firebug で調査してみた図が下記。

マージンの相殺の様子を調査した図

Firebug を使ったことがある人はご存知と思うが、黄色い帯がマージンで、青い帯が、要素の実体が存在している領域を示している。

上段の margin-bottom と中段の margin-top が相殺され、多い方の分だけ間が開いていることがわかる。

この相殺のルールについて、いくつか調査してみたい。

まず、中段の<p>を、次のようにブロック要素(ここでは<div>タグ)で囲ってみた。

<p>文字列第1段落。</p>
<div>
    <p>文字列第2段落。</p>
</div>
<p>文字列第3段落。</p>

この時点では、とりあえず表示は変わらないようだ。Firebug で<div>を調べてみると次のような感じ。

中段をブロック要素で囲んでみた図

青い帯が<div>タグの表示なわけだが、<div>タグそのものにマージンはついていないにもかかわらず、下側にあいているマージンは 1.5em のままだ。つまり、中に含まれているはずの<p>タグにかかったマージンが、<div>タグを跨いで有効になっているという状態。

<p>タグに設定されたマージンが、<div>タグを跨げなくなる条件を調べてみると、次のようになった。(ただし、○は「跨げる」を、×は「跨げない」を示す。「跨げない」場合は、1+1.5=2.5em の間隔があくようになる。)

スタイル モダン IE6 IE7
padding:0px
padding:1px × × ×
margin:0px
margin:1px
border:0px
border:1px solid #000000 × × ×
clear:both
float:left × × ×
display:inline-block × × ×
display:table × --- ---
zoom:100% --- × ×
overflow:hidden × ×
overflow:auto × ×
background-color:red

注意したいのは、親要素となる <div>タグ にマージンを設定した場合。子要素のマージンと共に相殺される。<div>タグに margin:1em を設定したら、次のようになる。

親要素のマージンも相殺されるの図

左から2番目が<div>タグ、3番目が中段の<p>タグの様子だ。

今回のテストでブラウザ依存が確認されたのは、displayzoomoverflow の3つのCSSプロパティ。displayzoom はそもそも非対応だったりとかするので当然だが。

  • ※モダンブラウザは、Firefox3.0.6、Opera9.63、Safari3.2.1 (それぞれWindowsXPのみ) を使用して調査。
  • ※XHTML1.1(標準モード)でレンダリングした。

トラックバック (1件)

2009年2月10日(Tue) 21時31分54秒 【CSS×IE】 <hr>タグはブロック要素じゃないのかな?

昨日の記事 【CSS】 上下のマージンは互いに相殺されるようだ。 の続き。
IE(6も7も)で<hr>タグの上下にマージンを設定してみても、なぜか相殺されないようだ。
ためしに <hr>タグに display:block; をかけてみると相殺されるようになるので、もしかしたら IE は <hr>タグ...

( PXT255; - 日記? - 記事を開く)



プロフィール

コヤナギ トモヤ

まったりウェブ系コーダーしてます。PHP製静的CMS Pickles 2 を開発しています。

RSSフィード

  • このサイトは、 コヤナギ トモヤ の個人サイトです。
  • 個人的な主張や、活動の記録などを掲載しています。 所属する企業、団体、その他の意見や立場を代表するものではありません。
  • 掲載された内容は古くなっている可能性があります。 特に古い記事では、現在の筆者の考えと異なる主張をしていることがありますが、記録としてそのまま残しております。 予めご了承ください。
ページの先頭へ戻る