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

ふろしき.js

Web + Mobile + UX + Performance Tech

IEの持つ互換性機能の全て - DOCTYPEスイッチ/X-UA-Compatible/互換表示

IE 互換性対策 SI向け

IEはかつて、独自の機能実装により安定かつ高度な機能を持ったプラットフォームを実現しました。特に、IE6のポテンシャルの高さは、Web技術発展へ大きく貢献しています。

しかし同時に、他のブラウザとは異なる独立した挙動をしたり、バージョンごとに機能面に開きがあるなど、相互運用性の面に大きな課題を作ってしまいました。多くの企業は、IEの特定のバージョンへ強く依存した既存資産と、IEのアップグレード方法に頭を悩ませているでしょう。

Microsoftはこの問題に対応するため、IEは過去のバージョン向けに開発されたWebコンテンツを動作させるための仕組みを持っています。これを「ドキュメントモード」といいます。

本記事では、IEの持つドキュメントモードを利用した互換性の考え方について解説します。IEのアップグレード時に、移行方法の指針、手段の発見に活用して頂ければ幸いです。

★ 目次

  1. DOCTYPEスイッチ・・・開発者向け
  2. X-UA-Compatible・・・開発者向け
  3. 互換表示モード・・・IT管理者/ユーザ向け
  4. ドキュメントモードでは解決されない問題・・・開発者向け

★ 注意事項

ドキュメントモードは、IE11より非推奨となりました。このため、本対策が活用できるのは事実上Win7版IE10までとなり、Win7のEOLである2020年1月14日に正式なサポートは終了となります。Win8以上のOSへアップグレードするまでに、全Webシステムをドキュメントモード依存やIE8特化しない状態に改善することが求められています。
(※参考 : ドキュメント モードの非推奨 - Microsoft )
(※参考 : ドキュメントモードに依存しない開発方法について - ふろしき.js )

1. DOCTYPEスイッチ

「DOCTYPEスイッチ」とは、HTMLドキュメントの一番初めに「DOCTYPE宣言」というHTMLフォーマットを意味する特殊な文字列を記述することで、Webブラウザの動作をQuirksモードとStandardモードのどちらかの状態へスイッチさせる手法です。開発者が、IEのドキュメントモードを制御するために利用できます。

Quirksモードとは、主にHTML3.2以前のWebコンテンツに対して、IE5の古いレンダリングエンジンを提供する機能です。IE6〜10では標準的に提供されていますが、IE11ではドキュメントモードの非推奨化に伴い、限定的な手段により提供されています。

対してStandardモードは、最新のレンダリングエンジンにより動作をさせる機能です。

以下は、IEの各バージョン別のDOCTYPEスイッチの動作一覧です。全体を通しての考え方や注意点は、後述する5つのポイントを確認して下さい。

★ a. IE6〜10は、HTML3.2以前はQuirks、HTML4.01以降はStandardと解釈

IE6〜10ではDOCTYPE宣言の解釈は、基本的にHTML4.01を起点にしてスイッチされます。HTML4.01については、以前のバージョンのHTMLの仕様を許すDOCTYPEもあるため、その扱いは非常に煩雑です。

HTML4.01のDOCTYPE宣言において、おさえるべきポイントは以下の通りです。

1. Transitionalと明示した3.2と4.01の混在を意味する定義は、Quirksモード
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

2. Framesetと明示した3.2と4.01の混在を意味する定義は、Quirksモード
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">

3. Transitional/Framesetの指定が無いStrictと呼ばれる定義は、Standardモード
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

4. 4.01のDTDを明示的に指定した場合は、上記の条件に関係なく常にStandardモード
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

現在は、IE6~11で最新のドキュメントモードが選択される、HTML5のDOCTYPEが推奨されています。

★ b. IE11ではQuirksモードへスイッチできない

IE11からは、ドキュメントモードが非推奨になったため、DOCTYPEスイッチによってQuirksモードへのスイッチが行えません。
(※参考 : ドキュメント モードの非推奨 - Microsoft )

Quirksモードで動作させるには、IEの利用者/IT管理者による対策が必要です。以下の方法で解決が可能ですが、IE12以降でもこの方法が永続的に利用できることは保証されていません。Microsoftではこのような対策を必要とするWebコンテンツは、改修を推奨しています。

