Vitaly Harisov ([info]harisov) wrote,
@ 2006-08-07 18:12:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Entry tags:tip, web

Универсальная поддержка полупрозрачности в MSIE6-

MSIE6- полупрозрачные PNG не поддерживает, это всем известно. Как обойти это с помощью AlphaImageLoader тоже всем известно. Но обычно описывается или решение в лоб, когда для каждого PNG-24 указывается в стиле AlphaImageLoader с конкретным URL к картинке, или громоздкое решение со скриптом.

Искал сегодня универсальное решение, чтобы не надо было ни прописывать для каждой картинки свой собственный AlphaImageLoader, ни применять внешние скрипты (мало того, что там написано дофига, так это ещё и внешний файл + используется прозрачный GIF).

Нашёл такое решение:

HTML:

<img class="png" src="/path/to/your.png" alt="different story"/>

CSS

img.png {
    background-image: expression(
        this.runtimeStyle.backgroundImage = "none",
        this.runtimeStyle.filter =
            "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" +
            this.src + "', sizingMethod='image')",
        this.src = "/path/to/transparent.gif"
    );
}

Вроде бы то, что надо. Но, во-первых, оно у меня не заработало :), во-вторых, используется прозрачный GIF (т.е. + ещё один HTTP запрос), а в-третьих, нет поддержки MSIE5.

Думал, пыхтел, пробовал, ругался.

В итоге родилось такое решение:

<i class="png"><img src="image.png" alt="Image"/></i>

HTML код чуть больше, чем в предыдущем примере. Сейчас станет понятно почему. Самое главное, как обычно, в CSS:

* html .png
{
    width: expression(this.firstChild.width);
    filter: expression("progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+
            this.firstChild.src+"', sizingMethod='image')");

    background: expression("transparent url("+
            this.firstChild.src.replace(".png", ".gif")+") no-repeat");
    backgr\ound: none !important;
}

* html .png img
{
    behavior: expression(this.style.visibility="hidden");
}

Теперь по порядку:

  1. Используем * html, чтобы стили применялись только в MSIE6-.

  2. Задаём width, ибо AlphaImageLoader работает только если заданы размеры блока. Причём ширину блоку задаём равной картинке, которая лежит внутри этого блока (this.firstChild.width). Ещё вместо ширины можно задать position: absolute или float: left/right.

  3. filter'ом загружаем PNG, беря src из картинки. Это работает в MSIE-5.5+

  4. Для MSIE-5.0, который не понимает AlphaImageLoader, задаём background, заменяя в имени картинки .png на .gif. Т.о. для MSIE-5.0 надо иметь вторую картинку с обычной прозрачностью, лежащую рядом с полупрозрачным PNG.

  5. Скидываем background для MSIE-5.5+, используя backgr\ound.

  6. А теперь скрываем оригинальную картинку. Причём скрываем её не просто через visibility: hidden, а через expression, чтобы это отработало только при включеных скриптах.

Итак, что получилось:

  • Нормальные браузеры показывают PNG-24 as is.

  • MSIE-5.5 и MSIE-6.0 со включеными скриптами и картинками показывают PNG-24 через AlphaImageLoader.

  • MSIE-5.5 и MSIE-6.0 со включеными скриптами и отключеными картинками показывают PNG-24 через AlphaImageLoader, ибо ему пофигу, что картинки отключены. :) Это и хорошо!

  • MSIE-5.5 и MSIE-6.0 с отключеными скриптами показывают картинку на сером фоне. Оно и правильно, чудес не бывает, нет скриптов — нет и компотика.

  • MSIE-5.0 со включеными скриптами и картинками показывают GIF фоном. Нет полупрозрачности, но это лучше, чем ничего.

  • MSIE-5.0 со включеными скриптами и отключеными картинками картинку не показывает. Ну, тут ничего не поделаешь.

  • MSIE-5.0 с отключеными скриптами и включеными картинками показывает картинку на сером фоне.

Вот пример. По хорошему, картинку для MSIE-5.0 надо рисовать отдельно, убирая из макета тени и уменьшая количество цветов. Я просто убрал тень у оригинальной картинки, немного высветлил и сохранил как gif.

Считаю, что это оптимальное решение и теперь буду использовать только его.




(87 comments) - (Post a new comment)


