この記事に含まれるモードスイッチングは、Firefoxおよびその他のGeckoベースのブラウザー、Safari、Chrome、その他のWebKitベースのブラウザー、Opera、Konqueror、Mac用のインターネットエクスプローラー、Windows用インターネットエクスプローラー、IEが組み込まれたブラウザに適しています。ブラウザエンジンの名前に言及しないでください。代わりに、エンジンの最もよく知られているブラウザの名前を使用してください。
この記事では、各パターンの正確な動作を記録するのではなく、パターンの選択メカニズムに焦点を当てています。
さまざまなモードがあります。
テキスト/HTMLコンテンツのパターン選択は、Doctypeスニッフィングに依存します(Doctype Sniffing、この記事で後述する)。 IE8では、パターンは他の要因にも依存します。ただし、デフォルトではIE8では、Microsoftのブラックリストに提供されていない非型トラネットサイトのパターンは、ドキュメントタイプに依存します。
この記事で統一された議論があったとしても、各ブラウザのパターンの正確な動作の違いを強調することは誇張ではありません。
Firefox、Safari、Chrome、およびOperaでは、Application/XHTML+XML HTTPコンテンツタイプ(Meta ElementまたはDoctypeではありません!)がXMLパターンをトリガーします。 XMLパターンでは、ブラウザはXMLドキュメントに、ブラウザにある範囲で正しい仕様を提供しようとします。
IE6、7、および8は、アプリケーション/XHTML+XMLをサポートしていません。MACIE5も同様です。
WebKitベースのNokia S60ブラウザーでは、アプリケーション/XHTML+XML HTTPコンテンツタイプは、モバイル壁の庭園の焦点が不規則なコンテンツとの互換性であるため、XMLスキーマをトリガーできません。 (標準以外のコンテンツがXMLとマークされているため、古いスタイルのモバイルブラウザーは実際のXMLパーサーを使用できません。)
Konquerorは完全にテストされていないため、このブラウザで何が起こるかを正確に言うことはできません。
一部のエンジンがWebコンテンツとは何の関係もないパターン。完全性のために、それらはここでのみ言及されています。オペラにはWML2.0モードがあります。 LeopardのWebKitには、レガシーダッシュボードウィジェットの特定のモードがあります。
これらのパターンの主な効果は次のとおりです。
テキスト/HTMLパターンは、主にCSSレイアウトに影響します。たとえば、テーブルがスタイルを継承しないための癖です。一部のブラウザのQuirkモードでは、ボックスモデルがIE5.5のボックスモデルになります。このドキュメントには、すべてのレイアウトの癖がリストされていません。
準標準モード(このモードのブラウザで)、画像を含むテーブルセルのみが高いモードと標準モードが異なります。
XMLスキーマでは、セレクターは異なるケースに敏感な動作を持っています。さらに、HTMLボディ要素の一意のルールは、最新のCSS2.1の変更を実装していない古いブラウザーに適用することはできません。
HTMLおよびCSSの解析に影響を与えるいくつかの癖もあり、標準を満たすWebページを誤って解析することができます。癖のレイアウトにより、これらの癖がオンになっているかどうかが決まります。いずれにせよ、CSSレイアウトと解析(非HTML解析)における癖パターンと標準パターンの主な類似点と違いを理解することが非常に重要です。
一部の人々は、標準モードの厳密な解析モードを誤って呼び出します。これにより、人々はブラウザのHTML構文規則とブラウザのタグの正確性の評価を誤解させます。そうではありません。標準モードのレイアウトが有効になった場合でも、ブラウザは引き続きタグスープ(タグスープ、http://en.wikipedia.org/wiki/tag_soup)の修正作業を行います。 (Netscape6が2000年にリリースされる前に、MozillaはHTML構文ルールを実施するための解析パターンを持っていました。これらのパターンは、既存のWebコンテンツと互換性がないことを放棄しました。)
もう1つの一般的な誤解は、XHTML解析に関するものです。通常、XHTML Doctypeを使用してさまざまな区画が得られると考えられています。実際、そうではありません。コンテンツタイプは、テキスト/HTMLのXHTMLドキュメントで使用されているパーサーおよびHTMLドキュメントと同じです。ブラウザが現在気にしているのは、ドキュメントタイプテキスト/HTMLを備えたXHTMLが、クラウトのタグスープであることです(どこでも余分なスラッシュ)。
XMLドキュメントタイプのドキュメント(例:Application/XHTML+XMLまたはXMAPPLICATION/)が使用される場合にのみ、パーサーは解析のXMLスキーマをトリガーします。現時点でのパーサーは、HTMLパーサーとはまったく異なります。
癖のパターンは主にCSSに関するものですが、一部はスクリプトに関するものです。たとえば、FirefoxのQuirkパターンでは、HTML ID属性は、IEのようにグローバルスクリプトスコープへのオブジェクト参照を確立します。 IE8でのスクリプトの影響は、他のブラウザよりも注目に値します。
XMLスキーマでは、XMLのDOM API動作が定義されたときにHTML動作と互換性がないため、一部のDOM APIは完全に異なって動作します。
最新のブラウザは、Doctypeスニッフィングを使用して、テキスト/HTMLドキュメントのエンジンモードを決定します。つまり、スキーマの選択は、HTMLドキュメントから始まるドキュメントタイプ宣言(または欠落)に基づいていることを意味します。 (これは、XMLドキュメントタイプを使用したドキュメントには適していません。)
ドキュメントタイプ宣言(Doctype)は、SGMLの構文偽造です。 SGMLは、古いスタイルのマークアップフレームワークです。 HTML5がそれに基づいて定義される前のHTML。 HTML4.01仕様では、ドキュメントタイプの宣言では、HTMLのバージョン情報について説明します。名前はドキュメントタイプの宣言であり、HTML 4.01仕様はバージョン情報を説明していますが、ドキュメントタイプの宣言は、たとえ(名前のため)に見える場合でも、特定の種類のドキュメントとしてSGMLまたはXMLドキュメントを分類するために適用されません。 (その他のコンテンツは付録にあります)
HTML4.01仕様もISO 8879(SGML)も、ドキュメントタイプの宣言をエンジンモード変換として使用することについて何も述べていません。 Doctypeスニッフィングは観察に基づいています。 Doctypeスニッフィングが設計されている場合、ほとんどの癖にはドキュメントタイプの宣言や古いDTDへの参照がありません。 HTML5はこの事実を受け入れ、Doctypeをテキスト/HTMLの唯一のモード変換として定義します。
典型的なPre-HTML5(Pre-HTML5)ドキュメントタイプの宣言には、Blanksで区切られています)<!Doctype文字列、ルート要素(HTML)の共通識別子、パブリック文字列、引用符のDTD共通識別子、可能なシステム識別子(URL)、および同じDTDのキャラクターが含まれます。ドキュメントタイプの宣言は、ドキュメントのルート要素がラベルを開始する前です。
新しいテキスト/HTMLドキュメントを作成する際にDoctypeを選択する方法の簡単なガイドを次に示します。
XHTMLはテキスト/HTMLとして使用することに有害であると考えられているため、XHTML Doctypeをお勧めしません。とにかく、XHTML Doctypeを使用することを選択した場合、XML宣言によりIE6(IE7ではない!)が癖パターンをトリガーすることに注意してください。
アプリケーション/XHTML+XMLの簡単なガイドは、Doctypeを使用することはありません。この方法に基づくWebページは、Xhmtl1.0と厳密に一致していませんが、これは問題ではありません。 (以下の付録をご覧ください)
IE8は、Doctypeに加えて、パターン選択の要因の1つとして、IE8がメタエレメントベースのパターン変換を使用することを導入した一度に別です。 (Ian Hickson、David Baron、David Baron、Robert O'Callahan、Maciej Stachowiakによるレビューを参照してください。)
IE8:IE5.5 Quirkモード、IE7標準モード、IE8 QUAL標準モード、IE8標準モードには4つのモードがあります。モードの選択は、Doctype、Meta Elements、HTTPヘッダー、Microsoftからの定期的なダウンロードデータ、LANドメインからの定期的なダウンロード、ユーザーが作成した設定、LAN管理者が作成した設定、親フレームワークのモード(もしあれば)およびアドレスバー互換ビューボタンがユーザーがトリガーしたもののデータに依存します。 (エンジンに埋め込まれた他のアプリケーションの場合、パターンは埋め込みアプリケーションにも依存します。)
幸いなことに、IE8は通常、以下が発生した場合、他のブラウザのようにDoctypeスニッフィングを使用します。
X-UA互換性に関する2つのケースを除き、IE8はIE7のようにDoctypeスニッフィングを実行します。 IE7エミュレーション(IE7エミュレーション)は、互換ビューと呼ばれます。
X-UA互換の場合、IE8は他のブラウザーとは完全に異なって動作します。このページのPDF形式とPNG形式の付録またはフローチャートをご覧ください。
残念ながら、X-UA互換性のHTTPヘッダーまたはメタタグはありません。また、適切なDoctypeを使用すると、IE8を使用すると、ユーザーはIE8の標準モードからIE7モードであるIE7標準モードであるIE7モードに誤ってページを減らすことができます。さらに悪いことに、LAN管理者は同じことができます。 Microsoftは、使用するすべてのドメイン名をブラックリストに登録することもできます。
これらの効果に対処するには、Doctypeだけでは不十分な場合、X-UA互換のHTTPヘッダーとメタタグが必要です。
次の簡単なガイドは、X-UA互換のHTTPヘッダーまたはメタタグを選択する方法のための他のブラウザのDoctypeトリガー標準モードまたは準標準モードを既に備えた新しいテキスト/HTMLドキュメント用です。
DoctypeのスニッフィングをXMLに持ち込まないでください。
Doctype Sniffingは、チャウダースープのような方法を使用して、チャウダースープのラベル付けの問題を解決することです。 Doctype Sniffingは、HTML4およびCSS2仕様のリリース後に設計された暫定的なアプローチであり、著者が期待する行動に合わせて時代遅れのドキュメントをドキュメントと区別します。
DoctypeスニッフィングをXMLで使用して、さまざまな処理をスケジュールしたり、使用している語彙を特定したり、機能をアクティブにしたりすることがあることが示唆されることがあります。これは悪い考えです。スケジューリングと語彙認識は名前空間に基づいている必要がありますが、機能のアクティブ化は明示的な処理命令または要素に基づいている必要があります。
よく形成されるという考え方は、XMLを許可し、Doctypeのないドキュメントを宣伝するDTD解析を導入することです。正式なケースでは、2つのXMLドキュメントに同じ標準形式があり、アプリケーションが異なる方法で処理します(外部エンティティを処理することができないためではなく)、アプリケーションが壊れる可能性があります。実際には、2つのXMLドキュメントがSAX2コンテンツプロセッサに同じコンテンツを報告する(QNAMESが無視する)場合、アプリケーションがドキュメントを異なる方法で処理すると、アプリケーションが壊れる可能性があります。 Web著者として、追加のエンティティに対処するXMLProcessorを使用して誰もがページを解析すると信じることは不可能であると考えると(一部のブラウザは、特定のパブリック識別子が縮小されたエンティティを定義するDTDにマッピングするため)、XMLにDoctypeを挿入してWebで使用するためにXMLを挿入します。 (W3CバリデーターのDTDオーバーライド機能を使用してDTDを検証しますが、W3Cバリエーターは結果が一時的なものであると言います。または、パターンで参照される文書を汚染しないリラックスしたNG検証を使用できます。
さらに、低レベルの仕様が2つの等しいものを定義する場合、高レベルの仕様はそれらに異なる意味を与えようとしないはずです。 <!doctype html public -// w3c // dtd xhtml 1.0 strict // en http://www.w3.org/tr/xhtml1/dtd/xhtml1-sttrict.dtd>パブリック識別子が削除されている場合、同じDTDがまだ指定されているため、Doctype <それらは異なって嗅ぐべきですか?それはさらなる理論である可能性があります。 foobar.dtdと呼ばれるdtdをexample.comにコピーするとします:<!doctype html system http://example.com/foobar.dtd>。これを嗅ぐ方法は?それは同じ意味を持つべきです。 DTD全体をドキュメントに投稿できます。
言い換えれば、#include foo.hがある場合、foo.hの内容をドキュメントにコピーするか、foo.hをbar.hにコピーし、#include bar.hを表現することを許可するはずであるため、黒い魔法をfoo.hという名前にバインドするべきではありません。
HTMLとSGMLが同じパラメーターを構築することを心配していない理由は、WebブラウザーがHTMLを解析するために実際のSGMLパーサーを使用していないため、処理のためにSGMLをマスカレードすることは役に立たないと思います。とにかく、まだ信じていない場合は、この問題comp.text.sgmlに関するW. Eliot Kimberの記事を読んでください
次の表では、癖パターン、標準パターン、および準基準は、それぞれq、S、およびAとして表されます。ブラウザに2つのモードしかない場合、テーブルセルの行の高さがMozillaの標準モード性能と一致する場合、標準モードはSとしてマークされ、標準モードは、テーブルセルの行の高さがMozillaの標準モードパフォーマンスと一致する場合にマークされます。
XMLコンテンツモデルを使用したXHTMLサービングはXMLモードでレンダリングされていることに注意してください。
このテーブルの目的は、テーブル内のすべてのDoctypesが新しいページを作成するための合理的な選択であるということではありません。この表の目的は、私の推奨事項がどのようなデータに基づいているかを示すことです。
次の略語記号は、列のタイトルに使用されます。
| Doctype | NS6 | 古いモズ | Moz&Safari&Opera10&HTML5 | Opera9.0 | IE8&Opera9.5 | IE7&Opera7.10 | IE6&Opera7.0 | Mac IE5 | konq3.2 |
|---|---|---|---|---|---|---|---|---|---|
| なし | Q | Q | Q | Q | Q | Q | Q | Q | Q |
| <!doctype html public -// w3c // dtd html 3.2 final // en> | Q | Q | Q | Q | Q | Q | Q | Q | Q |
| <!doctype html public -// w3c // dtd html 4.0 // en> | s | s | s | s | s | a | a | a | a |
| <!doctype html public -// w3c // dtd html 4.01 // en> | s | s | s | s | s | a | a | Q | a |
| <!doctype html public -// w3c // dtd html 4.0 // en http://www.w3.org/tr/html4/strict.dtd> | s | s | s | s | s | a | a | a | a |
| <!doctype html public -// w3c // dtd html 4.01 // en http://www.w3.org/tr/html4/strict.dtd> | s | s | s | s | s | a | a | a | a |
| <!doctype html public -// w3c // dtd html 4.0 transitional // en> | Q | Q | Q | Q | Q | Q | Q | Q | Q |
| <!doctype html public -// w3c // dtd html 4.01 transitional // en> | Q | Q | Q | Q | Q | Q | Q | Q | Q |
| <!doctype html public -// w3c // dtd html 4.01 transitional // en http://www.w3.org/tr/html4/loose.dtd> | s | s | a | a | a | a | a | a | Q |
| <!doctype html public -// w3c // dtd html 4.01 transitional // en http://www.w3.org/tr/1999/rec-html401-19991224/loose.dtd> | Q | s | a | a | a | a | a | a | Q |
| <!doctype html public -// w3c // dtd html 4.0 transitional // en http://www.w3.org/tr/html4/loose.dtd> | Q | Q | Q | Q | a | a | a | a | Q |
| <!doctype html public - // w3c // dtd xhtml 1.1 // en http://www.w3.org/tr/xhtml11/dtd/xhtml11.dtd> | s | s | s | s | s | a | a | a | a |
| <!doctype html public - // w3c // dtd xhtml Basic 1.0 // en http://www.w3.org/tr/xhtml-basic/xhtml-basic10.dtd> | s | s | s | s | s | a | a | a | a |
| <!doctype html public - // w3c // dtd xhtml 1.0 strict // en http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd> | s | s | s | s | s | a | a | a | a |
| <!doctype html public - // w3c // dtd xhtml 1.0 transitional // en http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd> | s | s | a | a | a | a | a | a | Q |
| <?xmlバージョン= 1.0エンコード= utf -8?> <!doctype html public - // w3c // dtd xhtml 1.1 // en http://www.w3.org/tr/xhtml11/dtd/xhtml11.dtd> | s | s | s | s | s | a | Q | a | Q |
| <?xmlバージョン= 1.0エンコード= utf-8?> <!doctype html public - // w3c // dtd xhtml basic 1.0 // en http://www.w3.org/tr/xhtml-basic/xhtml-basic10.dtd> | s | s | s | s | s | a | Q | a | Q |
| <?xml バージョン= 1.0エンコード= utf -8?> <!doctype html public - // w3c // dtd xhtml 1.0 strict // en http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd> | s | s | s | s | s | a | Q | a | Q |
| <?xml バージョン= 1.0エンコード= utf -8?> <!doctype html public - // w3c // dtd xhtml 1.0 transitional // en http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd> | s | s | a | a | a | a | Q | a | Q |
| <!doctype HTML Public ISO/IEC 15445:2000 // DTD HTML // en> | Q | s | s | Q | Q | Q | Q | Q | Q |
| <!doctype HTML Public ISO/IEC 15445:2000 // DTDハイパーテキストマークアップ 言語// en> | Q | s | s | s | s | a | a | a | Q |
| <!doctype HTML Public ISO/IEC 15445:1999 // DTD HTML // en> | s | s | s | Q | Q | Q | Q | Q | Q |
| <!doctype HTML Public ISO/IEC 15445:1999 // DTDハイパーテキストマークアップ 言語// en> | s | s | s | s | s | a | a | a | Q |
| <!doctype html> | Q | s | s | s | s | a | a | a |
MoziilaのDoctype Sniffingコードは、2000年10月、2001年9月、2002年6月に大幅に変更されました。このドキュメントに記載されているMozilla(およびNetscape 6.x)によって設立された州は、2000.10.19以降FTP.Mozilla.orgで見ることができます。このドキュメントでは、Mozilla M18(およびNetscape 6.0 PR3)でDoctypeスニッフィングがどのように機能するかについては説明していません。 SafariのDoctypeスニッフィングコードも、最初のパブリックベータ版以来大幅に変更されています。このドキュメントには、0.9とも呼ばれるバージョンV73よりも早い動作は含まれていません。
Konqueror3.5の前のDoctypeスニッフィングコードは、Safariの初期バージョンから来ているようです。 Konquerorは現在Safariと一致し、そのDoctype SniffingコードはMozillaから来ています。
テーブルからわかるように、OperaのDoctypeスニッフィングは、Opera9.5と9.6が後方に進んでいますが、通常のIEのようなIEのようなものからモジラのようなものに変化しています。一方、Opera Quirkモードのレイアウト動作は、IE6のQuirkモードの模倣からMozillaのQuirkモードに切り替えられています。
これらの手順は、PDF形式とPNG形式のフローチャートを介して見ることができます。
サイモン・ピーターズ、サイモン・ピーターズ、アン・ヴァン・ケスターンに、パターンテーブルとさまざまなオペラバージョンのコメントを修正してくれたことに感謝します。別のIE8フローチャートを作成してくれたSimon Pietersに感謝します。