DOCTYPEスイッチ

現在リリースされている視覚環境のUAには、宣言された文書型に応じてレンダリングモードを標準準拠(standard)モードか後方互換(quirk)モードに切り替えるDOCTYPEスイッチ(DOCTYPE Switching)の機能が備えられています。

これは、全ての制作者が宣言した文書型に定義されている仕様(ルール)に沿った文書を作成していれば、その仕様通りの動作や表示が期待できるので問題は起こりませんが、中には問題のある記述をしている制作者もいるために、UA側で宣言されている文書型に応じてレンダリングモードを切り替えるようになっています。後方互換(quirk)モードでは、拡大解釈をしたり、仕様で定義されている内容とは異なる独自の解釈する場合があります。

後方互換(quirk)モードの際に問題となる記述例

  • class属性, id属性の値はcase-sensitiveのため標準モードでは大文字・小文字が区別されるが、後方互換モードでは大文字・小文字が区別されず、同じ値として扱われる。
  • CSSのプロパティの値で、「0」以外の数値指定には必ず単位を伴わなければならないが、"margin : 10 ;" と指定した場合、標準モードではこの指定は無視(無効と)されるが、後方互換モードでは勝手に "margin : 10px ;" として拡大解釈してしまう。
  • CSSのプロパティの値で、16進数RGB値で色を指定する場合は、先頭にハッシュ(#)の指定を伴わなければならないが "0000ff" と指定した場合、標準モードではこの指定は無視(無効と)されるが、後方互換モードでは勝手に "#0000ff" として拡大解釈してしまう。

などがあります。このように、後方互換(quirk)モードでは、仕様通りの動作や表示にならないため、特定のUAでだけ表示が異なるなどの問題を引き起こすことがあるのでDOCTYPEスイッチ機能は注意が必要な機能です。

文書型宣言に応じた主要ブラウザのレンダリングモード一覧表

文書型宣言(DOCTYPE宣言) IE6 IE7/8 IE9+ Opera8+ Firefox1+ Safari1+
Chrome1+
HTMLバージョンやDTDの指定なし、または HTML2.0、及び3.2の場合 quirk quirk quirk quirk quirk quirk
HTML4.01(!DOCTYPE HTML PUBLIC部分はcase-insensitivelyで大文字・小文字の区別なし)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> standard standard standard standard standard standard
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> standard standard standard standard standard standard
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Strict //EN"> standard standard standard standard standard standard
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Strict //EN" "http://www.w3.org/TR/html4/strict.dtd"> standard standard standard standard standard standard
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> quirk quirk quirk quirk quirk quirk
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> standard standard standard standard standard standard
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> quirk quirk quirk quirk quirk quirk
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> standard standard standard standard standard standard
HTML5(MIME:text/html) (!DOCTYPE htmlの部分はcase-insensitivelyで大文字・小文字の区別なし)
<!DOCTYPE html> standard standard standard standard standard standard
XHTML5(MIME:application/xhtml+xml)
<!DOCTYPE html> error* error* standard standard standard standard
XHTML1.0(MIME:text/html)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> standard standard standard standard standard standard
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> standard standard standard standard standard standard
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> standard standard standard standard standard standard
<?xml version="1.0" encoding="文字コード"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
quirk standard standard standard standard standard
<?xml version="1.0" encoding="文字コード"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
quirk standard standard standard standard standard
<?xml version="1.0" encoding="文字コード"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
quirk standard standard standard standard standard
XHTML1.1(MIME:text/html)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> standard standard standard standard standard standard
<?xml version="1.0" encoding="文字コード"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
quirk standard standard standard standard standard
XHTML Basic(MIME:text/html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"> standard standard standard standard standard standard
<?xml version="1.0" encoding="文字コード"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
quirk standard standard standard standard standard
XHTML1.0(MIME:application/xhtml+xml)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> error* error* standard standard standard standard
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> error* error* standard standard standard standard
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> error* error* standard standard standard standard
<?xml version="1.0" encoding="文字コード"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
error* error* standard standard standard standard
<?xml version="1.0" encoding="文字コード"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
error* error* standard standard standard standard
<?xml version="1.0" encoding="文字コード"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
error* error* standard standard standard standard
XHTML1.1(MIME:application/xhtml+xml)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> error* error* standard standard standard standard
<?xml version="1.0" encoding="文字コード"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
error* error* standard standard standard standard
XHTML Basic(MIME:application/xhtml+xml)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"> error* error* standard standard standard standard
<?xml version="1.0" encoding="文字コード"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
error* error* standard standard standard standard
errorについて
IE8以前のバージョンにapplication/xhtml+xmlの文書を送ると、application/xhtml+xmlのMIMEを認識できないために、その文書を保存するかどうかを尋ねられます。この問題はIE9より改善されています。

XML宣言とInternet Explorer 6

上記表をご覧頂くと、Windows版Internet Explorer 6では、XHTMLの規格で文書を作成する場合に、1行目がXML文章であることを宣言するXML宣言から開始されていると、本来は標準準拠(standard)モードでレンダリングされるべきはずが、Windows版Internet Explorer 6のみ後方互換(quirk)モードに切り替わってレンダリングされてしまうという問題を抱えた実装となっていることがわかります。

なお、この問題はHTMLシリアライゼーション(text/html配信)の文書であれば、XML宣言自体を省略することが許可されているので、XML宣言を省略することで、Internet Explorer 6だけが勝手に後方互換モードに切り替わってしまう問題は回避することが可能です。

HTML5の文書型宣言は優秀

HTML5の文書型宣言には従来のようなDTDが存在しないため非常に短く、そもそもの目的がHTMLシリアライゼーション(text/html配信)の文書において標準準拠(standard)モードを有効にするための手段として用いられることになっています。そのため過去にリリースされているブラウザから現段階でリリースされているブラウザまで幅広く、<!DOCTYPE html>を標準準拠(standard)モードのトリガーとして解釈します。

これはあまり好ましい説明ではありませんが、DOCTYPEスイッチ問題に時間を費やしてしまうような非効率な事態を避けるためにもDOCTYPEスイッチ云々そのものがよくわからないという場合はHTML5の文書型宣言を用いておけば、HTML5の仕様に準拠する・非準拠であることは問はず、DOCTYPEスイッチ問題に悩まされることは、まず起こりえないので、それはそれでひとつの有効な手段と言えるでしょう。

Updated / Published