Информационные технологииStfw.Ru 🔍

Как в браузере IE6 добавить рисунок с прозрачностью в формате PNG?

🕛 23.01.2009, 00:33
Благодаря наличию в PNG-24 встроенного альфа-канала, изображения в этом формате поддерживают до 256 уровней прозрачности. Это позволяет создавать истинные полупрозрачные картинки, а также плавные переходы от прозрачной области к непрозрачной. Однако браузер Internet Explorer 6 напрямую не поддерживает эту возможность и чтобы ее реализовать приходится прибегать к различным ухищрениям.
На рис. 1 показано как выглядит картинка с прозрачностью в браузере Internet Explorer 6 (IE6), а на рис. 2 то же изображение в остальных браузерах. В частности, старшие версии IE уже корректно работают с PNG-24.



Рис. 1. Вид картинки в формате PNG-24 в браузере IE6



Рис. 2. Вид картинки в формате PNG-24 в остальных браузерах

Заметно, что в IE6 имеется паразитный фон, от которого и требуется избавиться. Для этой цели нам понадобится прозрачный однопиксельный рисунок в формате GIF и небольшая программа на JavaScript.

Сам рисунок выводится как обычно, но к тегу <IMG> добавляем свой класс opacity, для которого в стилях указываем behavior: url("iepngfix.htc"). Атрибут behavior позволяет в стилях выполнять программы на языке JavaScript, оформленные в виде специального файла с расширением htc (пример 1). 

Пример 1. Вывод прозрачного рисунка в формате PNG

HTML 4.01CSS 2.1IE 6IE 7Op 9.5Sa 3.1Ff 3.0

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>IE6, PNG и прозрачность</title> <style type="text/css"> BODY { background: #666; /* Цвет фона */ } IMG.opacity { behavior: url("iepngfix.htc"); /* Механизм для вызова скрипта */ } </style> </head> <body>
 <p><img src="images/op.png" alt="Северо-запад" width="155" height="219" class="opacity"></p>
 </body>
</html>Содержимое файла iepngfix.htc показано в примере 2.

Пример 2. Файл iepngfix.htc

<public:component>
<public:attach event="onpropertychange" onevent="propertyChanged()" />
<script type="text/javascript">
var supported = /MSIE (5\.5)|[6789]/.test(navigator.userAgent) && navigator.platform == "Win32";
var realSrc;

// Путь к прозрачному однопиксельному рисунку в формате GIF
var blankSrc = "transparent.gif";

if (supported) fixImage();
function propertyChanged() { if (!supported) return; var pName = event.propertyName; if (pName != "src") return; if (! new RegExp(blankSrc).test(src)) fixImage();
};

function fixImage() { var src = element.src; if (src == realSrc) { element.src = blankSrc; return; } if (! new RegExp(blankSrc).test(src)) { realSrc = src; } if (/\.png$/.test(realSrc.toLowerCase())) { element.src = blankSrc; element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='scale')"; } else { element.runtimeStyle.filter = ""; }
}
</script>
</public:component>
Результат использования кода показан на рис. 3.



Рис. 3. Вид изображения в браузере IE6

Атрибут behavior не входит в спецификацию CSS и поддерживается только браузером IE, поэтому желательно скрывать от валидатора стилевой код. Это можно сделать с помощью условных комментариев <!-[if IE]> и <![endif]->, которые понимает только браузер IE. В примере 3 показано их добавление.

Пример 3. Использование условных комментариев

HTML 4.01CSS 2.1IE 6IE 7Op 9.5Sa 3.1Ff 3.0

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>IE6, PNG и прозрачность</title> <style type="text/css"> BODY { background: #666; /* Цвет фона */ } </style> </head> <body>
<!-[if lte IE 6]> <style type="text/css"> IMG.opacity { behavior: url("iepngfix.htc"); /* Механизм для вызова скрипта */ } </style>
<![endif]->
 <p><img src="images/op.png" alt="Северо-запад" width="155" height="219" class="opacity"></p>
 </body>
</html>Конструкция if lte IE 6 означает, что применять нижеследующий код следует только для версии IE меньше или равной 6. Из-за того, что в контейнере <STYLE> использование условных комментариев запрещено, они выносятся в <BODY>.

Все рецепты HTML и CSS   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