Fix Blog » Blog Archive » Прозрачный PNG в IE 6

Прозрачный PNG в IE 6

Достигается на самом деле довольно-таки легко. Берем прозрачный png, берем следующий код:
<script type="text/javascript">
function fixPNG(element)
{
//Если браузер IE версии 5.5-6
if (/MSIE (5\.5|6).+Win/.test(navigator.userAgent))
{
var src;
if (element.tagName==’IMG’) //Если текущий элемент картинка (тэг IMG)
{
if (/\.png$/.test(element.src)) //Если файл картинки имеет расширение PNG
{
src = element.src;
element.src = "/blank.gif"; //заменяем изображение прозрачным gif-ом
}
}
else //иначе, если это не картинка а другой элемент
{
//если у элемента задана фоновая картинка, то присваеваем значение свойства background-шmage переменной src
src = element.currentStyle.backgroundImage.match(/url\("(.+\.png)"\)/i);
if (src)
{
src = src[1]; //берем из значения свойства background-шmage только адрес картинки
element.runtimeStyle.backgroundImage="none"; //убираем фоновое изображение
}
}
//если, src не пуст, то нужно загрузить изображение с помощью фильтра AlphaImageLoader
if (src) element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=’" + src + "‘,sizingMethod=’scale’)";
}
}
</script>
Вставляем ПЕРЕД следующим html:
<div style=”background: url(some.png) no-repeat;” class=”someclass”><a href=”#”>Ссылка</a></div>
Или таким, если png вставляется не бекграундом:
<div class=”someclass”><img src=”some.png” /></div>
Остается добавить в css следющее:
.someclass {
filter:expression(fixPNG(this));
}

Все, теперь png во всех браузерах прозрачная!
Остается добавить – что если сверху png присутствуют какие-либо ссылки, или интерактивные поля (формы и т.п.), то они будут ниже картинки и не кликабельны, решается это просто, добавляется объекту, который нужно поставить выше position: relative;
На данном примере это выглядит так:
.someclass a {
position: relative;
}



This entry was posted on Понедельник, Июнь 16th, 2008 at 2:38 пп and is filed under Fix, Новичкам. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

17 Responses to “Прозрачный PNG в IE 6”

  1. mult Says:

    спасибо, очень помогло!

  2. Jen Says:

    Спасибо, помогло, все супер. Только может я одна такая, но я не сразу сообразила, что чтобы скрипт заработал нужно его сначала в блокнот вставить (чтобы курсивное форматирование очистить). =)

  3. admin Says:

    Да, это вордпресс из меняет, писал уже тут как исправить, видимо не правильно написал, раз не помогло )

  4. Тартария Says:

    Спасибо, всё работает!

  5. AlexKey Says:

    Может быть я что то сделал не так?

    У меня в div лежит кнопка формы картинкой (ессно прозрачный PNG), так вот в ходе всех этих махинаций – да, таки заработало но наблюдается очень забавный эффект – та область картинки которая 100% прозрачна стала кликабельна, а все остальное – нет.

  6. admin Says:

    AlexKey – с z-index поиграйся, не очень понял о чем ты
    Или код дай

  7. Igor Says:

    Все хорошо, только свойству sizingMethod лучше присвоить значение crop, так как если размер контейнера больше размера фонового изображения, то оно растягивается на всю доступную область (scale), что приводит к искажениям. В этой же ситуации возникает еще одна трудность: если фоновая картинка первоначально отбита вправо внутри контейнера (div), то после "трансформации" выравнивание теряется и изображение прибивается влево :-( Как это решать еще разбираюсь.

  8. name Says:

    Ну и что толку копировать то что уже года три как написано кем то, ты бы лучше придумал как пнг прозрачную картинку положить на фон, да так что бы он понимал свойства position и repeat… каквставлять фитром картинки я думаю уже каждый дурак и каждая дурачка знает.

  9. admin Says:

    каквставлять фитром картинки я думаю уже каждый дурак и каждая дурачка знает.

    Блин если ты знаешь, это не значит что какой-нибудь начинающий вебмастер знает.

    Ну и что толку копировать то что уже года три как написано кем то

    Ты смотрю мало понимаешь в зарабатывании денег на сайте

  10. Svati Says:

    "каквставлять фитром картинки я думаю уже каждый дурак и каждая дурачка знает."

    ну что вы, дяденька)) далеко не каждый)) новичкам действительно очень в тему.

  11. Leo Says:

    а вы мне тока скажите плиз что делать с файлом gif какой он должен быть? чета ниче не поняла(((

  12. admin Says:

    Leo, гиф файл – прозрачная гифка 1×1 пиксель, вот, сохраняй изображение как
    http://www.fixblog.ru/files/blank.gif

  13. dictat Says:

    Отлично все работает! Спасибо!

  14. ruslan-ka Says:

    может всё-таки:

    если png вставляется не бекграундом:

    Остается добавить в css следющее:
    .someclass IMG {
    filter:expression(fixPNG(this));
    }

    ???

    хотя у меня и так и эдак не заработало с img. спасибо Igor’ю: "sizingMethod лучше присвоить значение crop" очень помогло.

  15. ruslan-ka Says:

    Вот исправленный, рабочий код этого способа:

    javascript:

    function fixPNG(element)
    {
    if (/MSIE (5\.5|6).+Win/.test(navigator.userAgent))
    {
    var src;
    if (element.tagName==’IMG’)
    {
    if (/\.png$/.test(element.src))
    {
    var src = element.src;
    element.style.width = element.width + "px";
    element.style.height = element.height + "px";
    element.src = ‘blank.gif’; //прозрачный однопиксельный gif
    }
    }
    else
    {
    src = element.currentStyle.backgroundImage.match(/url\("(.+\.png)"\)/i);
    if (src)
    {
    src = src[1];
    element.runtimeStyle.backgroundImage="none";
    }
    }
    if (src) element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=’" + src + "‘,sizingMethod=’crop’)";
    }
    }

    html:

    или

    css:

    .png {filter:expression(fixPNG(this));}

    Внимание! все фиксы png в IE6 не позволяют использовать повторяющийся фон! Однако фон можно тянуть (sizingMethod=’scale’), но если фон настолько примитивен, что его можно без ущерба растягивать, то, пожалуй, стоит использовать gif.

    p.s. кстати, стоит отметить, что данный способ ручного вызова функции fixPNG работает намного быстрее, чем способы которые сами находят png на странице(в результате при загрузке страницы пол-секунды видны непрозрачные картинки). При использовании же данного способа fix происходит мгновенно.

  16. ruslan-ka Says:

    в предыдущем посте фильтр съел две строчки:

    html:

    {img class="png" src="image.png" /}

    или

    {div style=”background: url(image.png) no-repeat;” class=”png”}{/div}

    { } заменить на

  17. Kotjara Says:

    А у меня ничего не получается :(
    у меня картинка на прозрачном фоне (Titul-1.png).
    Какой именно код нужно поставить и куда? перед строкой

    ???
    Ребята, помогите наовичку!

Leave a Reply

Я не спаммер.