[info]johnny_the_kid
2006-08-07 06:25 pm UTC (link)
прикольно, надо будет опробовать. респект как минимум за усидчивость!

(Reply to this) (Thread)


[info]harisov
2006-08-07 06:27 pm UTC (link)
А пример написать-то я забыл! Сейчас сделаю.

(Reply to this) (Parent)


[info]genetiq
2006-08-07 07:52 pm UTC (link)
никого не хочу обидеть, но баян. учите матчасть.

(Reply to this) (Thread)


[info]johnny_the_kid
2006-08-07 08:06 pm UTC (link)
ссылку на первоисточник не скинете?

(Reply to this) (Parent)

Может и баян.
[info]harisov
2006-08-08 07:15 am UTC (link)
Попрошу ссылку на такое решение.

(Reply to this) (Parent)(Thread)

(no subject) - [info]katyaloxyr, 2008-07-16 08:50 pm UTC

[info]maoos
2006-08-08 12:46 am UTC (link)
Респект! Возьму на заметку

(Reply to this)


[info]wixus
2006-08-08 03:33 am UTC (link)
думаю, что многие (если не все) кто юзал пнг24 делали такое. а вот не сделаете ли вы ман по прозрачности пнг заданной backgound-image:url(png.png) ? ;)

(Reply to this) (Thread)

AFAIK это невозможно.
[info]harisov
2006-08-08 07:27 am UTC (link)
Спасают только position: relative/absolute и z-index.

(Reply to this) (Parent)(Thread)

Re: AFAIK это невозможно. - [info]bpxf5lae, 2006-08-11 03:18 pm UTC
Re: AFAIK это невозможно. - [info]harisov, 2006-08-11 03:30 pm UTC
Re: AFAIK это невозможно. - [info]semivaloff, 2008-07-24 12:56 pm UTC
Re: AFAIK это невозможно. - [info]harisov, 2008-07-24 12:57 pm UTC
Re: AFAIK это невозможно. - [info]semivaloff, 2008-07-24 01:05 pm UTC
Re: AFAIK это невозможно. - [info]semivaloff, 2008-07-24 01:06 pm UTC
Вас в Гугле забанили? - [info]harisov, 2008-07-24 01:11 pm UTC
Re: Вас в Гугле забанили? - [info]semivaloff, 2008-07-24 01:25 pm UTC

[info]chupa88
2006-08-08 07:30 am UTC (link)
.opaque {
background-image:url(back.png);
// background-image:none;
// filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='back.png',sizingMethod='scale');
}

только проблема в том, что в ИЕ картинка фона будет растягиваться по всей площади бокса.

(Reply to this) (Parent)(Thread)

(no subject) - [info]harisov, 2006-08-08 07:34 am UTC
(no subject) - [info]chupa88, 2006-08-08 07:52 am UTC
(no subject) - [info]harisov, 2006-08-08 07:54 am UTC
(no subject) - [info]bpxf5lae, 2006-08-11 03:20 pm UTC
(no subject) - [info]harisov, 2006-08-11 03:32 pm UTC
(no subject) - [info]bpxf5lae, 2006-08-11 03:33 pm UTC
(no subject) - [info]bpxf5lae, 2006-08-11 03:53 pm UTC
(no subject) - [info]harisov, 2006-08-11 03:55 pm UTC
(no subject) - [info]bpxf5lae, 2006-08-11 04:04 pm UTC
(no subject) - [info]harisov, 2006-08-11 07:00 pm UTC
(no subject) - [info]bpxf5lae, 2006-08-11 03:15 pm UTC
(no subject) - [info]chupa88, 2006-08-11 03:17 pm UTC
(no subject) - [info]bpxf5lae, 2006-08-11 03:30 pm UTC
(no subject) - [info]bpxf5lae, 2006-08-12 03:13 am UTC
(no subject) - [info]harisov, 2006-08-12 07:36 am UTC
(no subject) - [info]bpxf5lae, 2006-08-12 11:25 am UTC
(no subject) - [info]razetdinov, 2007-12-18 04:00 pm UTC
(no subject) - [info]harisov, 2007-12-18 04:04 pm UTC

[info]73r
2006-08-08 07:06 am UTC (link)
Клево. Молодец. В закладки

(Reply to this)


[info]chupa88
2006-08-08 07:27 am UTC (link)
По моему, вот идеальное решение: http://homepage.ntlworld.com/bobosola.

