Проблема с прозрачностью PNG в IE8

У меня проблемы с прозрачным изображением PNG, на котором видны пиксельные артефакты с размытыми черными пятнами по краю непрозрачной части изображения. Он делает это только в Internet Explorer и только из файла Javascript, в котором он используется.

Вот о чем я ... http://70.86.157.71/test/test3.htm (ссылка теперь мертва) ... обратите внимание на девушку в правом нижнем углу. В IE8 у нее есть артефакты (я не тестировал это в предыдущих версиях IE, но предполагаю, что он, вероятно, делает то же самое). Он отлично работает в Firefox и Chrome. Изображение загружается из файла Javascript для создания эффекта наведения курсора мыши.

Если вы загрузите изображение само по себе, оно будет работать нормально. Вот изображение ... http://70.86.157.71/test/consultant2.png

Как это исправить?

Изображение было создано в Photoshop CS3.

Я читал кое-что об удалении Gama, но, очевидно, это было в предыдущих версиях Photoshop, и когда я загружаю его в TweakPNG, у него нет Gama.


person user138777    schedule 09.08.2009    source источник
comment
Проблема почти наверняка вызвана тем, что вы применяете прозрачность css (через систему фильтрации, например) в конечном итоге к png, что, по-видимому, является причиной проблемы.   -  person meandmycode    schedule 09.08.2009
comment
Есть ли у вас какие-либо предложения по его изменению, чтобы он работал в IE?   -  person user138777    schedule 09.08.2009
comment
Верный. Не используйте фильтр непрозрачности (или любые другие фильтры в этом отношении), поскольку он создает артефакты.   -  person EricLaw    schedule 09.08.2009
comment
Я использую jQuery для постепенного исчезновения слайдов - в этом случае непрозрачность должна исчезать ... и сейчас все это отображается с черными краями. Каким-нибудь образом обойти это?   -  person jeffkee    schedule 16.07.2010
comment
Не могли бы вы принять ответ, чтобы я мог заблокировать это? На этот вопрос уже есть девять удаленных ответов; это привлекает много меня, тооо! и спасибо! ответы.   -  person    schedule 04.04.2011


Ответы (10)


ИСПРАВЛЕНО!

Я боролся с той же проблемой и только что совершил прорыв! Мы установили, что если вы зададите изображению цвет фона или изображение, png будет правильно отображаться поверх него. Черная рамка исчезла, но теперь у вас есть непрозрачный фон, и это в значительной степени противоречит цели.

Затем я вспомнил про преобразователь rgba to ie, с которым я столкнулся. (Спасибо Майклу Бестеру). Поэтому мне стало интересно, что произойдет, если я предоставлю своей проблеме png, т.е. отфильтрованный фон, эмулирующий rgba (255,255,255,0), полностью ожидая, что это не сработает, но давайте все равно попробуем ...

.item img {
    background: transparent;
    -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)"; /* IE8 */   
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);   /* IE6 & 7 */      
    zoom: 1;

}

Престо! Прощай, черный, и привет, работающие альфа-каналы в IE7 и 8. Добавляйте и исчезайте ваши png-файлы или анимируйте их по экрану - все в порядке.

