Коробка с cюрпризами
Сначала мы боялись, потом вроде взяли себя в руки, приняв происходящее за простые и понятные фокусы. Сегодня пришло время удивляться снова — фокусы IE8 с переключением режимов рендеринга оказались хитрее, чем казалось поначалу. Что же мы знаем про магическую директиву X-UA-Compatible?
- Эта директива в виде элемента
<meta>должна присутствовать в документе. - В ней должно быть указано одно из двух типов значений:
IE=x, гдеx— это обозначение желаемой версии движка или специальное ключевое словоEmulateIE7. - …и, в общем-то, всё.
Давайте проверим, скормив IE8 простой документ:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"><head><title>IE=x</title><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=x"/><style type="text/css">BODY[class*='page'] {background:#090; /* IE8 и прочие современные */}*:first-child+HTML .page {background:#FC0; /* IE7, исключительно */}* HTML .page {background:#C00; /* IE6 и младше */}</style></head><body class="page"></body></html>
Меняя значение IE=x последовательно — 8, 7, 6 — мы переключаем режимы рендеринга IE и получаем такой светофор. Красивую расцветку обеспечили нам специальные CSS-фильтры для каждой версии IE:
E[att*='val']— IE8 и прочие современные браузеры, селектор выборки подстрок атрибутов из черновика CSS 3. Да-да, из черновика, который IE8 не собирался поддерживать…*:first-child+HTML E— IE7, исключительно. Просто милый хак, в очередной раз обыгрывающий странное понимание разработчиками IE понятия корневой элемент.* HTML E— IE6 и младше, знаменитый Star HTML Hack, что бы мы без него делали.
Ну что — пока без сюрпризов, почти скучно. А давайте-ка подключим к документу фавиконку. Вставим её куда-нибудь в элемент <head>, произвольно:
<head><title>IE=x</title><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/><link rel="shortcut icon" type="image/x-icon" href="favicon.ico"/><meta http-equiv="X-UA-Compatible" content="IE=x"/></head>
…и вот здесь начинается самое интересное — все документы позеленели, при любых значениях IE=x. И это фактически означает то, что IE8 просто перестал воспринимать директиву X-UA-Compatible.
Нет, дело совсем не в фавиконке. Дело в новом расположении элемента <meta> с нашей чудо-директивой. Теперь мета-информация о режиме рендеринга документа становится известна после появления первых элементов самого документа и успешно игнорируется.
В ходе тестов выяснилось, что предшествовать директиве могут только мета-элементы и <title> — по сути тоже часть мета-описания документа. Все остальные варианты расположения директивы делают её абсолютно неработоспособной.
Эксперименты это конечно хорошо, но хочется знать наверняка, поэтому полчаса копания в MSDN дали однозначный ответ в статье «Defining Document Compatibility» — все предположения оказались верны:
Являясь регистронезависимым, заголовок X-UA-compatible, тем не менее, должен находиться в секции HEAD страницы перед всеми остальными элементами, за исключением title и других мета-элементов.
Вывод из всей этой истории напрашивается следующий: для успешной борьбы, врага нужно знать в лицо. Пусть даже ценой чтения сомнительной документации по MSHTML.
Комментарии
17Спасибо, Вадим
Вадим, спасибо за статью!
Исправьте, пожалуйста, в примере незакрытый тег :)
Упс, забыл пресловутый сурс указать.
Незакрытый тег
<html>Немного не в тему, но может кому-то поможет в будущем.
Заметил такую вещь, характерную для семейства IE.
Если в обычном CSS файле задать у любого элемента свойство background
то любой браузер, кроме IE, отображает бэкграунд, а IE напрочь отказывается это дело.
Проблема оказалась в отсутствующем пробеле после скобки, т.е.:
Спасибо, надо проверить везде, где ужё успел вставить :)
О боги! Эта трабла станет хитом в форумах в ближайшие годы :)))
А если не указывать директиву, то движок будет от ie8 ? Если это так и например мне нужен именно такой режим, то можно тогда не указывать эту директиву?
Спасибо. Действительно будущий хит.
Отличная штучка из разряда «делайте всегда вооот так и проблем не будет». Итак, всегда ставим все мета-теги до тайтла и радуемся. Всё равно мета-тег, указывающий кодировку должен там стоять, вот и остальные пускай не разбредаются.
@stolho: С пробелами в css IE вообще своеобразно обходится. Так что тоже желательно ставить их везде, где не запрещено, имхо. Хуже не будет, а от необходимости помнить о потенциальных траблах самообороняемся.
Вот-вот, именно поэтому при тестировании и не напарывался на эту проблему — аккуратизм и последовательность помогли )
это напоминает глюк с доктайпом в IE6. прям родовое проклятие Майкрософт ;)
Для IE7 есть более изящный хак: *+HTML -- я был уверен, что та о нем знаешь :)
Исторически сложилось, что IE7 не приходится хакать, поэтому на уме был какой-то древний пример )
Pepelsbey, давно читаю ваш блог, и вы не перестаете радовать.
После прочтения статьи взял за правило вставлять в шапку страницы такой код
после чего правлю верстку под ie6-7 и не заморачиваюсь с отображением под ie8.
Спасибо автору. Сразу же после прочтения заточил свои шаблоны под ие8.
Спасибо, учитывая то что IE8 взломали за первый же день......тут нечему и удивляться, как ни обещали Microsoft конфетку так и не слепили...
Привет из будушего! У нас уже есть IE11 и он весьма хорош.