(Reply to this) (Thread)


[info]harisov
2006-08-08 07:32 am UTC (link)
Это "идеальное" решение имеет те проблемы, о которых написано в начале поста (загрузка внешнего файла, нет поддержки MSIE5), которые я решал, ища другой метод.

(Reply to this) (Parent)(Thread)

(no subject) - [info]chupa88, 2006-08-08 07:35 am UTC
(no subject) - [info]chupa88, 2006-08-08 07:36 am UTC
(no subject) - [info]harisov, 2006-08-08 07:45 am UTC
(no subject) - [info]harisov, 2006-08-08 07:40 am UTC
(no subject) - [info]chupa88, 2006-08-08 07:41 am UTC
(no subject) - [info]harisov, 2006-08-08 07:45 am UTC
в закладки
[info]advertizer
2006-08-08 08:05 am UTC (link)
Я пробовал с AlphaImageLoader. Только под IE 5 не тестировал.

(Reply to this)


[info]pepelsbey
2006-08-08 09:05 am UTC (link)
Хм. Отличная штука ;)

2 chupa88: Подгрузка .htc имеет серьёзный недостаток — файл почему-то не кешируется и запрашивается с сервера для каждой картинки на странице. Остаётся только посчитать траф...

(Reply to this) (Thread)


[info]harisov
2006-08-08 09:11 am UTC (link)
У chupa88 в примере не используется htc, там pngfix.js. Только, насколько я вижу, если страница будет большая, то pngfix.js загрузится быстрее и не применится ко всем картинкам.

(Reply to this) (Parent)


[info]iderins
2006-08-08 09:16 am UTC (link)
Гм... надо будет попробовать.

Не до конца понятно, чем шило лучше мыла.
Обычно я использвал «громоздкое решение со скриптом».

Пока я вижу, что приведенное решение короче на пару абзацев, не использует внешний ява-скрипт (но без включенных скриптов тоже не работает), не использует прозрачный gif (хотя, как правило, это «частоиспользуемая» картинка, и он лежит в кеше).

Но если приведенный ход работает быстрее и меньше грузит процессор: то почему бы и нет? Надо попробовать.

Вопрос: а как отнесутся к * html остальные броузеры (текущие и ожидаемые)?

(Reply to this) (Thread)


[info]harisov
2006-08-08 09:24 am UTC (link)
Для меня прозрачный гиф не является "частоиспользуемой картинкой", у меня в вёрстке их нет.

* html понимает только MSIE-4.0 - MSIE-6.0. В MSIE-7.0 этот баг парсера уже исправили. Т.ч. этот фильтр можно спокойно использовать для написания правил только для MSIE6-.

Остальные браузеры это определение парсят, но применять его не к чему. Из-за того, что FF парсит * html и ругается на cursor: hand я использую сейчас всегда два файла, один для MSIE, подключаемый через условные комментарии, второй для всех.

(Reply to this) (Parent)(Thread)

(no subject) - [info]iderins, 2006-08-08 09:41 am UTC
(no subject) - [info]harisov, 2006-08-08 09:44 am UTC
(no subject) - [info]iderins, 2006-08-08 09:47 am UTC
(no subject) - [info]harisov, 2006-08-08 09:51 am UTC

[info]nely_snork
2006-08-09 06:34 am UTC (link)
Спасибо за описанное решение. Уже вчера пригодилось, но по ходу тестирования возник вопрос: решение работает только при XHTML 1.0 Strict в DOCTYPE?!
У меня не получилось оживить Png в IE6 ни в HTML 4.01 strict, ни (что удивило еще больше) в XHTML 1.0 Transitional!

(Reply to this) (Thread)


[info]harisov
2006-08-09 07:52 am UTC (link)
Действительно, если MSIE в Standard Mode, то не работает. Я всегда перевожу его в Quirks Mode, вставляя xml-prolog (так проще поддерживать MSIE5), вот и не заметил.

(Reply to this) (Parent)(Thread)

(no subject) - [info]nely_snork, 2006-08-09 08:08 am UTC
(no subject) - [info]harisov, 2006-08-09 09:06 am UTC
Глючный MSIE - [info]harisov, 2006-08-21 11:57 am UTC
(no subject) - [info]suvlehim_takac, 2006-08-09 08:47 am UTC
(no subject) - [info]harisov, 2006-08-09 09:09 am UTC

