読者です 読者をやめる 読者になる 読者になる

ふろしき.js

Web + Mobile + UX + Performance Tech

XHTML1.0の場合、IE6からIE8〜10への移行時に表示が乱れることがある

XHTML1.0のDOCTYPE宣言にはいくつか種類があり、IE7以上では常に最新のレンダリングエンジンである「標準モード」として動作します。しかし、IE6は一部の宣言方法で一番古いレンダリングエンジンである「Quirksモード」として動作してしまいます。
(※参考 : The <?xml> prolog, strict mode, and XHTML in IE - IEBlog )

IEには古いレンダリングエンジンを再現させるドキュメントモードという機能が備わっており、「互換表示ボタン」「互換表示リスト」「ローカルネット互換表示」「X-UA-Compatible」などを通じてドキュメントモードを制御し、新しいバージョンへ移行させることが多いでしょう。しかし、これらの機能はDOCTYPEスイッチの切り替えアルゴリズムまでは再現してくれず、問題となるケースがあります。

具体的には、以下の通りです。

6 8〜10 DOCTYPE宣言
S S <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Q S <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
S S <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Q S <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
S S <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
Q S <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

IE6でテストされたWebシステムを開発していた際に、開発者が誤動作に気が付かず「Quirksモード」を前提に画面のレイアウトを作りこむと、IEのバージョンアップ時に挙動がおかしくなることがあります。

移行時の対策

誤動作によりXHTMLドキュメントをQuirksモードで動作させてしまっている場合、IE8以上ではX-UA-Compatibe以外からQuirksモードを再現させる方法はありません。このため、サーバ管理者はシステムを動作させているAP製品に対して、HTTP Response Headerへ以下のパラメータを応答させるよう設定が必要になります。

X-UA-Compatible: IE=5

より詳細な設定の方法については、以下のページを参照して下さい。

どういうケースが想定されるか?

この事象は、決してレアケースというわけではありません。

業務系で利用されるServer-side Scriptingの既定は、HTML5のような新しいWeb標準を利用する場合でも、XHTMLに沿って記述することが多いです。JavaのJSFもまさにそうでしょう。

DOCTYPE宣言は、XHTML1.0で宣言しても、HTML5の機能を利用することが可能です。IEも含め多くのWebブラウザは、XHTML1.0、HTML5、どちらの宣言を行っても、同じレンダリングエンジンが選択されるようにできています。HTML5は一部の廃止タグを除き、XHTML1.0と相互運用可能な言語仕様になっているため問題になりません。

f:id:furoshiki0223:20131205200136p:plain

Webブラウザ以外のソフトウェアからHTMLを読み込ませる場合、XMLパースが行える方が便利でしょう。この場合、XML宣言が行えるXHTML1.0のDOCTYPE宣言は、非常に有用なものとなります。XML宣言は本来任意ですが、無いと動作しなパーサものもあります。素直にHTML5のDOCTYPE宣言を行いたいところですが、XMLパーサの活用を考えると、今後もあえてXHTMLのDOCTYPE宣言を行うということは少なくないはずです。

IE6向けシステムは、JSPのような古い技術を利用していた場合は問題になりません。しかし、それこそJSFのような新しい技術を使って強引に動作させようとすると、何かしらの問題を作りこむ可能性を持ちます。IEのバージョンの世代と、サーバ技術の世代に開きが大きい場合は、注意して下さい。

広告を非表示にする