02

12月2009年

[CSS] IEのhasLayoutがtrueの時に垂直方向のmarginが相殺されない

sakai 20:22 PM

  • はてなブックマークに登録
  • livedoorクリップに登録
  • Yahoo!ブックマークに登録
  • deliciousに追加

イメージ

CSS のコーディングをしていると、IE6 や IE7 で垂直方向の margin が相殺されない現象が頻発するので、ちゃんと原因を確かめました。

以下、サンプルです。

XHTML のコード

<div>
<p>テスト</p>
</div>

<div>
<p>テスト</p>
</div>

CSS のコード

div {
	width: 100px;
	margin: 0 0 50px;
	background-color: #000;
}
p {
	margin: 0 0 50px;
	background-color: #EEE;
}

各ブラウザでの表示

「div」と「div で囲まれた p」それぞれの下方向に 50px の margin を適用すると、通常は同じ方向の margin が相殺されて下方向の空きは 50px となるはずですが、IE6 と IE7 では margin が相殺されず 100px 分の空きができてしまいます。

原因を検証したところ、どうも hasLayout の値が true の時は margin が相殺されないようです。
上のサンプルでいくと div に width を指定していることで div の hasLayout が true になり、margin が相殺されないというわけでした。

※hasLayout についてはこちらが詳しいです。
  →hasLayoutとは何か:ウノウラボ

とりあえず margin を正常に相殺させるための回避策としては以下が考えられます。

  • width を指定しない!
    →垂直方向に margin を指定するオブジェクトについては width を指定しない(hasLayout の値を false にしておく)というのが現時点では最も妥当な気がします。
  • display:inline; を指定!
    →サンプルでいくと p に display:inline; を指定することで p の上下 margin が無視されます。ただし、div の中に複数の要素があるような場合はこの方法は無理。
  • IE6,7 用ハックで!
    →ハックを使い、IE6 と IE7 だけ div の下 margin を 0 にしちゃうのもひとつの手です。

バシャログスタッフによるWebサイト制作サービス

トラックバック

このエントリーのトラックバックURL
http://c-brains.jp/cgi-bin/mt/###/2076
###はmt-tb.cgiに変更してください。

コメントを投稿

ページの先頭へ

POPULAR TAGS
  • バシャログスタッフによるWebサイト制作サービス

ARCHIVE

RECENT COMMENTS

Neennates on [使えるCSSテクニックVol.2] CSS を使った見栄えの良いページャー
You could easily be making mon
toyama on 【Fireworks】あなたのワークスペース、どんなレイアウト?
> maki さん コメントありがとうございます。 レイヤー
maki on 【Fireworks】あなたのワークスペース、どんなレイアウト?
初期設定のまま、パネル1列で作業してました。。 今までレイヤ
tomo on [使える CSS テクニック] CSSで実現するプルダウンメニュー
sakai様 早速ご返答ありがとうございます。 子供がho
sakai on [使える CSS テクニック] CSSで実現するプルダウンメニュー
>RodMond さん コメントありがとうございます。 自