Тип документа: объявлять или не объявлять?

HTML и CSSXSLTJavaScriptИзображенияСофтEtc
Андрейка Лечев

22 ноября 2005


Любой, кто хоть раз заглядывал в код страниц, наверняка замечал, что многие из них начинаются со строчки <!DOCTYPE... >. Это так называемое «объявление типа документа» или Document Type Declaration (не путать с DTD — Document Type Definition).

Авторы умных книг по HTML, автоматические валидаторы и Джеффри Зельдман (Jeffrey Zeldman) утверждают, что по правилам хорошего тона использовать его нужно всегда. Если учесть тот факт, что многие сайты прекрасно отображаются в браузерах и без него, возникает резонный вопрос: «А нужен ли <!DOCTYPE> на самом деле?». Путем несложных рассуждений попытаемся это выяснить.

Откуда он взялся?

Объявление типа документа можно встретить даже в древней версии HTML, не имевшей порядкового номера и носившей странное название HTML Internet Draft. Тогда уже существовало несколько языков разметки (TEX, PostScript и SGML), которые использовались в основном для работы с научными документами (что нисколько не удивляет, так как веб вообще родился в Европейском центре ядерных исследований путем скрещивания простого гипертекста с еще более простым протоколом).

Поскольку эти языки были сложными, разработчики задумались над тем, как облегчить жизнь людям и графическим терминалам, упростив разметку. И придумали HTML, построив его на основе правил «стандартного обобщенного языка разметки» или, как его чаще называют, SGML (Standard Generalized Markup Language).

Именно в SGML было указано, что каждый документ должен начинаться с объявления его типа. В первой публичной версии спецификации HTML 2.0 говорилось о том, что следует начинать с объявления (использовалось слово should), в версии HTML 3.2 его использование стало обязательным (must start with the <!DOCTYPE> declaration).

Но ни один браузер тех времен не требовал явного указания типа документа для отображения HTML-страницы. А раз браузеры не требовали, то и разработчикам было все равно — они с легким сердцем игнорировали <!DOCTYPE> (справедливости ради стоит сказать, что речь идет о тех разработчиках, которые код «писали руками», а не посредством HotDog’а).

Стандарты и обратная совместимость

Первым браузером, обратившим внимание на тип документа, стал Internet Explorer 5.0 для Mac OS (движок Tasman). Появился он в начале 2000 года и сразу же стал лучшим с точки зрения поддержки HTML-стандартов (оговорка для зануд: Mozilla была далека от версии 1.0, а Opera продолжала безнадежно копировать MSIE для Windows).

Но на тот момент никому не был нужен браузер, умеющий «рендерить» HTML согласно стандартам. Потому что стандарты не соответствовали тому, как браузеры на практике интерпретировали HTML-код.

В результате Internet Explorer 5.0 для Mac OS показывал страницы не так, как они были задуманы, и понадобился специальный переключатель, с помощью которого можно было сказать: вести себя как обычные браузеры или по стандартам.

И таким переключателем стало объявление типа документа. Правило при этом было простое: если тип документа не объявлен или объявлен без указания адреса DTD (на этот раз речь идет о Document Type Definition), то HTML интерпретировался в режиме совместимости со «старыми» браузерами (quirky mode, впоследствии — quirks mode), если же адрес DTD указывался, то элементы отображались согласно стандартам HTML 4.01 и CSS 1.

Вот тут-то и началась новая эра — эра борьбы за стандартный код. Появились сообщения о слишком маленьких шрифтах во вложенных таблицах, о «разъезжающихся» сайтах из-за непонятной box-модели, о загадочных зазорах между картинками (Mozilla, прости) и т. д. И все это было связанно с тем, что разработчики не задумывались о том, что написано внутри замечательной конструкции <!DOCTYPE>.

Internet Explorer 6.0 для Windows узаконил переключение между режимами, и теперь почти все браузеры знают, что такое «стандартный режим» (standards mode) и «режим совместимости со старыми браузерами» (quirks mode). Mozilla и Safari пошли дальше: у них есть «почти стандартный режим», почти соответствующий стандартному режиму Internet Explorer 6.0. Но это уже совсем другая история...

Так указывать или не указывать?

Если вы считаете нужным указать <!DOCTYPE>, будьте любезны сделать так, чтобы ваш HTML соответствовал стандартам без исключений. Либо допустите исключения, если вам нужен «стандартный режим» отображения. Во всех остальных случаях <!DOCTYPE> вам не требуется. Поверьте на слово...