Ноябрь 17, 2008Объявления, заявления, и прочие декларации
написано в рубрике: Профессиональные заметки; 00:48
Сейчас буду жаловаться. Долго и со вкусом. Начну издалека.
Театр начинается с вешалки, а страница html — с объявления типа документа, для краткости именуемого «доктайп» (document type declaration). Точнее, должен начинаться — в сети можно встретить немало сайтов без доктайпа. Ничего хорошего в этом нет; если сайт уже свёрстан без доктайпа, его лучше не трогать, но создавать заново лучше с доктайпом. Кстати, страницы без доктайпа трудно править, почему — расскажу дальше.
Доктайп сообщает браузеру данные о языке, на котором написан документ: тип языка (html/xhml), версию (html 4.1/xhtml 1.0), направление (strict, transitional, frameset). Для обработки документа существует набор формальных правил, «известных» браузеру. Если браузер получает правильный доктайп, он обрабатывает страницу в соответствии с этими правилами (в режиме стандартов). Если не получает или получает неправильный, он переходит в режим обратной совместимости и начинает обрабатывать код, как разработчики положили на его браузерную душу. Судя по результатам, души у браузеров сильно разные.
Откуда браузер знает эти правила? Об этом должны заботиться его разработчики. Формальное описание каждой из разновидностей html публикуется Консорциумом W3C, и на эти описания равняются разработчики браузеров. Или должны равняться: самый популярный браузер Internet Explorer до сих пор не полностью поддерживает стандарты w3c. Обещал исправиться к седьмой версии, но этого не сделал. Обещает исправиться к восьмой.
Итак:
- Что делает доктайп?
- Сообщает тип документа.
- Кому?
- Браузеру.
- Зачем?
- Для обработки кода по одинаковым правилам (по стандартам).
- Кому от этого польза?
- Прежде всего, верстальщику.
Поведение документа, свёрстанного по стандартам, предсказуемо и более-менее одинаково для всех основных браузеров; говорю «более-менее», потому что про баги IE не слышал только ленивый, однако даже с IE легче справляться в режиме стандартов. Кроме того, в режиме обратной совместимости не действует ряд возможностей css, доступных в режиме стандартов. Первое, что даёт себя знать при переходе в режим обратной совместимости — обработка полей и отступов, например, перестают работать отрицательные margin’ы, а также нарушается наследование свойств шрифтов (таблицы и табличные ячейки не наследуют размер шрифта). Если при починке сайта вы видите, что у вас шрифты ведут себя не так, как ожидалось, проверьте доктайп (вообще-то с этого надо начинать работу).
Отдельная песня — работа со страницей, которую верстал кто-то другой, и верстал с неправильным доктайпом или вообще без оного: такую страницу легче переверстать с нуля, чем «вот тут немножечко поправить». В режиме обратной совместимости браузеры понимают правки кто в лес, кто по дрова, а при попытке поставить правильный доктайп имевшаяся вёрстка может просто рассыпаться. Починка такой страницы порой напоминает работу пастуха: стоит зазеваться, как одна овца (браузер) бежит туда, другая — сюда, и как их поймать — неизвестно, а усилия по сохранению старой вёрстки напоминают смесь героизма с мазохизмом.
Поэтому доктайп, и только доктайп должен стоять в начале html-документа! Причём правильный. На своих личных сайтах я обычно применяю доктайп языка xhtml 1.0 strict (строгий):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">В шаблонах, свёрстанных для чужих сайтов, я применяю доктайп xhtml 1.0 transitional (переходный):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">Эти два вида доктайпа относятся к синтаксису xhtml. Для синтаксиса html применяются:
<!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 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">или
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">Спрашивается, откуда такая несправедливость? Требование жизни. На моих сайтах я отвечаю за каждый символ, и не допущу на них ничего такого, что могло бы оскорбить их стриктовую нравственность. Но я отлично знаю, что на сайте, отданном в чужие руки, очень быстро появятся баннеры и просто исходящие ссылки с атрибутом target, а контент-менеджеру рано или поздно кто-нибудь подскажет чудесные теги font, center, и прочие прелести, относящиеся к категории deprecated (нежелательных). Направление transitional их допускает, а strict — нет. Повлиять на будущих хозяев сайта я не могу, и потому готовлю его к суровым реалиям жизни. А сайты, находящиеся под моей непрерывной опекой, могут позволить себе быть чистоплюями.
Надо сказать, что использование нежелательных (deprecated) элементов и атрибутов никаких фатальных последствий не несёт, даже если на сайте стоит строгий доктайп. Обещают, что когда-нибудь в будущем браузер будет карать за отступления от стандарта отказом обрабатывать документ, но пока это будущее не видно даже на горизонте, и вопрос о нежелательных элементах носит идейный характер, а не практический. Но что простительно админу сайта, то непростительно верстальщику.
Ещё добавлю, что использование визуальных редакторов и html-текста часто приводит к тому, что на сайтах появляются куски кода, не влезающие ни в какой стандарт, даже в transitional; например, когда div или p запихивают в span. Однако и тут последствия носят локальный характер и полной гибели сайта не влекут.
Однако в жизни бывают случаи намного более серьёзные, чем использование нежелательных элементов, и даже серьёзней, чем запихивание div в span. Бывает, что нехорошие или просто несведущие люди посягают на самое святое, что есть на странице — на доктайп! И сейчас я поведаю несколько случаев, когда мне довелось столкнуться с последствиями.
Я тогда была совсем зелёной, и это был мой первый опыт передачи собственной вёрстки в чужие руки. Свёрстанный шаблон был принят заказчиком и отправлен программисту для натяжки на движок. Спустя время приходит письмо от программиста: в ФФ и Опере всё нормально, а в IE6 (IE7 ещё не вышел) всё разъехалось. «Разъехалось» — самое мягкое слово для описания того, что произошло со страницей! Я, как начинающий, очень переживала от мысли «а что про меня люди подумают», и вцепилась в глючную страницу в поисках ошибки. В стилях не было ничего, способного вызвать такое расползание; не понимая, что происходит, я стала сравнивать размётку страницы с размёткой моего шаблона — строчку за строчкой. Разницы не было, но нумерация строк оказались сдвинута на одну. Я поднялась выше, в самое начало документа, и увидела на первой строке не мной вписанный код:
<?xml version="1.0" encoding="utf-8"?>Я убрала строчку, и страница приняла нормальный вид. С этим я столкнулась впервые, но теорию мне преподали крепко, и я вспомнила, что эта строчка называется «декларация xml», и что в html страницах она не нужна.
Дело в том, что для xml-совместимых документов пролог состоит из двух частей: необязательная декларация xml и обязательный доктайп. Современные браузеры понимают декларацию xml, но IE6 не терпит перед доктайпом ничего, и на эту декларацию реагирует переходом в режим обратной совместимости. Что и произошло в данном случае.
Я указала программисту корень зол; оказалось, что ему кто-то сказал, что так полагается по стандартам. Да, полагается; только IE со счетов сбрасывать нельзя.
Снова свёрстанный мной сайт, снова обращают внимание на некорректное поведение страницы — теперь во всех браузерах: центральная часть макета, трёхячеечная таблица с шириной 100%, стала растягиваться не по ширине документа, а по ширине окна, чего не должно было быть (при малом окне справа за его границей оставалось чистое поле). Я уже была опытнее, и когда поняла, что страница ведёт себя нестандартно, двинулась проверять доктайп. Оказалось, неведомый злодей заменил его на свой (должно быть, более привычный). Я сказала: «Ну, знаете!..», вернула свой доктайп, и страница заработала нормально.
Самый страшный случай в моей жизни. Можно сказать, кошмарный.
Я делала вёрстку под систему управления контентом rbcsoft. Всё шло чин-чинарём — блочная резиновая вёрстка, чистота кода (требования заказчика), дело дошло до прикрутки. И тут оказалось, что на страницах с моими шаблонами не работает функционал — почтовые формы и голосования. Сравнение моих шаблонов со стандартными, имевшимися на сайте, показало, что некий системный тег, который я, как здравомыслящий верстальщик, сохранила, но поставила после доктайпа, обеспечивает работу голосовалки только тогда, когда идёт в документе первым! (Он выводил строчку кода наподобие <!–a45b6ec4d4a3c–>.)
Ужасу моему не было предела. Пришлось вывернуться наизнанку и написать файл хаков специально для IE, чтобы страница нормально отображалась в режиме обратной совместимости — работоспособность функционала была важнее. А на странице фотогалереи я попросила не использовать голосовалку, потому что закруглённые уголки для изображений в нестандартном режиме сверстать было невозможно (или сверхсложно). «Качественная вёрстка» пошла насмарку; к тому же система управления вставляла в код страницы кучу лишних спанов с нестандартными атрибутами; зачем — не знаю! До сих пор мне хочется верить, что это был просто кошмарный сон, и не более…
Посты по теме
6 комментариев »
Сергей М. — Ноябрь 17, 2008 || 15:28
Вот это в ИЕ точно выбешивает - пока что все XHTML страницы ими не являются, ведь нельзя использовать объявление XML…
[Ответить на этот комментарий]
Княгиня — Ноябрь 17th, 2008 || 15:44
Ага, а ещё он не поддерживает тип содержания (mime-type) application/xhtml+xml. Шестой не поддерживал, седьмой не поддерживает, восьмой, говорят, тоже поддерживать не будет… А с другой стороны, ходят слухи, что на передовую выйдет не xhtml, а html5. Однако выйдет он, или нет, а только мне удобнее работать с xml-совместимыми версиями: там, где правила строже, проблем меньше.
Сергей М. — Ноябрь 17, 2008 || 16:10
А вот это, как я понимаю, еще неизвестно. И в xhtml, и в html5 будут новые семантические теги, причем и там, и там добавление некоторых - избыточно, а других - очень хотелось. Вот соединить бы их лучшие качества
![]()
ИЕ8 вроде как объявление xml будет поддерживать, да и мим должен бы. Не знаю, надо на бете посмотреть. В принципе, если даже только первое, то пойдет - значение этой конструкции превуалирует над другими.
Аня — Ноябрь 17, 2008 || 20:55
Когда читала анонс возможностей HTML 5, чуть слюнями не изошла — там обещалось много функций, которые ну просто давным-давно просились.
Княгиня — Ноябрь 17, 2008 || 21:55
Одним словом, дожить бы. И желательно прийти ко всем этим светлым будущим не инвалидом, рухнувшим под бременем настоящего.
Avatara — Февраль 9, 2009 || 06:29
Тоже ожидаем html5, черновая спецификация уже есть, ну и баги то же. Скажем, все проходит по валидации и стопорит в кодировку () Убираешь кодировку - Валидирует, но жалуется на отсутствие этой строчки. Замкнутый круг…
Комментировать