Новый PNG хак для IE6
Суть проблемы
Как известно, IE 6 не поддерживает альфа-канал (т.е. полупрозрачность) в PNG. Обычно для правильной обработки PNG применяются фильтры на основе AlphaImageLoader. Однако, этот метод обладает рядом серьёзных недостатков, начиная от плохой поддержки CSS и заканчивая сильными «тормозами» при отрисовке и изменениях размеров страницы.
Решение
На наше счастье, не так давно появился новый метод, основанный на VML. За счет конвертирования PNG в вектор удалось добиться великолепных результатов. Основные достоинства:
- быстрая обработка, которая производится только один раз при загрузке страницы;
- полная поддержка CSS: background-image, background-position, background-repeat, z-index и псевдокласса :hover;
- небольшой размер (~5Kb);
- простота использования.
Подробнее об использовании
На странице проекта DD_belatedPNG всё подробно описано, правда по-английски, поэтому объясню основные моменты. И так, для того, чтобы использовать хак, нужно скачать библиотеку и поместить её в папку вашего проекта.
Затем, нужно добавить в шапку на каждой странице, где применяется PNG, следующий код:
<!--[if IE 6]>
<script src="DD_belatedPNG.js"></script>
<script>
DD_belatedPNG.fix('.png_bg');
</script>
<![endif]-->
Теперь нужно изменить путь к библиотеке DD_belatedPNG.js на тот, который используется в вашем проекте. Кроме того, вместо значения .png_bg нужно перечислить через запятую все CSS селекторы, с которыми используются PNG-файлы (если вы не понимаете о чём я, настоятельно рекомендую ознакомиться со спецификацией CSS). Особо ленивые могут просто вписать туда универсальный селектор * (звёздочка). Правда, это несколько замедлит обработку.
Подводные камни
Есть один небольшой момент, который первоначально чуть было не заставил меня отказаться от этого метода. Мне нужно было задать фоновое изображение, которое появлялось бы при наведении курсора на ссылку, т.е. использовался примерно такой код:
a:hover {
background: url("img.png") 0 0 no-repeat;
}
Проблема была в том, что изображение img.png не обрабатывалось, в то время как в других местах всё работало отлично. Оказалось, что img.png загружается не вместе со страницей, а позже, при активации псевдокласса, т.е. при наведении курсора на ссылку. Из-за этого библиотека «забывала» его обрабатывать.
Решается этот досадный недочет следующим образом. Везде, где возможно, нужно использовать спрайты. Если же для ссылки предусмотрено только одно фоновое изображение, воспользуйтесь «псевдоспрайтом», который позволит загрузить и обработать изображение, а потом использовать его, как задумывалось. Взгляните на пример, я думаю, вы быстро поймете что к чему.
a {
background: url("img.png") -9999px 0 no-repeat;
}
a:hover {
background: url("img.png") 0 0 no-repeat;
}
Возможно, в скором времени этот недочёт будет устранён, следите за обновлениями.
Источник
Сам я узнал об этом методе в блоге rmcreative.ru.
ambientos, 9 апреля 2009 9:32 Ссылка на комментарий
Интересный у тебя вырисовывается сайт. Так держать)
>>Оказалось, что img.png загружается не вместе со страницей, а позже,...
Мдаа)) Открытие прям сделал) Я когда не дошел до такого решения, как спрайты, использовал прелэудинг на джаваскрипте... А потом, даже не подозревая, что у этой методики есть название, стал вырезать одну картинку для обоих состояний таких ссылок.
Вот все хочу разобраться в этих технологиях рисования VML и SVG, да как-то все руки не доходят. А ведь надо)
Максим Яковлев, 9 апреля 2009 9:51 Ссылка на комментарий
Спасибо
Ну не открытие конечно, просто в тот момент я об этом забыл. А когда вспомнил, применил спрайт и всё сразу заработало.
Анастасия Токочакова, 29 мая 2009 17:51 Ссылка на комментарий
<!--[if IE 6]>-->
Эксепшены никогда не помогали сделать жизнь лучше.
Да и вообще не уважаю я эксплорер...
Анастасия Токочакова, 29 мая 2009 17:52 Ссылка на комментарий
А и... Макс, классный сайтик у тебя
Главное блог на опере не забрось!
Максим Яковлев, 29 мая 2009 19:49 Ссылка на комментарий
Спасибо
Я и не собирался забрасывать, только пишу редко, так уж получилось
А ИЕ, помоему, сейчас уважают только те, кто любит пошаманить
и некоторые «старики», которые к нему привыкли. Хотя, надо сказать, что 8 версия получилась довольно неплохая, так что я смог наконец-то отказаться от поддержки 6 и 7
alexpts, 22 августа 2009 11:41 Ссылка на комментарий
Много крови IE порой пьет, сайт, действительно привлекательный
Holy Diver, 21 сентября 2009 23:05 Ссылка на комментарий
Да, хак хороший, но если в минуту несколько раз менять backgroundPosition для создания движения — хак начинает вести себя неадекватно.
Максим Яковлев, 21 сентября 2009 23:40 Ссылка на комментарий
Тут уж, как говориться, не до жиру. Хорошо, что хоть что-то есть.
Khlyupin, 23 сентября 2009 14:54 Ссылка на комментарий
А скриптец то старенький, около двух лет ему
Максим Яковлев, 23 сентября 2009 20:09 Ссылка на комментарий
Ничего, ИЕ6 ещё старше
А если быть точным: 0.0.1a released 2008.12.07.
Anton, 4 ноября 2009 17:36 Ссылка на комментарий
Очень жаль что этот скрипт не поддерживает таблицы. Тем страннее, что для ие6 вестка лучше смотрится именно на них
Максим Яковлев, 4 ноября 2009 22:58 Ссылка на комментарий
А при чём тут таблицы? Первый раз слышу про такое.
Roof, 1 марта 2010 20:42 Ссылка на комментарий
проверял в ietester в версии ie6 — мой png вообще исчезает.
Максим Яковлев, 2 марта 2010 5:40 Ссылка на комментарий
Значит фикс был неправильно подключен или ещё какие-то причины нашлись.