IE8でtransitionalなページでposition:fixedを使う

前回エントリの書き直し。


IE8では、position:fixedがサポートされている。ただし、これが作用するのはstrictモードのときだけで、transitionalモードのときはposition:fixedが有効にならない。とはいえ、最初からtransitionalで書かれたページ(あるいはサイト)をイチからstrictに書き直すのは大変な労力がかかり、現実的でない。

しかし、IE8でtransitionalで書かれたページでもfixedを使う裏ワザ的な方法がある。


まず、strictモードでしかfixedは有効にならない、と明記されているのだから、素直にstrictを宣言する。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">

ところが、そうするとレンダリングが崩れてしまうため、以下のmetaタグを追加する。

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />

このタグは、strictに書かれたページをlooseに解釈してレンダリングするようIEに示唆する。実際はもともとtransitionalで書かれたlooseなページなので、なんの問題もなくレンダリングされる。そしてなおかつstrictディレクティブを宣言しているので、fixedも使えてしまう。

しかし、このままだと他のブラウザで異常が出てしまうので、下記のようにDOCTYPE宣言を2つ続けて書いてみる。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">

こうすると、IE8ではstrict宣言だけが有効になり、他のブラウザではtransitional宣言だけが有効になる。その結果、IE8でも他のブラウザでもエラーが出ないしレンダリングも崩れない。どのブラウザで見てもfixedが有効になるので、うれしい。