[info]r_a_d
2006-08-16 06:55 am UTC (link)
Вот только если вынести стиль в отдельный подключаемый файл, то нифига не работает :(

(Reply to this) (Thread)


[info]r_a_d
2006-08-16 07:04 am UTC (link)
Сорри, где-то наглючил с копированием :)

(Reply to this) (Parent)


(Anonymous)
2006-08-25 07:44 pm UTC (link)
Почему-то не работает :( В чём может заключаться причина?

(Reply to this) (Thread)


[info]harisov
2006-08-25 07:46 pm UTC (link)
MSIE в Standard Mode? Не отрабатывает почему-то второй шаг (width: expression(this.firstChild.width)), надо задавать позиционирование или float.

В Quirks Mode всё работает, я использую именно его для MSIE6-.

(Reply to this) (Parent)


(Anonymous)
2006-12-12 11:11 am UTC (link)
Здорово! Большое спасибо!!! Работает!!!

(Reply to this)


[info]andrewnalin
2007-01-12 02:29 pm UTC (link)
по гуглу по этой теме ты на 1ом месте в выдаче результатов поиска

(Reply to this) (Thread)


[info]harisov
2007-01-12 02:31 pm UTC (link)
С каким запросом?

При таком http://www.google.com/search?client=opera&rls=en&q=png+MSIE&sourceid=opera&ie=utf-8&oe=utf-8 на 8.

(Reply to this) (Parent)(Thread)

(no subject) - [info]andrewnalin, 2007-01-12 02:48 pm UTC
gif
(Anonymous)
2007-04-23 05:29 pm UTC (link)
А зачем вообще использовать гиф? Он же в любом случае больше весит.

(Reply to this) (Thread)

Re: gif
[info]harisov
2007-04-24 10:08 am UTC (link)
Для иконок 16x16 GIF эфективнее, чем PNG-8.

(Reply to this) (Parent)(Thread)

Re: gif - (Anonymous), 2007-04-24 08:02 pm UTC
Re: gif - [info]harisov, 2007-04-25 08:13 am UTC
Re: gif - (Anonymous), 2007-04-25 04:03 pm UTC
Вот и примеры - [info]harisov, 2007-04-25 04:11 pm UTC
Re: Вот и примеры - (Anonymous), 2007-04-25 06:27 pm UTC
Re: Вот и примеры - (Anonymous), 2007-04-25 06:33 pm UTC

(Anonymous)
2007-05-15 01:31 pm UTC (link)
Чувак, большой тебе респект с прицепом!
Если б ты знал как ты подмог мне! ПАСИБ ТЕБЕ ОГРОМНОЕ! :)

(Reply to this) (Thread)


[info]harisov
2007-05-15 01:35 pm UTC (link)
Пожалуйста.

(Reply to this) (Parent)


(Anonymous)
2007-07-13 05:22 am UTC (link)
А я вот это юзаю PNG-прозрачность в IE 5.5-6 (http://www.tigir.com/alpha_png.htm)

(Reply to this)

глючит
(Anonymous)
2007-10-28 09:42 am UTC (link)
Ошибка: "this.firstChild.scr" -есть null или не является объектом :(((

(Reply to this) (Thread)

Re: глючит
[info]harisov
2007-10-29 12:10 pm UTC (link)
Покажи HTML код.

(Reply to this) (Parent)


[info]350d
2008-01-08 09:54 pm UTC (link)
Чтобы фон у PNG в IE был не серым, а определенного цвета - надо в самом PNG прописать параметр bKGD заодно удалив параметр gAMMA.

(Reply to this) (Thread)


[info]sambuev
2008-11-30 07:13 pm UTC (link)
Пожалуйста помогите изменить стандартный серый цвет на белый, чтобы вообще не использовать разные ухищрения и скрипты!
У меня тематический микро блог и я думаю что пользователи ИЕ6 там будут редко и то по ошибке.

(Reply to this) (Parent)(Thread)

Re: Reply to your comment... - [info]350d, 2008-12-01 12:24 am UTC
Re: Reply to your comment... - [info]sambuev, 2008-12-01 01:09 am UTC
Re: Reply to your comment... - [info]350d, 2008-12-01 01:18 am UTC

(87 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…