DOCTYPE
<!DOCTYPE html>-- объявление типа документа, которое переключает браузер в стандартный режим рендеринга (standards mode).
Зачем нужно
DOCTYPE определяет, в каком режиме браузер будет отображать страницу. Без него браузер может переключиться в quirks mode -- режим обратной совместимости со старыми страницами 1990-х, где CSS box model и другие правила работают иначе.
Где используется
- Первая строка каждого HTML-документа
- Генерируется автоматически фреймворками и CMS
- Шаблоны серверного рендеринга
Предпосылки
DOCTYPE в деталях
Синтаксис HTML5
<!DOCTYPE html>
Это всё, что нужно в HTML5. Регистр не важен -- <!doctype html> и <!DOCTYPE HTML> работают одинаково.
DOCTYPE -- не HTML-тег. Это инструкция для браузера. У неё нет закрывающего тега, нет атрибутов (в HTML5), и она не является частью DOM-дерева.
Старые DOCTYPE (для контекста)
В HTML 4.01 и XHTML DOCTYPE выглядел так:
<!-- HTML 4.01 Strict -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<!-- HTML 4.01 Transitional -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<!-- XHTML 1.0 Strict -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Эти монстроидальные конструкции ссылались на DTD (Document Type Definition) -- формальное описание допустимых элементов и атрибутов. В HTML5 от DTD отказались.
Три режима рендеринга
| Режим | Когда активируется | Поведение |
|---|---|---|
| Standards mode | <!DOCTYPE html> |
Современные стандарты CSS и HTML |
| Almost standards mode | Некоторые старые DOCTYPE | Почти стандартный, мелкие отличия в таблицах |
| Quirks mode | Нет DOCTYPE или ошибочный | Эмуляция поведения IE5 / Netscape 4 |
Quirks mode -- что ломается
В quirks mode браузер работает иначе:
1. Box model меняется:
/* Standards mode (W3C box model): */
/* width = content width */
/* total = width + padding + border */
/* Quirks mode (IE box model): */
/* width = content + padding + border */
/* total = width */
<!-- Один и тот же CSS даёт РАЗНЫЕ размеры в разных режимах -->
<div style="width: 200px; padding: 20px; border: 5px solid black;">
<!-- Standards: визуальная ширина = 200 + 40 + 10 = 250px -->
<!-- Quirks: визуальная ширина = 200px (padding и border внутри) -->
</div>
2. Вертикальное центрирование таблиц:
В quirks mode vertical-align на ячейках работает иначе.
3. Размеры шрифтов: В quirks mode inline-элементы не наследуют font-size от родителя таблицы.
4. Парсинг CSS: Некоторые CSS-хаки и баги IE воспроизводятся в quirks mode.
Как проверить режим
Через JavaScript:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Проверка режима</title>
</head>
<body>
<script>
// "CSS1Compat" = standards mode
// "BackCompat" = quirks mode
console.log(document.compatMode);
// Вывод на страницу
document.body.textContent =
'Режим: ' + (document.compatMode === 'CSS1Compat'
? 'Standards mode'
: 'Quirks mode');
</script>
</body>
</html>
Через DevTools:
- Открой DevTools (F12)
- Вкладка Console
- Введи
document.compatMode
Что будет без DOCTYPE
<!-- Нет DOCTYPE -- quirks mode! -->
<html>
<head>
<title>Без DOCTYPE</title>
<style>
.box {
width: 200px;
padding: 20px;
border: 5px solid red;
background: lightblue;
}
</style>
</head>
<body>
<div class="box">
Визуальная ширина будет 200px (quirks) вместо 250px (standards)
</div>
</body>
</html>
DOCTYPE и фреймворки
Все современные инструменты генерируют корректный DOCTYPE:
<!-- React (public/index.html или Next.js) -->
<!DOCTYPE html>
<!-- Vue (index.html) -->
<!DOCTYPE html>
<!-- Angular (src/index.html) -->
<!doctype html>
Если ты используешь фреймворк -- DOCTYPE уже есть. Но важно знать, зачем он нужен, чтобы не удалить его случайно.
Частые ошибки
| Ошибка | Почему плохо | Как правильно |
|---|---|---|
| Нет DOCTYPE вообще | Quirks mode: сломанный box model | <!DOCTYPE html> первой строкой |
| Пробел или BOM перед DOCTYPE | Quirks mode в IE | DOCTYPE строго первая строка файла |
| Использование старого DOCTYPE | Лишний код, те же грабли | <!DOCTYPE html> достаточно |
Закрывающий тег </!DOCTYPE> |
Это не тег, нечего закрывать | Просто <!DOCTYPE html> |
DOCTYPE после <html> |
Quirks mode | DOCTYPE всегда перед <html> |
Практика
- Создай HTML-файл без DOCTYPE. Открой консоль и проверь
document.compatMode - Добавь
<!DOCTYPE html>и проверь снова -- должно стать"CSS1Compat" - Создай
<div>сwidth: 200px; padding: 20px; border: 5px solidи сравни визуальную ширину с и без DOCTYPE - Проверь свой сайт/проект -- убедись, что DOCTYPE на месте
Связанные темы
- Структура документа -- полная структура HTML
- Что такое HTML -- контекст и история