Содержание
Попытки разработчиков IE 8 найти оптимальное решение в сущности нерешаемой проблемы — осуществить поддержку веб-стандартов и обратной совместимости с бесконечно большим количеством существующих сайтов — внести весьма много хаоса в среду веб-разработчиков.
Кроме известных трех режимов (Quirks, Standards и Almost), добавилось масса вариантов синтаксиса «чудодейстивенного» метатега (либо альтернативного HTTP-заголовка), каждому из которых теоретически может соответствовать свой режим, и все это еще ложится на плечи Doctype switching. Как же узнать в итоге, какой режим включится для рендеринга определенной страницы?
Загадочная кнопка «Compatibility view»
С выходом IE 8 beta 2 произошел весьма странный факт: кнопка включения/выключения режима совместимости периодически может исчезать. Исчезновения происходили в следующих случаях:
- когда выбора нет (страница отображается в Quirks mode, по сути одинаковом для всех версий IE начиная с 5.5, либо режим отображения жестко задан через метатег);
- для сайтов локальной зоны при настройке по умолчанию. По умолчанию для них Compatibility view включен (выключается и включается через Tools — Compatibility View Settigs) — сделано это, видимо, ради поддержки старых корпоративных интранетов. При тестировании сата в ИЕ 8 локально на Денвере не забудьте проверить эти настройки. Это очень важно!
Если сайт сверстан под стандартный режим, браузер позволяет пользователю самому выбрать, какой именно стандартный режим — старый или новый — ему лучше подходит. И кнопка появляется.
Старый доктайп
Для этих тестов использовалась специальная страница Генри Сивонена (Henri Sivonen), который написал полезную Activating Browser Modes with Doctype о переключении доктайпов. Из таблицы указанной статьи поведение ИЕ 8 бета 2 похож на поведение Оперы 8.
Неожаиданной новостью стало отображение страницы с доктайпом HTML 4.0 Transitional (со ссылкой на DTD) в полностью стандартном режиме (Opera 7.5-8 использовала для таких страниц «полустандартный» режим, а FF, Opera 9 и Chrome — и вовсе Quirks).
В остальных случаях ИЕ 8 вел себя полностью аналогично современным браузерам. То есть для доктайпов HTML 4.01 Transitional (с DTD) и XHTML 1.0 Transitional в новой бете реализован — впервые за всю историю ИЕ — «полустандартный» режим отображения. Хорошая новость для бесчисленного множества более-менее аккуратных табличных сайтов пятилетней давности — есть надежда, что «веб-апокалипсис» откладывается :).
В целом поведение ИЕ 8 бета 2 вполне логично и соответствует описанию в черновике HTML5: всегда использовать стандартный режим, если только доктайп не является одним из ограниченного списка «квирковых» (куда входит и отстутствие доктайпа) или еще более ограниченного (всего 4 шт.) списка «полустандартных». Но о полном соблюдении HTML5 говорить рано — упомянутый HTML 4.0 Transitional там входит в «квирковый» список
Вместе с новым движком, ИЕ 8 принес новое свойство document.documentMode
, специально для проверки режима совместимости. Тест учитывает его, показывая значение 5 в Quirks mode, 8 в остальных случаях. Видимо, в «полустандартном» режиме используется все-таки новейший движок рендеринга, а не тот что в ИЕ 7.
Для полноты картины я прогнал тот же тест с включенной кнопкой совместимости. Сюрпризов не было — поведение строго соответствует IE 7, значение documentMode
в «стандартном режиме» равно 7.
Метатег X-UA-Compatible
: может очень многое
Девид Дорвард провел исследование одновременного влияния и доктайпа, и метатега, на режим рендеринга. О результатах написано в статье Internet Explorer 8 Doctype and HTTP Header Switching. При тестировании сравнивались 3 доктайпа и 3 варианта метатега. Оказалось, что метатег полностью перебивает Doctype switching. Если на странице указан метатег «IE=7», то даже с объявленным доктайпом Quirks, сайт будет отображаться в стандартном режиме ИЕ 7.
Для продолжения эксперимента за основу взята та же схема, с небольшим расширением: взят набор из 4-х доктайпов — квирковый (вообще без оного), стандартный (4.01 Strict) и два переходных (HTML 4.01 и XHTML 1.0 с XML-прологом — в память о знаменитом баге IE6:) — и 4-х же метатегов: без такового, «IE=6», «IE=7» и «IE=8».
Простенький скрипт сгенерил для каждой комбинации страничку наподобие такой. Верхняя пара дивов тестирует боксовую модель, отступ под картинкой в ячейке таблицы помогает отличить новейший стандартный режим от «полустандартного» и всех предшественников, комбинация из плавающих дивов внизу и текст, добавляемый через : after
, помогают различить режимы IE8 и IE7, ну а JS-свойства document.compatMode
и document.documentMode
говорят за себя сами.
Комбинации с Quirks mode сразу бросаются в глаза белым фоном (различный фон для HTML и BODY там не действует). То, что такова вся вторая колонка, говорит о том, что метатег «IE=6» просто не работает (в принципе, своего рода хак для сброса IE в Quirks mode, но сегодня такое никому не нужно). Поведение же варианта «IE=7» подтверждает то, что страничка рендерится в стандартном режиме ИЕ 7, независимо от объявленного доктайпа (и даже его наличия).
В последней колонке, можно заметить сюрприз — первые две картинки отрисовались одинаково (в полностью стандартном режиме), а последние две чуть по-другому — в полустандартном (без отступов под картинками)!
Результат неожиданный, но объяснимый. Возможно, что ИЕ 8 умеет переключаться между тремя движками — новейшим (по умолчанию), ИЕ 5.5 (для Quirks mode), и ИЕ 7 (при явном включении режима совместимости — кнопкой или метатегом).
Метатег же «IE=8» запрещает ему использовать какой-либо движок, кроме новейшего. А поскольку в сам новейший движок заложено «особое отношение» к Transitional-доктайпам, он использует специальный вариант для них и дефолтный («самый-самый стандартный»:) — во всех остальных случаях, включая страницы без доктайпа.
Во второй бете разработчики предложили еще один вариант метатега — «IE=EmulateIE7». Отличие его от «IE=7» в том, что он реагирует на доктайп, как настоящий IE7 — Quirks-страницы с ним рисуются в Quirks mode, остальные — в режиме IE7. Трудно представить, где эта разница может сказаться на практике — разве что в каком-нибудь супер-пупер-динамическом шаблоне, который в зависимости от кучи условий может выдаваться то с доктайпом, то без него… Так или иначе, для особо ленивых верстальщиков новый вариант метатега — в лучшем случае панацея, в худшем плацебо (к слову, именно так решили проблему с IE8 создатели Google Maps ;). А вот попытка написать по аналогии «EmulateIE6» провалилась — такой метатег игнорируется начисто, будто его вообще нет.
Резюме
СТоит ли вообще использовать чудесный метатег? Старые сайты с непонятно чем в доктайпе, нормально смотревшиеся в ИЕ 6, не развалятся и вИЕ 8 — Quirks mode практически не изменился.
Разница между отображением Transitional-страниц новейшим движком (нижние ячейки первой и последней колонок) и режимом IE7 (третья колонка), конечно, есть: изменились дефолтные margin’ы многих элементов, немного иначе ведут себя float’ы, и, конечно же, добавилась поддержка многих новых CSS-свойств и псевдоэлементов.
Однако для старинной табличной верстки, где все элементы жестко фиксированы, эти различия могут и не проявиться — таким страницам тоже особо ничего не угрожает. А интранет-пользователи могут еще долго не замечать каких-либо изменений в своем привычном окружении (благодаря эмуляции IE7 для локальной зоны по умолчанию).
Получается, что наибольший риск — для сайтов «дивной» верстки в манере техлетней давности (масса float’ов и дополнительные стили для всех версий ИЕ). Именно для них актуален костыль в виде метатега (хотя лучше найти повод для редизайна и сверстать как следует:). Ну а для тех, кто ничего не знает и знать не хочет о Doctype switching-е, но умеет «методом тыка» добиваться от страничек нормального вида в IE7 (если такие вообще бывают:) оптимальный вариант — «IE=EmulateIE7» (если не поможет, то уж точно не повредит;).
Окончательные результаты приведены в таблице:
Доктайп → Метатег ↓ | Отсутствует или старый кривой | HTML 4.01/XHTML 1.0 Transitional/Frameset | HTML 4.01 Strict, XHTML 1.0 Strict и выше, HTML5 и т.д. |
---|---|---|---|
Отсутствует или некорректный (IE=4 и ниже, EmulateIE6…) | Quirks | Almost Standards (IE8) | Standards (IE8) |
IE=5, IE=6 | Quirks | Quirks | Quirks |
IE=7 | Standards (IE7) | Standards (IE7) | Standards (IE7) |
IE=EmulateIE7 | Quirks | Standards (IE7) | Standards (IE7) |
IE=IE8 и выше, IE=Edge | Standards (IE8) | Almost Standards (IE8) | Standards (IE8) |