person Dan Tello    schedule 22.10.2010
comment
У меня была та же проблема, но в моем случае белого фона было достаточно, чтобы ее обойти. Спасибо за предложение - person Quamis; 23.12.2010
comment
Объединение этого с хаком AlphaImageLoader, приведенным ниже на: hover, помогло мне. - person nickb; 05.07.2011
comment
Спасибо - у меня это сработало, но мне нужно было добавить свой фон к другому элементу в качестве дочернего элемента исходного элемента, который был затемнен ... подробности добавлены ниже. - person codeinthehole; 06.07.2011
comment
Обратите внимание, что это, похоже, только частичное исправление - Explorer все еще предварительно умножает прозрачный PNG на черный. Это означает, что если у вас есть, скажем, белая секция с непрозрачностью 50% (в PNG), а затем вы применяете любую непрозрачность (через CSS) к этому элементу, то вы увидите на самом деле СЕРЫЙ (50% белый x 100% черный) с любым уровнем непрозрачности, который вы указали в CSS. Все еще ищем реальное решение, но пока не нашли. - person Tom Auger; 28.11.2011
comment
Спасибо! Вы спасли меня, как я полагаю, потраченным впустую кучей времени. - person Ben Davis; 09.07.2012
comment
предполагая, что изображение является фоновым изображением, динамически загружаемым с помощью javascript? как я могу применить это решение? - person Ogugua Belonwu; 01.08.2012
comment
PS. Первое правило у меня не сработало в IE8, только второе. - person Johnny Everson; 22.09.2012
comment
вау, спасибо, это спасло меня от поиска решения в большей части веб-серфинга: D - person mic; 08.10.2012
comment
Привет! Я могу знать, почему это не работает для некоторых из вас. В моем случае я анимировал непрозрачность с помощью jQuery. Но знаете что! Вы можете установить только ОДНО объявление фильтра за раз (даже если вы можете поместить много фильтров в это объявление filter:). Итак, когда jQuery анимирует прозрачность, он устанавливает фильтр, перекрывая другие. Решение: оберните изображение в div; примените к изображению фильтр alphaImageLoader или градиент и анимируйте непрозрачность div. Вуаля! - person Diego; 20.09.2013

Я поместил это в плагин jQuery, чтобы сделать его более модульным (вы предоставляете прозрачный gif):

$.fn.pngFix = function() {
  if (!$.browser.msie || $.browser.version >= 9) { return $(this); }

  return $(this).each(function() {
    var img = $(this),
        src = img.attr('src');

    img.attr('src', '/images/general/transparent.gif')
        .css('filter', "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true',sizingMethod='crop',src='" + src + "')");
  });
};

Использование:

$('.my-selector').pngFix();

Примечание: это работает также, если ваши изображения являются фоновыми изображениями. Просто примените функцию к div.

person Mike Cavaliere    schedule 08.02.2011

Я знаю, что эта ветка когда-то была мертва, но вот еще один ответ на старую проблему с фоном ie8 png.

Вы можете сделать это в CSS, также используя проприетарную систему фильтрации IE:

filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true',sizingMethod='scale',src='pathToYourPNG');

ДЕМО

вам нужно будет использовать blank.gif для «первого» изображения в объявлении фона. Это просто для того, чтобы запутать ie8 и помешать ему использовать как фильтр, так и фон, который вы установили, и использовать только фильтр. Другие браузеры поддерживают несколько фоновых изображений и будут понимать объявление фона и не понимать фильтр, поэтому используют только фон.

Вам также может потребоваться поиграть с sizingMethod в фильтре, чтобы заставить его работать так, как вы хотите.

person Fresheyeball    schedule 08.08.2012

У меня было то же самое с PNG с прозрачностью, которая была установлена ​​как фоновое изображение элемента ‹A› с примененной непрозрачностью.

Исправление заключалось в установке цвета фона элемента ‹A›.

Итак, следующее:

filter: alpha(opacity=40);
-moz-opacity: 0.4;
-khtml-opacity: 0.4;
opacity: 0.4;
background-image: ...;

Превращается в:

/* "Overwritten" by the background-image. However this fixes the IE7 and IE8 PNG-transparency-plus-opacity bug. */
background-color: #FFFFFF; 

filter: alpha(opacity=40);
-moz-opacity: 0.4;
-khtml-opacity: 0.4;
opacity: 0.4;
background-image: ...;
person Josh Mouch    schedule 17.05.2012

Проблема прозрачности PNG в IE8

Решение Дэна сработало для меня. Я пытался скрыть div с фоновым изображением. Предостережения: вы не можете напрямую затенить div, вместо этого затените изображение оболочки. Также добавьте следующие фильтры, чтобы применить фоновое изображение:

