IE と Firefox でボックスの幅が異なってしまうという問題の原因と解決策

問題

Web サイトを作っている時に Firefox と IE を使って表示確認をすると、何故か Firefox のボックスの幅のほうが IE よりも大きくなってしまっていた、という問題に直面した方は多いのではないでしょうか? 今回はこの問題を扱います。

具体的には、下図のようなものです。 同じページを表示しているのですが、Firefox と IE ではボックスの幅が違っています。

[Firefox 3 での表示サンプル]
Firefox 3 での表示サンプル - 「標準モード」 でレンダリング
[IE8 での表示サンプル]
IE 8 での表示サンプル - 「互換モード」 でレンダリング

原因

上の例のように Firefox と IE でボックスのサイズが異なるのは、Firefox は 「標準モード」 でレンダリングし、IE は 「互換モード」 でレンダリングしているのが原因です。

上の例では、あるボックスに CSS の width プロパティとして 300px を指定し、また幅 40px の border も付けています。 Firefox の表示を見ると、border を含めない中身の幅が 300px になっている一方、IE では border を含めた幅が 300px となっています。 どちらの表示が正しいのかというと、Firefox の表示の方が正しい表示です。

IE が正しくない表示をしているのは、上で述べた 「互換モード」 でレンダリングしているためです。 「互換モード」 というのは、古いブラウザ (IE 5 以前) でのレンダリングと互換性を保つためのモードで、IE に限らず最近のブラウザの多くは、「標準モード」 と 「互換モード」 という 2 つ (もしくはそれ以上) のレンダリングモードを持っています。 「互換モード」 でレンダリングするか 「標準モード」 でレンダリングするかは、ブラウザが各ページのソースコードを見て自動的に判断します。

解決策

今回の例では、IE に 「互換モード」 でレンダリングするように判断されてしまったためこのような問題が起きました。 これを解決するには、IE でも 「標準モード」 でレンダリングされるようにソースコードを変更すればオーケーです。

具体的には、DOCTYPE 宣言を書き換えます。 (または書いていないのであれば書き加える。) 各ブラウザは、「標準モード」 でレンダリングするか 「互換モード」 でレンダリングするかを、そのページの DOCTYPE 宣言を見て判断します。 例えば、DOCTYPE 宣言がないページであれば Firefox でも IE でも 「互換モード」 でレンダリングされます。 また基本的には、正しく DOCTYPE 宣言をしているページであれば 「標準モード」 でレンダリングされます。

ただし、それぞれのブラウザによって 「互換モード」 にするか 「標準モード」 にするかの判断基準はバラバラで、場合によっては今回の例のように Firefox では 「標準モード」、IE では 「互換モード」 となってしまう場合もあります。

そうなってしまわないように、下記に挙げる Firefox でも IE でも 「標準モード」 になる DOCTYPE 宣言の書き方をしてください。

IE でも Firefox でも 「標準モード」 になる DOCTYPE 宣言
(X)HTML のバージョン DOCTYPE 宣言の書き方 備考
HTML 4.01 Strict <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> システム識別子は無くても良い
HTML 4.01 Transitional <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> システム識別子無しだと IE で 「互換モード」 になってしまう
XHTML 1.0 Strict <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> XML 宣言を書くと IE 6 で 「互換モード」 になる
XHTML 1.0 Transitional <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> XML 宣言を書くと IE 6 で 「互換モード」 になる

今回の例では、HTML 4.01 Transitional で書いていたのですが、DOCTYPE 宣言にシステム識別子を書いていなかったため IE で 「互換モード」 になっていたのでした。 表に書いてあるとおりに DOCTYPE 宣言を書き直すと、IE でも Firefox と同じように表示されるようになりました。

[IE8 での表示サンプル]
IE 8 での表示サンプル - 「標準モード」 でレンダリング

備考

参考文献

参考になるページを挙げておきます。 このページでは簡単な説明しかしていませんが、より詳しく知りたい方は下記参照ください。