Устранение бага с прозрачностью формата PNG в Internet Explorer (IE 5.5 и IE 6)

Пока накидаю кучу ссылок найденных в сети по этому поводу, потом надо до конца разобраться.

Тест альфа-прозрачности вашего браузера http://www.libpng.org/pub/png/pngs-img.html

Просто статьи о формате PNG:
http://www.umade.ru/log/2004/12/54.html
http://www.gagin.ru/internet/3/18.html

Как увидеть PNG с прозрачностью в Internet Explorer

На сайте Microsoft (http://support.microsoft.com/kb/294714) описан следующий способ показа PNG-файлов с прозрачностью:

<DIV STYLE="height:ВЫСОТАpx; width:ШИРИНАpx;
     filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(
     src='image.png', sizingMethod='scale');"></DIV>

Спасибо за костыли, дядя Билли. Это работает только в IE; Opera и Firefox покажут пустой блок.

Фиксация бага с помощью HTC-файла с Javascript написанным Эриком Арвидссоном (Erik Arvidsson): http://webfx.eae.net/dhtml/pngbehavior/pngbehavior.html)
Внизу странички можно скачать тестовый примерчик. Из файлов вам понядобятся только pngbehavior.htc и blank.gif.
Файлы кладутся в корень сайта, а в стилях прописываем следующую строку для тега IMG:

img {
   behavior:url("pngbehavior.htc");
}

Теперь все наши PNG-изображения при просмотре в IE будут загружаться через фильтр. Кроме того скрипт позволяет устанавливать фильтр при замене изображения через Javascript.

Есть и баг. При отсутствии у исходного PNG-файла атрибутов width и height загружаемый вместо него blank.gif естественно устанавливает размеры области в 1px и наше изображение исчезает.
Чтобы исправить это открываем файл pngbehavior.htc и правим код двух функций (мои добавления выделены жирным).
Функция propertyChanged()

function propertyChanged() {
   if (!supported || isPrinting) return;
   var pName = event.propertyName;
   if (pName != "src") return;
   // if not set to blank
   if (!new RegExp(blankSrc).test(src)) {
      realImage = new Image();
      realImage.src = element.src;
      element.width = realImage.width;
      element.height = realImage.height;

      fixImage();
   }
};
 

Функция fixImage()

function fixImage() {
   // get src
   var src = element.src;
   // check for real change
   if (src == realSrc && /\.png$/i.test(src)) {
      element.src = blankSrc;
      return;
   }
   if ( ! new RegExp(blankSrc).test(src)) {
      // backup old src
      realSrc = src;
   }
   // test for png
   if (/\.png$/i.test(realSrc)) {
      width = element.width;
      height = element.height;

      // set blank image
      element.src = blankSrc;
      // set filter
      element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft." +
                        "AlphaImageLoader(src='" + src + "',sizingMethod='scale')";
      element.width = width;
      element.height = height;

   }
   else {
      // remove filter
      element.runtimeStyle.filter = "";
   }
}
 

Теперь исправленный файл позволяет не задавать ширину и высоту изображения, а определяет их "на лету" устаналивая нужные значения для области работы фильтра. Причем это поведение сохраняется и при замене изображения JavaScript'ом.

Чтобы пофиксить баг в Drupal (собственно, ради этого мною все и затевалось) добавляем в CSS-файл темы стиль:

img {
   behavior:url("/themes/mytheme/pngbehavior.htc");
}
 

В файле патча pngbehavior.htc находим строку

var blankSrc = "blank.gif";
 

Правим ее на

var blankSrc = "/themes/mytheme/blank.gif";
 

Файлы pngbehavior.htc и blank.gif копируем в папку темы mytheme. Обратите внимание, что название папки должно совпадать с той темой, которую используете вы.

Окончательное решение проблемы

И собственно есть тотальное решение проблемы (http://jquery.andreaseberhard.de/pngFix/)
Пока не смотрел как сделано.
А какой-то добрый человек сделал модуль для друпала... :) Интересная штука сеть, велосипед в соседнем магазине, находится после того как и сам его изобрел.

PNG Fix для Drupal (http://drupal.org/project/pngfix)
Который почему-то не работает с background... Установил, включил, добавил стили и селекторы использующие PNG в background-image. Видно, что патч работает... Фоны в IE исчезли вообще. Потом удалось разобраться, что проблема в том что в блоке с неустановленными явно размерами, данный fix приводит к тому, что слой сжимается толи в ноль, то ли в однопиксельную точку. Поэтому, применяя его необходимо обязательно задавать размеры блока в стилях.

Фоновые изображения

Обстоятельная статья Цыгырлаша Игоря на тему PNG-прозрачности. http://www.tigir.com/alpha_png.htm
В частности в ней и предлагается метод устранения этого бага для фоновых картинок с помощью Ява-скрипта. Для этого определяется CSS селектор для элементов с PNG-фоном вида:

селектор { filter:expression(fixPNG(this)); }

Далее к документу присоединяется JS-файл, содержащий эту функцию. Функция проверяет изображение у нас или фоновая картинка и если это формат PNG, то соответствующим образом загружает его через фильтр.
Собственно, и предыдущий метод использует Javascript, только он спрятан в отдельном HTC-файле. Правда, решение с HTC-файлом мне нравится больше. Изящнее что ли. Постараюсь переделать решение Игоря для фоновых картинок в таком виде.

Исчо сцылочки

http://msdn2.microsoft.com/en-us/library/ms532969.aspx

http://designcollector.ru/png
http://www.mongus.net/pngInfo/
http://www.howtocreate.co.uk/alpha.html
http://www.twinhelix.com/css/iepngfix/

http://www.pzone.ru/docs/web/graphics/png.html

А то на собственных проектах такие косяки. :)

А если только в CSS?

А если использовать только CSS, тогда возможно сделать прозрачными PNG для всех броузеров??? Где-то видела, но не могу вспомнить! А вы что скажете!

Кроме IE 6...

Там только через DXImage. Иначе никак. :(

Drupal

Спасибо за обьяснение!
Сам столкнулся с этой грустной проблемой в Друпал. Пытался даже поковырять пхп-коды...
Оказалось, все решается проще.

спасибо даже не

спасибо даже не думал что все решается так просто.

Автору распект.

Автору распект.

Очень полезная

Очень полезная информация! Спасибо огромное!

А если у нас png

А если у нас png файл выводится при помощи $logo в шаблоне, работает все так же?
У меня почему-то не вышло.

Советую

Советую попробовать IE PNG Fix http://www.twinhelix.com/css/iepngfix/ Вторая версия пока жутко глючная,но мне хватает возможностей первой.

Вот еще только

Вот еще только что нашел http://drupal.org/project/pngfix

спасибо, с этой

спасибо, с этой получилось

Microsoft PowerPoint-е

Microsoft PowerPoint-е делал слайд и сохранил в формате .ppt. Теперь надо, чтобы этот файл был в сайте, и анимация работала. Как можно преобразовать этот файл на gif формат?

При сохранении

При сохранении файла PPT можно в числе форматов найти графический GIF, потом его преобразовать в PNG.

я нефига не

я нефига не поняла(((

Тогда, боюсь - это неизлечимо

:)

Хотя заметка сумбурна и не дописана, тут как минимум два решения проблемы + друпаловское + модуль. Еще есть масса ссылок на разные источники.

Что именно вы не поняли? Если все, то остается сомневаться в вашей способности понимать вообще. Если что-то конкретное, то задавайте детальные вопросы, а не расписывайтесь в собственной немощи.

Или думаете из жалости буду разъжёвывать все по новой?

По поводу модуля для друпала

http://drupal.org/project/pngfix
- у меня не заработал, лучше юзать
http://drupal.org/project/pngbehave
бэкграунд подхватил сразу

на мой взгляд лучшее решение.

Пользуйтесь на здоровье.
http://www.web-utils.net/javascript/png-bug-fix-transparancy-ie6

Устранение бага png

Устранение бага png прозрачности описано тут http://kinglogic.ru/content/view/124/74

Где оно только не описано.

Один из способов и то не самый общий.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <s> <u> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. Beside the tag style "<foo>" it is also possible to use "[foo]".
  • Images can be added to this post.

Подробнее о форматировании

CAPTCHA
Защита от спама: ответьте на вопрос.
Image CAPTCHA
Enter the characters shown in the image. Ignore spaces and be careful about upper and lower case.