-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true',sizingMethod='image',src='assets/img/bgSmall.png')"; /* IE8 */   
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true',sizingMethod='image',src='assets/img/bgSmall.png');   /* IE6 & 7 */      

Обратите внимание, что пути в атрибутах src фильтров являются абсолютными, а не относительно таблицы css.

Я также добавил:

background: transparent\9;

Это заставляет IE игнорировать мое предыдущее объявление фактического фонового изображения для других браузеров.

Спасибо, Дэн !!!

person Andrew    schedule 12.05.2011

пожалуйста, попробуйте код ниже.

 background: transparent\0/;
 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true',sizingMethod='image',src='assets/img/bgSmall.png');   /* IE7 */      
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true',sizingMethod='image',src='assets/img/bgSmall.png')"; /* IE8 */   
person Kevin G Flynn    schedule 10.04.2013

Исправление Дэна Телло сработало для меня.

Еще одна проблема, которую я обнаружил с IE8, заключалась в том, что если PNG содержался в DIV с меньшими размерами ширины или высоты CSS, чем PNG, то проблема с черным краем была повторно запущена.

Исправлено исправление CSS ширины и высоты или их полное удаление.

person zeniph    schedule 25.02.2011
comment
Это должен быть комментарий к ответу, а не собственный ответ, но это мне помогло! - person Mark Fox; 15.05.2013

Я использую исправление CSS, а не JS, чтобы обойти мой скругленный слой с прозрачным PNG внутри

Пытаться

.ie .whateverDivWrappingTheImage img {
background: #ffaabb; /* this should be the background color matching your design actually */
filter: chroma(#ffaabb); /* and this should match whatever value you put in background-color */
}

Это может потребовать дополнительной работы на ie9 или новее.

person Macomatic    schedule 30.01.2012

Просто хочу добавить (так как я искал эту проблему в Google, и этот вопрос возник первым) IE6 и другие версии делают прозрачность PNG очень уродливой. Если у вас есть PNG-изображение, которое является альфа-прозрачным (32-битным) и вы хотите показать его на каком-то сложном фоне, вы никогда не сможете сделать это просто в IE. Но вы можете правильно отобразить его на одноцветном фоне, если вы установите атрибут CSS для изображений PNG (или div) background-color таким же, как у родителей background-color.

Таким образом, это будет отображать черный цвет там, где изображение должно быть альфа-прозрачным, и прозрачным, когда альфа-байт равен 0:

<div style="background-color: white;">    
    <div style="background-image: url(image.png);"/>    
</div>

И это будет отображаться правильно (обратите внимание на атрибут background-color во внутреннем div):

<div style="background-color: white;">    
    <div style="background-color: white; background-image: url(image.png);"/>    
</div>

Сложной альтернативой этому, которая позволяет использовать альфа-изображение на сложном фоне, является использование AlphaImageLoader для загрузки и рендеринга изображения определенной прозрачности. Это работает до тех пор, пока вы не захотите изменить эту непрозрачность ... Подробнее проблему и ее решение (javascript) можно найти ЗДЕСЬ.

person Cipi    schedule 07.10.2010

Мой сценарий:

  • У меня было фоновое изображение с 24-битным альфа-png, для которого была установлена ​​привязка.
  • Якорь исчезал при наведении курсора с помощью JQuery.

eg.

a.button { background-image: url(this.png; }

Я обнаружил, что применение разметки, предоставленной Дэном Телло, не сработало.

Однако, поместив диапазон в элемент привязки и установив фоновое изображение для этого элемента, я смог добиться хорошего результата, используя разметку Дэна Телло.

eg.

a.button span { background-image: url(this.png; }
person codeinthehole    schedule 06.07.2011
comment
span не являются элементами уровня блока, как это может работать, если вы не установите display: block и height / width? - person Brenden; 17.02.2012
comment
@Brenden; если я правильно помню, я бы использовал display: block. Если якорь оборачивает div, разметка не пройдет проверку - отсюда и причина использования тега span. - person codeinthehole; 18.02.2012