>> IE11ではDOCTYPE宣言がチェックされない、どうすれば解決できるか?

★ c. IE6のXHTML1.0のDOCTYPEの解釈に問題がある

IE6のXHTML1.0のDOCTYPE宣言は解釈に問題があり、IE6とIE7以上とでは、Quirksモードに切り替わるためのルールが異なります。具体的には、以下の文字列が宣言されている場合、IE6ではQuirksモードで、IE7〜10ではStandardモードとして動作します。

<?xml version="1.0" encoding="utf-8"?>

以下のページにて、この問題に対する解決策を説明しています。
>> XHTML1.0の場合、IE6からIE8〜10への移行時に表示が乱れることがある

★ d. IE10ではQuirksモードがIE5の動作にならない

IE10から、QuirksモードがIE5と互換性が無くなっています。ただし、IE5と互換性のあるドキュメントモードは内部的に「IE5 quirksモード」として残されています。

このドキュメントモードを利用したい場合、以下のページを参考に解決方法を探ってみて下さい。

>> IE6〜9とIE10とでQuirksモードの動作が違う、どうすれば解決できるか?

★ e. RFC2070のDOCTYPEは正常に解釈されない

RFC2070には、HTML2.0を意味するDOCTYPE宣言があります。
(※参考 : Internationalization of the Hypertext Markup Language )

しかしこれは、IEでの解釈に問題があり正常に動作しません。具体的には、以下のDOCTYPE宣言は、歴史的に見るとIE6〜10ではQuirksモードとして動作すべきですが、実態としてStandardモードと解釈されてしまいます。

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML i18n//EN">

この問題を抱えたWebコンテンツを「Quirksモード」で動作させるには、次章の「X-UA-Compatible」による対策を検討して下さい。

2. X-UA-Compatible

IEは内部的に、IE5以降のレンダリングエンジンを再現させるための機能を持っています。これを制御するには、「X-UA-Compatible」を利用します。

以下は、IEの各バージョン別のX-UA-Compatibleの使い方/動作仕様です。動作の違いなどおさえるべき点は、後述する5つのポイントを確認して下さい。

★ a. IE6互換のドキュメントモードは無い

IE5以降のレンダリングエンジンを揃えているIEですが、歴史的経緯によりIE6の互換モードだけは提供できていません。多くの企業システムでは、移行時にIE6コンテンツをIE7互換モードで代替し動作させているようです。

★ b. IE10にはQuirksモードが2種類ある

IE6/7/8/9と、QuirksモードはIE5の機能性を維持してきました。しかしIE10からは、QuirksモードがHTML5との相互運用の観点から完全な互換性を持たないことを、Microsoftとして公式に発表しています。

ただし、IE10にはQuirksモードが2種類あり、新たに追加した「IE5 quirksモード」がIE5との互換性を持ちます。

単純なDOCTYPEスイッチでは、無印の「Quirksモード」が選択されます。対して、ドキュメントモードにより直接「IE5」の指定を行った場合は「IE5 quirksモード」が選択されます。

詳しくは、以下のページを参照して下さい。

>> IE6〜9とIE10とでQuirksモードの動作が違う、どうすれば解決できるか?

★ c. X-UA-Compatibleの指定は全てにおいて優先される

ドキュメントモードを制御する方法としては、「互換表示ボタン/互換表示リスト」「DOCTYPEスイッチ」などがありますが、X-UA-Compatibleは全てにおいて最優先の制御を握ります。IE=EmulateIEが利用された場合も、互換表示の影響を受けません。

この特性を活かし、企業システムでは、互換表示機能により全体的に保護されたイントラネット内で、一部のシステムにのみ異なるドキュメントモードを適用する場合に利用されます。

★ d. IE11のIE=EmulateIE10には不具合特殊な動作がある

(※ 2013.11.27 - 不具合でなく仕様でした。)

IE11のX-UA-Compatibleへ「IE=EmulateIE10」を指定した場合、DOCTYPEスイッチが正常に動作しないという不具合がありますDOCTYPEスイッチの動作にはユーザには見えない仕様が含まれています。詳しくは、以下のページを参照して下さい。

