Menu

DOCTYPE в HTML: что делает <!DOCTYPE html> и где он стоит

<!DOCTYPE html> стоит в первой строке каждого HTML-документа. Он говорит браузеру отображать страницу в стандартном режиме, а не в режиме совместимости (quirks mode). Разберем синтаксис, что включают старые doctype и как проверить режим.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Что такое <!DOCTYPE html>

<!DOCTYPE html> это объявление типа документа: первая строка HTML-файла, перед тегом <html>. Оно говорит браузеру «это современный HTML-документ», и браузер отображает страницу в стандартном режиме, по действующим спецификациям HTML и CSS.

Эта одна строка и есть весь doctype HTML5. У него нет закрывающего тега, и внутрь ничего не пишут.

Правила синтаксиса

  • Он стоит первым. Перед ним допустимы только пробелы и комментарии. Любой текст или тег перед doctype заставит браузер его проигнорировать.
  • Регистр не важен. <!DOCTYPE html> и <!doctype html> одинаковы. Выберите один стиль и придерживайтесь его.
  • Это не элемент. Не бывает </!DOCTYPE>, и к нему нельзя добавить class или другие атрибуты.
  • После DOCTYPE должно идти слово html. <!DOCTYPE html5> не является более новой версией: браузер считает, что у такой страницы нет корректного doctype.
  • Один на документ. Страницы, собранные из нескольких файлов (шаблоны, include), все равно выводят один doctype в начале итогового HTML.

Стандартный режим и режим совместимости

У браузеров три режима отображения, и doctype выбирает один из них:

РежимЧто его включаетЧто меняется
Стандартный режим (standards mode)<!DOCTYPE html> и другие современные doctypeВсе работает по действующим спецификациям
Почти стандартный режим (limited quirks mode)HTML 4.01 Transitional или Frameset с URL, XHTML 1.0 Transitional или FramesetПочти стандартный: отличается только одно правило высоты строки, поэтому у картинки, стоящей в строке одна (обычно в ячейке таблицы), нет зазора снизу
Режим совместимости (quirks mode)Нет doctype, doctype с опечаткой или некоторые старые, например HTML 4.01 Transitional без URLИмитирует браузеры 1990-х: по-другому ведут себя высоты в процентах, размер текста в таблицах и высота строк

Режим совместимости нужен, чтобы страницы, написанные до появления веб-стандартов, выглядели так, как их видели авторы. Для новых страниц он приносит только проблемы: height: 100%, который работает на одной странице и не работает на другой, или таблицы, игнорирующие ваш размер шрифта, это классические признаки отсутствующего doctype.

Превью редактора на этой странице всегда работает в стандартном режиме, поэтому если удалить там doctype, режим совместимости вы не увидите. Проверка ниже использует DOMParser, который применяет те же правила, что и браузер при загрузке файла. Измените doctype в текстовом поле, и режим обновится:

Попробуйте удалить строку, написать <!DOCTYPE html5> или поставить слово перед doctype: в каждом случае результат переключится на quirks.

Старые doctype: HTML 4.01 и XHTML

До HTML5 doctype указывал на DTD-файл с длинным публичным идентификатором. Такие строки до сих пор встречаются в начале старых сайтов:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Браузеры никогда не скачивали эти DTD-файлы. Они только читали идентификатор, чтобы выбрать режим: HTML 4.01 Strict и XHTML 1.0 Strict дают стандартный режим, версии Transitional дают почти стандартный режим, а HTML 4.01 Transitional без URL дает полный режим совместимости. Вставьте любой из них в проверку выше; учтите, что compatMode сообщает почти стандартный режим как CSS1Compat, то есть то же значение, что и у стандартного, поэтому как BackCompat отображается только полный режим совместимости.

Заменить старый doctype на <!DOCTYPE html> безопасно для страниц, которые уже работают в стандартном режиме. Страница, которая была в режиме совместимости, может немного сдвинуться (обычно высоты и зазоры под картинками), поэтому просмотрите ее после замены.

Doctype в DOM

Doctype превращается в узел DocumentType, отдельный от элемента <html>. Скрипты читают его через document.doctype, а document.compatMode сообщает, в каком режиме оказалась страница:

document.compatMode это самый быстрый способ проверить любой живой сайт: откройте консоль браузера и введите его. "CSS1Compat" означает стандартный (или почти стандартный) режим, "BackCompat" означает режим совместимости.

Полный шаблон HTML5

Doctype это часть минимального документа, с которого стоит начинать каждую страницу. У каждой строки ниже своя задача:

У атрибута lang и тега meta viewport есть отдельные страницы.

Частые ошибки

  • Что-то стоит перед doctype. Случайный символ, отладочный echo из серверного скрипта или HTML-тег над <!DOCTYPE html> переводят всю страницу в режим совместимости. Комментарии и пустые строки допустимы.
  • Выдуманная версия. <!DOCTYPE html5> или <!DOCTYPE HTML 5> некорректны и включают режим совместимости. Doctype HTML5 это просто <!DOCTYPE html>.
  • Попытка его закрыть. <!DOCTYPE html></!DOCTYPE> не является корректным HTML. У объявления нет закрывающего тега.
  • Doctype забыт в маленьких тестовых файлах. Ошибки верстки, которые вы ловите в черновом файле без doctype, могут не существовать на настоящей странице, и наоборот.
  • Оставлен старый Transitional doctype. Он без всякой пользы переводит страницу в почти стандартный режим. Замените его на <!DOCTYPE html>.

Часто задаваемые вопросы

Что делает <!DOCTYPE html>?

Он сообщает браузеру, что страница является современным HTML-документом, и она отображается в стандартном режиме. Без него браузер переходит в режим совместимости (quirks mode), который имитирует ошибки браузеров конца 1990-х и меняет расчет некоторых раскладок и высот.

Обязателен ли <!DOCTYPE html>?

Страница загрузится и без него, но стандарт HTML его требует, а браузер отобразит страницу в режиме совместимости. Всегда ставьте <!DOCTYPE html> в первую строку.

Важен ли регистр в doctype?

Нет. <!DOCTYPE html>, <!doctype html> и <!DocType HTML> означают одно и то же. Чаще всего пишут DOCTYPE заглавными буквами, а html строчными.

DOCTYPE это HTML-тег?

Нет. Это объявление, а не элемент: у него нет закрывающего тега, к нему нельзя добавить атрибуты, и его нет в document.body. В DOM это отдельный узел DocumentType, доступный как document.doctype.

Какой doctype у HTML5?

<!DOCTYPE html>. В HTML5 убрали длинные публичные идентификаторы и URL из HTML 4.01 и XHTML, и короткой формы достаточно для любой новой страницы.

Как проверить, что страница в режиме совместимости?

Откройте консоль браузера и выполните document.compatMode. "CSS1Compat" означает стандартный режим (или почти стандартный), "BackCompat" означает режим совместимости.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