Наболевшие CSS баги в IE6

8 февраля 2010 года | Вёрстка, Мысли

Наболевшие баги IE6

Несомненно IE6 был лидером в поддержке всех свойств CSS в далёком 2001 году, а это почти 9 лет назад! И сегодня он хоть и потерял свою популярность, но процент его использования ещё не настолько мал, чтобы полностью его игнорировать. Мне как и многим другим разработчикам, до сих пор присылают письма, с текстом жалобы, что некрасиво отображается или вообще что-то не работает в их любимом браузере IE6.

Хоть и в большинстве своих проектов, поддержку старья свожу к минимуму, все равно полностью отказаться не могу. Да и заказчик желает «удовлетворить» всех посетителей.

Напомню всех основные проблемы IE6, и надеюсь, что в ближайшем будущем, я вместе с вами буду улыбаться и радоваться, что нет больше таких проблем. Поехали:

Коробочная модель (Блочная модель)

Это, наверное, самая распространенная и самая назойливая «болячка» IE6 и младшеньких (хоть они уже и покоятся с миром). Допустим вы оформляете блок следующим образом:

div#box {
  width: 100px;
  border: 2px solid black;
  padding: 10px;
}

Современные браузеры выделят 124px на всю ширину блока (2px + 10px + 100px + 10px + 2px). А наш любимый старичок IE6 задаст только 100px на всё (и границы, и отступы), и сожмет содержимое внутри.

Согласитесь, такие расчёты могут не слабо поломать всю структуру вёрстки. В какой-то мере, может даже показаться, что действия IE логичны, но нет, они не соответствуют правилам спецификации W3C.

Чтобы решить данную проблемы, можно добавить внутрь нашего блока новый слой div и ему применить нужные отступы, вместо главного блока. Или просто изменять отступы для внутренних элементов, при этом отказавшись от границ и отступов основного блока.

Двойной отступ

Сразу начну с примера, допустим нам нужно прижать блок вправо, и добавим отступ в 20px:

div#box {
  float: right;
  padding-right: 20px;
}

IE6 увеличит отступ в два раза. Сделает его равным 40px, вместо требуемых 20px. Опять же, это может поломать весь макет страницы. Об этом баге также все знают, и придумали исправление. Нужно добавить свойство display: inline; в наш div. Хотя это решение не совсем приемлемое, так как inline-элементу нельзя задать ширину.

Поэтому, если вам действительно нужно добавить отступ, то лучше пользуйтесь обвёрткой в которой и укажите нужный отступ. А может у вас есть своё решение данной проблемы?

Нет min/max-width/height

Установка минимальной (максимальной) ширины (высоты), является обычным и логичным свойством, но опять же из-за нашего IE6 приходится отказываться от использования либо применять хаки. Стоит заметить, что эксплорер не просто неправильно считает эти свойства, он их игнорирует. Правильнее сказать — не поддерживает.

А ведь это такое полезное свойство. Например нам нужно, чтобы футер был не менее 100px высотой, и при этом увеличивался, если количество контента в нём превосходило его границы. Для такого как раз и предназначено свойство min-height.

Как же лечить эту ошибку. В данном случае решение есть. Так как свойство height в IE6 имеет особый пересчет, то можно в отдельном файле стиле указать для блока просто высоту блоку. И она будет увеличиваться при наполнении контентом.

Замечание: Если прописать высоту в основном стиле, то в современных браузерах блок тянуться не будет.

Вот такой своеобразный хак для IE6.

Hover-события

Современные браузеры поддерживают hover-событие для каждого элемента, но, как уже догадались, не IE6. Браузер IE6 поддерживает только псевдо-класс :hover для тега <a> с обязательным присутствием атрибута href.

Для решения проблемы, нужно использовать специальные скрипты, которые будут эмулировать это свойство.

Отсутствие поддержки полупрозрачности в PNG24

Главная проблема, это отображение полупрозрачности в PNG24. С обычной прозрачностью IE6 справляется, иногда, даже лучше чем с GIF. А вот для борьбы с правильным отображением полупрозрачности у меня собран целый архив, скриптов и разнообразных фиксов.

Но вот, недавно наткнулся на полезный фикс-скрипт DD_belatedPNG, который теперь использую у себя в блоге. Какие же у него преимущества:

  • Маленький размер (~7 кбайт), для пользователей старья думаю не помеха.
  • Всего один скрипт, без использования behavior в стилях.
  • Удобство перечисления тегов, которые нужно обработать.

Добавлять ссылку на скрипт нужно, через условные комментарии:

<!--[if lt IE 7]> Инструкции для IE 5.0, 5.5 или 6 <![endif]-->

Подведу итоги

Можно сказать, что все основные проблемы в IE6 решаемы, или частично решаемы. А моей главной философией, это создание сайтов на новейших технологиях, но при этом старые браузеры должны умеренно отображать подобие макета, пусть и без «плюшек и рюшечек».

  • http://rendermarket.com Сергей

    спасибо за пнг :)

  • divbyzero

    Всегда рад помочь. =)

  • http://divbyzero.com.ua/thought/2010/02/09/sozdanie-stilej-tolko-dlya-ie/ Создание стилей только для IE / Вёрстка / Блог divbyzero

    [...] продолжении статьи про назойливые баги в IE6 хотелось бы дополнить статью полезной [...]

  • http://divbyzero.com.ua/thought/2010/02/23/naglyadnyj-primer-vyorstki-v-ie6/ Наглядный пример вёрстки в IE6 / Вёрстка / Блог divbyzero

    [...] если вы новичёк, то рекомендую вам ознакомится с моей недавней статьёй, которая вам поможет избавится  от этих негодований.И [...]

  • http://divbyzero.com.ua серього из киева

    1) Довольно встречаемый баг: ссылка с иконкой на фоне, которой задано свойство position: relative; background: url(…) no-repeat left center;

    Картинка в ie6 будет срезаться наполовину, и ничем ее нельзя сдвинуть вправо, она все равно будет срезаться. Для фикса надо для ie6 указать position: fixed;

    2) Есть вертикальное меню с жестко заданной высотой каждого элемента меню. В ie6 высота может отличаться и быть больше. Для фикса надо использовать для всех элементов меню zoom: 1;

    3) Вован, по спецификации CSS такого свойства block: inline не существует, есть display: inline;. А margin-right работать не будет, используй padding-right.

  • divbyzero

    Да действительно перепутал block и display. И насчёт padding-right тоже всё верно.

    Тестировал все ошибки в тестере, так как установленной IE6 нет.

    Спасибо, ошибки исправил.

  • XAKER

    Все-таки реально нравится мне Ваш блог. Всегда очень интересно читать.