>> IE11のEmulateIE10(X-UA-Compatible)でDOCTYPEスイッチに不具合がある(仕様でした)
>> IE11を裏ワザ的なやり方でDOCTYPEスイッチを有効化する方法

★ e. IE8とIE9以上の間ではIE=(数字)の判定式が違う

IE8とIE9とでは、X-UA-Compatibleの値の扱い方、そのルールが異なります。

この動作の違いは、互換表示リスト/互換表示ボタンの有効化に影響を与えます。将来に渡り有効になることを想定して、パラメータへ「IE=100」などの大きな値を設定した場合、IE9/10/11では問題にならないが、IE8では誤動作を起こすというケースがあります。

マルチバージョン対応が求められ、X-UA-Compatibleの振る舞いに厳密な限界値テストを必要とする場合、8と9以上とで分類してテストすることが推奨されます。

3. 互換表示モード

「互換表示モード」とは、Internet Explorerへの設定を利用して、IE5/IE7のドキュメントモードで動作させるための方法です。IT管理者/ユーザが、IEのドキュメントモードを制御するために利用できます。

IE11ではドキュメントモードは非推奨ですが、互換表示の機能は残っています。ただし、Microsoftはドキュメントモードは非推奨としており、互換表示機能も永続的にサポートされないことが予想されます。

互換表表示機能の利用方法としては、以下3つが挙げられます。

IE8〜10では、利用者側で互換表示を制御する「互換表示ボタン」が提供されています。

IE8〜11では、利用者側で互換表示を制御する「互換表示一覧(リスト)」が提供されています。

IE8〜11では、IT管理者向けに「ローカルイントラネット互換表示」が提供されています。

★ a. 互換表示リストはドキュメントモードのバージョンを選択できない

互換表示リストで定義できるのは、IE8の場合はQuirksか最新のドキュメントモードか、IE9/10/11ではIE7か最新のドキュメントモードかの、2種類のみから選択されます。バージョンの指定までは、互換表示リストからは制御できません。

Microsoftが提供している互換リストはドキュメントモードの指定が行えるため、ここへ直接書き込むというハックもあります。しかし、定期更新の際に上書きされるため、有用な手段とは言えません。Microsoftはこのような利用シーンでは、X-UA-Compatibleの利用を推奨しています。

★ b. IE10はQuirksが有効かつ互換表示が有効の場合、IE5 quirksモードで動作する

IE10にはQuirksモードが2種類あり、デフォルトのDOCTYPEスイッチで動作するQuirksモードはIE5との互換性を失っています。しかし、互換表示が有効の状態でQuirksモードが選択された場合、「IE5 quirksモード」というIE5と互換性があるQuirksモードが選択されます。

★ c. ローカルイントラネット互換表示が有効時は、互換表示ボタンが表示されない

ローカルイントラネット互換表示の適用範囲では、互換表示ボタンが表示されません。これを利用すれば、システム利用者の誤操作によるトラブルを避けることができます。

4. ドキュメントモードでは解決されない問題

★ a. 不具合とCSSデフォルト値までは再現されない

IEが持っている不具合やCSSデフォルト値までは、再現することができません。問題になりやすいものについては、以下のような対策がユーザによって考案されています。

★ b. OSのAPI依存の動作までは再現されない

IEは、他のWebブラウザとは異なり、WindowsOSのAPIを極力利用する方針です。このため、同一のWindowsブランドであっても、バージョンごとに差異が生じることがあります。

IEの互換系機能を利用して以降を行う場合、テストの目安として、OSレイヤーでの仕様の差異を意識して下さい。

詳細は、以下のページを参考にして下さい。

>> 相互運用性対策は「ブラウザ/デバイス検出」から「機能/動作検出」へ

★ c. ドキュメントモードの動作が完全ではない

ここで紹介した3種類の互換性対策用機能は、全てIEの内部で持つドキュメントモードを利用しています。IEはバージョンアップを繰り返す都度、過去のIEのレンダリングエンジンを揃えてきましたが、筆者の検証環境の結果では、全く同じバイナリの状態を維持していないように見えます。テストの不足から、バージョン間でその機能性に微妙な差異が生じています。

OSレイヤーと切り離した場合も、機能が同じであることを前提にせず、テストを行う必要があります。

広告を非表示にする