我已经习惯了这样的想法,如果我想/需要以跨浏览器的方式使用 alpha-trans PNG,我在 div 上使用背景图像,然后在仅限 IE6 的 CSS 中,将背景标记为“无”并包含正确的“过滤器”参数。
还有其他方法吗?更好的方法?有没有办法用 img 标签而不是背景图像来做到这一点?
我已经习惯了这样的想法,如果我想/需要以跨浏览器的方式使用 alpha-trans PNG,我在 div 上使用背景图像,然后在仅限 IE6 的 CSS 中,将背景标记为“无”并包含正确的“过滤器”参数。
还有其他方法吗?更好的方法?有没有办法用 img 标签而不是背景图像来做到这一点?
底线是,如果您希望 PNG 中的 alpha 透明度,并且您希望它在 IE6 中工作,那么您需要应用 AlphaImageLoader 过滤器。
现在,有很多方法可以做到这一点:浏览器特定的 hack、条件注释、Javascript/JQuery/JLibraryOfChoice 元素迭代、通过 UserAgent 嗅探的服务器端 CSS 服务......
但是所有这些都归结为应用了过滤器并删除了背景。
这很可能是“最好的”方式。但请记住,IE6 在处理 PNG 文件时不能正确实现的不仅仅是 alpha-trans;由于 IE 未正确实现伽玛,色彩空间已损坏,因此 PNG 文件通常显示比应有的“暗”。
我们在最近的一个项目中实现的另一种“解决方案”是用“toGif”类标记每个 png 图像,在其 CSS 中调用自定义行为 .htc,如果浏览器是,则将 .png 扩展名更改为 .gif检测为我们已标记为问题的问题。我们只是在同一路径中包含每个 PNG 的 GIF 版本,如果发现浏览器不能正确处理 PNG,它会将其替换为图像的 GIF 版本。因此,我们牺牲了 alpha 混合,以保证完全透明和色彩准确性,并且只有在我们知道它可能不会按原样看起来正确时才这样做。
这可能不是一个理想的解决方案,但我想这是跨浏览器的本质。
编辑:实际上,现在我查看了有问题的项目,我们为一个名为“alpha”的 img 类使用了 .htc 行为,它自动在图像上抛出正确的过滤器。因此,您正在使用 javascript 而不是仅 IE6 的纯 CSS hack 来检测浏览器,因此它可能会更优雅一些......但它基本上是一样的。
有关如何编写 DHTML 行为的介绍,请尝试此链接。
这是我喜欢的特定解决方案,使用 Javascript (jQuery):
http://jquery.andreaseberhard.de/pngFix/
它很容易添加到现有网站,处理各种图像(表单按钮、背景、常规 IMG 标签等),并使您的 CSS 美观整洁。
图像加载器是 IE6 唯一可用的修复程序。请注意,它对 PNG 的支持非常初级(与 IE7 一样),并且无法正确处理循环透明背景。在尝试使用透明容器设计网站时,我学到了这一点。当然,在 Firefox 中完美运行。
对于小范围的背景和任何透明的前景图形,该修复应该是可以的,但我再次建议不要设计一个使用 Internet Explorer 使用大量透明度的网站。
最后我的解决方案是为 IE 显示一个平面颜色,但为其他浏览器保留透明度。幸运的是,最终没有对设计造成太大伤害。
另一种解决方法是使用 2 个单独的图像,例如 GIF 和透明 PNG,并相应地定位您的 CSS:
/* for IE 6 */
#banner {
background:url(../images/banner.gif);
}
/* for other browsers */
html > #banner {
background:url(../images/banner.png);
}
IE 6 不理解 CSS 子选择器,所以会忽略该规则,而理解它的浏览器会给你一个很好的透明 PNG。
唯一的缺点是您必须有两个单独的图像,并且设计在跨浏览器时可能看起来不完全相同,但只要它看起来没有损坏就可以了。
这里有 2 个不使用 AlphaImageLoader 过滤器的选项。
对我来说,如果仅将乱码 .gif 发送到 IE6 是不可行的,我会使用Fireworks 将 IE6 友好的调色板添加到 .PNG。
img 元素的常用解决方案是将 src 更改为指向 1x1 像素的透明 GIF,然后使用相同的过滤器 hack。