(メモ)DOCTYPEスイッチあるいはウェブ標準としてのQuirks Modeの覚え書き

HTML4世代にとっては何を今更な話題かもですが、とあるQiitaのエントリーを見て*1、最近の人にはきっとわからない話題なんだなということでおさらいのようなエントリーを書いてみようかなと。

導入された当初ではブラウザー独自の挙動でしたが、現在では過去との互換性のために、WHATWG Quirks Modeというウェブ標準でまとめられ定義されたものになっています。

概要を振り返っておくと、2000年代あたりの古いウェブブラウザーで導入されたこの仕組みは、それよりも更に古い歴史的なブラウザーのクセ(つまるところ、仕様をうまく実装できていなかったbuggyな挙動)を模倣するような動作モードを導入しました。これにより、古いブラウザーが、ウェブ標準に忠実に作成されたウェブページと、歴史的なブラウザーのクセにあわせて作成されたウェブページとをうまく切り分けてレンダリングしようとした――今日的にはDOCTYPEの記述で切り分けるのは失敗だったと言えるものの――というものです。

大雑把な分類としては、DOCTYPE宣言がないあるいはHTML4よりも前のDOCTYPE宣言のあるHTML文書を奇癖モード(quirks mode、歴史的には互換モードとも呼ばれていた)、HTML5で定められたDOCTYPE宣言のような特定のDOCTYPE宣言があるHTML文書を無奇癖モード(no-quirks mode、歴史的には標準モード)、XHTML 1.0 TransitionalのDOCTYPE宣言についてはそれらの中間の限定奇癖モード(limited-quirks mode、歴史的にはほぼ標準モード)となります。奇癖モードの大まかな挙動はMozilla Quirks Mode Behavior | MDNあたりが参考になるでしょう。

長々と書きましたが、HTML標準はWHATWG HTML以外に存在せず*2W3C HTML5とそれより前のHTML仕様は全て廃止されてしまったために、これから新しく作るHTML文書のDOCTYPE宣言は<!DOCTYPE html>*3以外にあり得ません。また誤ってDOCTYPE宣言を省略してしまうと、前述のように文書が奇癖モードとして解釈されるので、思わぬところで不都合が起こることがあります。

こういった歴史的事情があるので*4、文書の「最初に」<!DOCTYPE html>を必ず書きましょうということになっているわけです。

*1:まあ一言で言ってしまえば「酷い」内容なのですが、晒してしまうのもそれはそれでかわいそうなので止めておきます

*2:厳密には、現時点ではW3C HTML 5.1や5.2が存在しますが、これも将来廃止予定です

*3:大文字・小文字は区別しません

*4:いちいち説明するのが面倒とも言う