|
1 | | - |
2 | | -<h3> |
3 | | - Что такое DOCTYPE? |
4 | | -</h3> |
| 1 | +<h3>Что такое DOCTYPE?</h3> |
5 | 2 | <p> |
6 | | - <span class="accent">Тег <!doctype></span> |
7 | | - — DTD (document type definition, описание типа документа) указывает тип документа, |
8 | | - который используется при написании html кода. Это непарный тег, который должен стоять самым первым в |
9 | | - коде каждой страницы вашего сайта. |
| 3 | + <span class="accent"><!DOCTYPE html></span> — это декларация (не HTML-тег), которая должна стоять |
| 4 | + самой первой строкой документа. Она сообщает браузеру, по каким правилам парсить и рендерить страницу. |
10 | 5 | </p> |
11 | 6 |
|
12 | | -<p> |
13 | | - Нужно понимать, что строчка, в которой прописывается <code>DOCTYPE</code> - это не просто очередной HTML тег. |
14 | | - Это важная инструкция, с помощью которой мы говорим браузеру, какая версия HTML использовалась при написании страницы. |
| 7 | +<p class="info"> |
| 8 | + <strong>Главная мысль:</strong> сегодня DOCTYPE — это переключатель режимов рендеринга. |
| 9 | + С ним браузер работает в <strong>standards mode</strong> (по современным стандартам), |
| 10 | + без него — в <strong>quirks mode</strong>, эмулируя баги браузеров конца 90-х. |
15 | 11 | </p> |
16 | 12 |
|
17 | | -<p> |
18 | | - Главным преимуществом использования <code>DOCTYPE</code> является то, |
19 | | - что ваш сайт будет правильно работать и одинаково ровно и красиво смотреться во всех браузерах. |
20 | | -</p> |
| 13 | +<code class="code"> |
| 14 | + <!DOCTYPE html> |
| 15 | + <html> |
| 16 | + ... |
| 17 | + </html> |
| 18 | +</code> |
21 | 19 |
|
22 | | -<h3> |
23 | | - Зачем нужен DOCTYPE? |
24 | | -</h3> |
| 20 | +<h3>Зачем нужен DOCTYPE?</h3> |
| 21 | +<ul> |
| 22 | + <li> |
| 23 | + Включает <strong>standards mode</strong> — страница рендерится предсказуемо |
| 24 | + и одинаково во всех браузерах. |
| 25 | + </li> |
| 26 | + <li> |
| 27 | + Без него браузер уходит в <strong>quirks mode</strong>: другая боксовая модель (как в старом IE), |
| 28 | + иначе считаются размеры inline-элементов и таблиц — вёрстка «плывёт». |
| 29 | + </li> |
| 30 | + <li> |
| 31 | + Нужен для валидации: валидатор проверяет код против объявленной версии HTML. |
| 32 | + </li> |
| 33 | +</ul> |
25 | 34 |
|
26 | | -<p> |
27 | | - Тег <code>DOCTYPE</code> — ключевой компонент web-страниц, претендующих на соответствие стандартам: |
28 | | - без него ваш код и CSS не пройдут проверку валидатором. |
29 | | - Тег <code>DOCTYPE</code> также важен для правильного отображения и работы страницы в броузерах, соответствующих стандартам |
30 | | - (Mozilla, IE5/Mac, и IE6/Win). |
| 35 | +<p class="info info--orange"> |
| 36 | + DOCTYPE не «подключает» HTML5-фичи: новые теги и API работают и без него. |
| 37 | + Он влияет именно на режим рендеринга (в первую очередь на CSS-раскладку), |
| 38 | + поэтому его отсутствие ломает вёрстку, а не JavaScript. |
31 | 39 | </p> |
32 | 40 |
|
33 | | -<h3> |
34 | | - Какие существуют виды DOCTYPE? |
35 | | -</h3> |
36 | | - |
| 41 | +<h3>Виды DOCTYPE</h3> |
37 | 42 | <p> |
38 | | - Cуществует несколько видов <code>DOCTYPE</code>. Есть строгие виды (<strong>strict</strong>), |
39 | | - которые работают на основе только определенных тегов, есть переходные (<strong>transitional</strong>), |
40 | | - которые допускают возможность включения дополнительных тегов, есть такие, которые работают с фреймами |
41 | | - (<strong>frameset</strong>). |
| 43 | + До HTML5 декларация ссылалась на <span class="accent">DTD</span> (Document Type Definition) — |
| 44 | + формальное описание грамматики конкретной версии языка. Отсюда громоздкие варианты: |
| 45 | + <strong>HTML 4.01</strong> и <strong>XHTML 1.0</strong> в редакциях Strict / Transitional / Frameset, а также XHTML 1.1. |
42 | 46 | </p> |
43 | 47 |
|
44 | | -<p>Подробно в этой статье я не буду рассматривать каждый из них, так как это не является моей целью, просто перечислю:</p> |
45 | | - |
46 | | -<ol> |
47 | | - <li><strong>HTML 5</strong></li> |
48 | | - <li><strong>HTML 4.01 Strict</strong></li> |
49 | | - <li><strong>HTML 4.01 Transitional</strong></li> |
50 | | - <li><strong>HTML 4.01 Frameset</strong></li> |
51 | | - <li><strong>XHTML 1.0 Strict</strong></li> |
52 | | - <li><strong>XHTML 1.0 Transitional</strong></li> |
53 | | - <li><strong>XHTML 1.0 Frameset</strong></li> |
54 | | - <li><strong>XHTML 1.1</strong></li> |
55 | | -</ol> |
| 48 | +<p> |
| 49 | + В HTML5 декларацию сократили до <code><!DOCTYPE html></code> — минимальной строки, |
| 50 | + гарантированно включающей standards mode во всех браузерах. Сегодня используется только она. |
| 51 | +</p> |
56 | 52 |
|
| 53 | +<h3>Можно ли обойтись без DOCTYPE?</h3> |
57 | 54 | <p> |
58 | | - Что касается использования разных видов <code>DOCTYPE</code>, следует иметь ввиду, что если вы изначально писали свой |
59 | | - сайт в одном <code>DOCTYPE</code>, то не рекомендуется его менять в будущем на какой-то другой, потому что могут |
60 | | - возникнуть проблемы с правильным отображением сайта из-за того, что вместе со сменой <code>DOCTYPE</code> вы |
61 | | - автоматически поменяете правила обработки тегов браузерами. |
| 55 | + Технически — да, страница отрендерится, но в quirks mode, причём у каждого браузера |
| 56 | + свои «причуды»: раскладка будет различаться, а отлаживать такие расхождения тяжело. |
| 57 | +</p> |
| 58 | + |
| 59 | +<p class="info info--blue"> |
| 60 | + На практике: всегда начинайте документ с <code><!DOCTYPE html></code>. |
| 61 | + Регистр не важен (<code><!doctype html></code> тоже валиден), |
| 62 | + но декларация должна идти до любого другого содержимого страницы. |
62 | 63 | </p> |
63 | 64 |
|
64 | | -<h3> |
65 | | - Можно ли вообще обойтись без DOCTYPE? |
66 | | -</h3> |
| 65 | +<p class="deep-dive">Углубленный конспект</p> |
67 | 66 |
|
| 67 | +<h3>Режимы рендеринга: их на самом деле три</h3> |
68 | 68 | <p> |
69 | | - Теоретически, <code>DOCTYPE</code> не является необходимым тегом, но если вы не используете <code>DOCTYPE</code> |
70 | | - совсем, то рискуете лицезреть созданный вами сайт не в самом приглядном виде в браузере. |
71 | | - Причем в каждом браузере будут возникать разные проблемы с правильностью отображения, |
72 | | - а решить все их вам будет, мягко говоря, сложновато. |
| 69 | + Браузер выбирает режим «сниффингом» DOCTYPE — по его точному тексту: |
73 | 70 | </p> |
| 71 | +<ul> |
| 72 | + <li> |
| 73 | + <strong>No-quirks (standards) mode</strong> — включается современным <code><!DOCTYPE html></code> |
| 74 | + и старыми Strict-DTD. Полное соответствие спецификациям. |
| 75 | + </li> |
| 76 | + <li> |
| 77 | + <strong>Limited-quirks (almost standards) mode</strong> — включается Transitional/Frameset DTD с URI. |
| 78 | + Отличается от standards только рендерингом изображений в ячейках таблиц: |
| 79 | + картинка прижимается к низу ячейки без зазора под базовой линией текста. |
| 80 | + </li> |
| 81 | + <li> |
| 82 | + <strong>Quirks mode</strong> — при отсутствии DOCTYPE или устаревшей/неполной декларации. |
| 83 | + </li> |
| 84 | +</ul> |
74 | 85 |
|
75 | | -<h3> |
76 | | - Преимущества использования DOCTYPE HTML5 |
77 | | -</h3> |
| 86 | +<h4>Что конкретно ломается в quirks mode</h4> |
| 87 | +<ul> |
| 88 | + <li> |
| 89 | + Боксовая модель по образцу IE5: <code>width</code>/<code>height</code> включают |
| 90 | + <code>padding</code> и <code>border</code> (как <code>box-sizing: border-box</code>, |
| 91 | + но принудительно и для всех элементов). |
| 92 | + </li> |
| 93 | + <li> |
| 94 | + Размеры без единиц измерения трактуются как пиксели (<code>width: 100</code> сработает). |
| 95 | + </li> |
| 96 | + <li> |
| 97 | + Стили шрифта не наследуются внутрь таблиц — текст в <code><table></code> |
| 98 | + игнорирует <code>font-family</code> и <code>font-size</code> родителя. |
| 99 | + </li> |
| 100 | + <li> |
| 101 | + Иначе работают <code>line-height</code>, вертикальное выравнивание inline-контента |
| 102 | + и цветовые значения в нестандартных форматах. |
| 103 | + </li> |
| 104 | +</ul> |
78 | 105 |
|
79 | 106 | <p> |
80 | | - Хорошая новость состоит в том, что с выходом последней версии HTML5 стало намного удобней выбирать DOCTYPE для своих сайтов. |
| 107 | + Проверить текущий режим из JavaScript можно через <code>document.compatMode</code>: |
| 108 | + <code>"CSS1Compat"</code> — standards/limited-quirks, <code>"BackCompat"</code> — quirks mode. |
81 | 109 | </p> |
82 | 110 |
|
| 111 | +<h3>Историческая справка: откуда это всё взялось</h3> |
83 | 112 | <p> |
84 | | - Дело в том, что правила <code>DOCTYPE</code> HTML5 являются универсальными, включают в себя правила предыдущей версии, |
85 | | - а также возможность работы с HTML 4 тегами и, в какой-то степени, с XHTML. |
86 | | - Насколько я понимаю, они объединяют в себе возможности всех своих предшественников, адаптируя их для работы в новых браузерах. |
| 113 | + В 90-е браузеры рендерили страницы с расхождениями от стандартов (самый известный пример — |
| 114 | + боксовая модель IE). Когда браузеры начали исправлять поведение под спецификации, |
| 115 | + возникла проблема: миллионы старых сайтов были свёрстаны под баги и «сломались бы» при честном рендеринге. |
| 116 | + Решение — <strong>DOCTYPE switching</strong> (впервые в IE5/Mac): новый корректный рендеринг |
| 117 | + включается только при наличии «современного» DOCTYPE, а старые страницы без него |
| 118 | + продолжают обрабатываться по-старому. Так quirks mode стал музеем багов, который браузеры |
| 119 | + обязаны поддерживать до сих пор. |
87 | 120 | </p> |
88 | 121 |
|
89 | 122 | <p> |
90 | | - Поэтому сейчас следует (практически) всегда использовать <code>DOCTYPE</code> HTML5, |
91 | | - для чего просто следует добавить в начале страницы: |
| 123 | + Так выглядела декларация до HTML5: |
92 | 124 | </p> |
93 | 125 |
|
94 | 126 | <code class="code"> |
95 | | - <!DOCTYPE html> |
| 127 | + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" |
| 128 | + "http://www.w3.org/TR/html4/strict.dtd"> |
96 | 129 | </code> |
97 | 130 |
|
98 | | -<h3> |
99 | | - Источники: |
100 | | -</h3> |
| 131 | +<p> |
| 132 | + DTD — наследие SGML, на котором формально был основан HTML до версии 4.01 включительно. |
| 133 | + HTML5 отказался от SGML: его парсер описан в спецификации алгоритмически, DTD больше не нужен, |
| 134 | + поэтому декларация выродилась в короткий маркер «рендери по стандартам». |
| 135 | +</p> |
101 | 136 |
|
102 | | -<ul> |
103 | | - <li> |
104 | | - <a href="https://mega-css.com/page/doctype">Источник 1</a> |
105 | | - </li> |
106 | | - <li> |
107 | | - <a href="https://habr.com/ru/post/71364/">Источник 2</a> |
108 | | - </li> |
109 | | -</ul> |
| 137 | +<p class="info info--blue"> |
| 138 | + XHTML-документ, отданный с MIME-типом <code>application/xhtml+xml</code>, |
| 139 | + всегда рендерится в standards mode — DOCTYPE-сниффинг применяется только к <code>text/html</code>. |
| 140 | +</p> |
0 commit comments