P-0039 DOCTYPE 宣言は本当に無意味?
- 2001/3/14
DOCTYPE 宣言は必須です!
HTML 文書の先頭には必ず文書型宣言(いわゆる DOCTYPE 宣言)を書きましょう。無くても問題ないと説明している「講座」があったり、ファイルサイズを少しでも削るためにと省略している人もいますが、無いと実際に困ります。
そもそも、 DOCTYPE 宣言って何なんだ
文書型宣言の役割
HTML は SGML ( XHTML だと XML )というマークアップ言語の仕様に沿って作られたいち言語で、他にも MathML や SVG などの記法がよく似ている他のマークアップ言語が存在します。文書型宣言がないと、ブラウザはどの言語で書かれたものなのか判断できません。
文書型宣言を省略する人が多い(また、それを良しとする「講座」が多い)のは、 HTML くらいしか普及しているマークアップ言語がなかったことと、ブラウザが HTML にしか対応していなかったから仕様の判別の必要がなく、今まであまり問題が起こらなかった、というだけの理由に過ぎません。
※ ちなみに、 XML には名前空間というものがあり、それぞれのマークアップ言語の仕様を区別できるようになっています。 XHTML もそのうち文書型宣言が不要になるのかも知れません。
HTML のバージョン違いもある
HTML にもバージョンがあり、今おそらく最も広く使われている「 HTML 4 Transitioal 」「 HTML 3.2 」の他に、もっと厳密な仕様「 HTML 4 Strict 」や現在の最新版 HTML 「 XHTML 1.0 Strict 」、次世代の「 XHTML Basic 」「 XHTML 1.1 」など、 HTML だけでも多くのバージョン違いがあります。これらの仕様は完全な上位互換ではなく、例えば HTML 4 と HTML 3.2 では許される記述が違っているので、ここでも文書型宣言によるその文書を記述した言語の判別が不可欠となります。
また、「省略」に関する違いも問題となります。 HTML 4 まででは終了タグや属性の書き方などで色々と省略が許されていますが、 XHTML では一切の省略ができなくなっていて、 HTML 4 で書かれた文書を誤って XHTML として解釈すると、ブラウザがエラーを起こす可能性もあります。
本当に無意味なのか?
実際に文書型宣言を解釈するブラウザもある!
HTML の記述がおかしい場合、ブラウザは自動的に「エラー訂正」をするわけですが、仕様を誤解したまま記述された HTML 文書では、ブラウザが「訂正」した結果が制作者の意図と違う表示になってしまうことがあります。これはいいかげんな HTML を書く制作者の方に問題があるのですが、だからといって「マトモに(制作者の意図通りに)表示できない」のは商品としては問題です。そのため、 Netscape 6(Mozilla) や MacIE 5 、 IE 6 など一部の先進的なブラウザは、 HTML 4 Strict や XHTML 1.0 の文書型宣言が付いていれば文法通りに厳密に「エラー訂正」しても大丈夫と判断して動作するようにできています。端的に言うと、文書型宣言のあるなしで表示が変わってしまうことがあるということです。
追記。 N 6, MacIE 5, IE 6 以外に、 Mac の iCab も文書型宣言を解釈するそうです。(ただし表示に変化はありませんが)
身近な利益を考えても
仕様と解釈が違ったって、自分の望み通りに表示できれば問題ない──そう思ってはいませんか?
例えば、 CSS は仕様書で表示効果が定義されているので、仕様通りに書けば基本的にはどのブラウザでも同じ表示になるはずです。実際、 MacIE 5 ・ WinIE 5 ・ Netscape 6 などのブラウザは CSS をかなりのレベルで実装しているので、大きな苦労なしに「クロスブラウザ」を実現できるのですが、文書型宣言が正しくないだけで仕様と表示が違ってしまうため、「望み通りの表示」ができない── HTML の文法が滅茶苦茶だと「クロスブラウザ」の CSS の意味がないということになり得ます。
こういった問題に対処するとなると、ブラウザごとに別々のスタイルを用意したり HTML 文書自体を複数用意したりと余計な手間をかける必要が出てきます。それならば、最初から「厳密な文法」で HTML 文書を書いておいて仕様で期待されるとおりの表示ができるようにしておく方が、ずっと楽です。このように、これから先 HTML は文法的に正しい方が絶対に有利なのです。
というわけで、文書型宣言は必ず書くようにしましょう(そして可能ならば、 HTML 自体も文法的に正しく書きましょう)。ブラウザ側の解釈さえ一定ならば、エラーがあってもブラウザごとに表示が違うという事態は避けられますから。