Alpha 透明 PNG(对于那些从 Photoshop 保存的人来说,称为“PNG-24”)对网页设计师来说是一件了不起的事情。我们可以创建一个带有阴影的按钮,它会将阴影叠加在下面任何地方,即使背景发生变化。这看起来可能微不足道,但实际上并非如此。Alpha 透明度为设计师打开的可能性很多。问题是,正如您可能意识到的,Internet Explorer(IE < v7)不支持 Alpha 透明 PNG。您越深入思考,就会发现越令人沮丧。幸运的是,多年来出现了一些方法来帮助我们解决这些旧版本的 IE。以下是其中一些技术概述。
注意:所有这些技术最终都会使用 Microsoft AlphaImageLoader 过滤器强制透明度。这些技术只在如何以及何时应用该过滤器方面有所不同。
对特定 CSS 类使用 AlphaImageLoader 行为
Internet Explorer 支持一种名为“行为”属性的“自定义扩展”,该属性可以扩展 CSS。其他主要浏览器都不支持此功能,因此您可以利用浏览器特异性,仅对需要 PNG Hack 的浏览器强制执行此操作。此技术使用一大块非验证 CSS,该 CSS 本质上使用 AlphaImageLoader 过滤器强制执行透明度。
请记住,您可能需要在两个地方应用透明度:内联图形 (<img>) 和 CSS 背景图像。使用此技术,您可以将行为应用于特定 CSS 类(例如“.png”),然后根据需要选择性地应用该类,也可以将行为全局应用于所有 img 元素。
还要注意,虽然这适用于 CSS 背景图像,但不适用于以任何方式重复或定位的图像。
有关此技术的更多信息
Komodo Media:使用背景图像替换图像
SNIPPLR:对 IE 使用过滤器,对 Mozilla 使用属性选择器
行为和引用 HTC 文件
此技术最棒的一点是,您只需在 CSS 文件中使用一行引用“.htc”文件即可。行为会神奇地将必要的 Microsoft 专有代码应用于所需页面元素,您将在 IE 中获得 Alpha 透明 PNG。
有关此技术的更多信息
Twin Helix:IE PNG 修复
使用 Javascript
由于 Javascript 具有神奇的能力来监控和浏览页面上的所有元素,因此它非常适合用于查找和应用网站上的任何类。选择这种方法有两个非常令人信服的原因。首先,您可以有条件地应用 Javascript,使其仅针对需要它的 IE 版本加载。第二,它与 HTC 方法一样“设置一次,一劳永逸”。第三,它没有任何无效之处,因此您无需担心代码或 CSS 无法通过验证。第四,Javascript 能够看到添加到页面的“新”内容(例如 AJAX)并相应地做出反应。以前的技术只对页面的初始加载有效。
有关此技术的更多信息
24 Ways:超级轻量级
Google Code 上的 PNGHack
这真是一个很棒的资源,Chris。我一直在计划近期研究一下 IE PNG Hack,但我一直没时间。现在我不用再自己研究了。:) 谢谢!
您还可以将 JavaScript 方法与 CSS 文件中的一行代码结合使用。我经常使用以下代码:
#some-element { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/path/to/image/some-graphic.png', sizingMethod='crop'); }
正如您指出的,缺点是您无法定位图形,也无法重复图形,但通过创造性地使用图形,您通常可以实现所需的效果。
我还应该指出,您可以通过创建可以垂直或水平拉伸的图像,并使用 sizingMethod=’scale’(这会导致图像拉伸)而不是 sizingMethod=’crop’(这会导致图像裁剪)来欺骗重复效果。
您可以在有条件注释的样式表中包含此规则,也可以使用 * html 过滤器。
对解决此最令人烦恼的问题的一些更有用方法的精彩回顾。尽管 IE 6 及更早版本中的透明 PNG 提供了一系列可能性,但我们仍然倾向于避免对背景图像使用此技术——结果似乎充其量也不一致。
需要注意的一个常见问题是禁用的锚点标签——尤其是当设计需要使用透明 PNG(应用了 JavaScript 过滤器)作为应用于 body 或容器 div 的大型背景图像时。在某些情况下,这种组合会导致页面上的所有链接被禁用。当 sizingMethod 设置为“scale”时,这种情况最常发生,如上文 chipgrafx 所述。
我们尝试了多种方法来解决此问题,大多数方法都涉及向受影响的锚点标签应用额外的 CSS 属性。应用定位和 z-index 似乎是最常见的,不幸的是,这增加了另一个(不必要的)复杂步骤来解决 IE bgsleight 方法;不幸的是,这些策略似乎都没有提供始终可靠的解决方案。
@Boxcar Studio:感谢您提到这一点。这尤其令人恐惧,因为即使您成功地让透明度生效,您的链接也可能会以更狡猾的方式受到影响,导致链接中断或其他页面元素无法聚焦。
嘿,Chris,这里有一个很棒的网站和资源,
我在我的最新主题 Rainbow Feather(用于 WordPress)中遇到了 PNG 透明度问题。它在 Internet Explorer 6 中出现了问题,我花了数周时间才修复它。
我在渐进背景上使用了半透明 png——如果您有兴趣查看,可以访问 http://www.h4x3d.com/themes/feather/
@jez:非常酷的主题!菜单区域在 IE 中看起来与在 FF 中完全不同,我几乎更喜欢 IE 中的显示效果,但两者都有效。使用条件样式表可以实现这种效果,太酷了。
我刚要开始在互联网上搜索“PNG-Hack”的详细信息。我可能仍然会为 ie6 提供无聊的 gif,但这确实是一个很好的起点。
嗨,Chris!!!
像往常一样,阅读您的博客对我这个初学者设计师帮助很大,我在 PNG 透明度方面一直遇到很大的麻烦,所以我总是倾向于使用 GIF。
我似乎总是无法应用这些 Hack,我认为我并没有完全理解。
因此,如果您能制作一个屏幕录像来解释其中一些技术,或者您认为最好的技术,那就太棒了。对于普通图像和背景也是如此。
非常感谢您的一切!!!
这个主题仍然可以提问吗?