# 透明PNG背景图片CSS设置

- Link: https://yjyj.net/learn/990.html
- Published: 2008-11-10T23:57:59+08:00
- Author: 小 虾

⚡ 生猛大蝦编辑部 · 30 秒核心看点

 * IE6 不认 PNG 透明，核心靠 AlphaImageLoader 滤镜补救。
 * 用 html>body 和 * 选择器分流，分别给现代浏览器与 IE 写样式。
 * 滤镜会影响链接按钮可用性，且不支持背景重复，切图要更精确。

应用PNG图片的透明或半透明的特性能做出非常漂亮的网页来。Firefox和Opera对PNG的支持
非常的好，都是IE却无视PNG图片这一特性的“存在”，虽然IE7已经支持都是IE6还是不行。查
了一些资料，基本解决了这一问题。
 虽然有让IE6支持PNG透明背景的JS程序，都是不是很
方便，还是用CSS来实现的好。使用到的就是： IE5.5+的AlphaImageLoader滤镜

引用内容
 语法： filter : progid:DXImageTransform.Microsoft.AlphaImageLoader ( enabled
=bEnabled , sizingMethod=sSize , src=sURL ) 属性： enabled : 可选项。布尔值(Boolean)。
设置或检索滤镜是否激活。true | false 　　　　　　true : 默认值。滤镜激活。 　　
false : 滤镜被禁止。

sizingMethod : 可选项。字符串(String)。设置或检索滤镜作用的对象的图片在对象容器
边界内的显示方式。 crop : 剪切图片以适应对象尺寸。
 　　　　　　　　image : 默认
值。增大或减小对象的尺寸边界以适应图片的尺寸。 　　　　　　　　scale : 缩放图片
以适应对象的尺寸边界。 　　　　　　　　src : 必选项。字符串(String)。使用绝对或
相对 url 地址指定背景图像。假如忽略此参数，滤镜将不会作用。

说明：
 在对象容器边界内，在对象的背景和内容之间显示一张图片。并提供对此图片的剪切
和改变尺寸的操作。如果载入的是PNG(Portable Network Graphics)格式，则0%-100%的透明度
也被提供。 PNG(Portable Network Graphics)格式的图片的透明度不妨碍你选择文本。也就是说，
你可以选择显示在PNG(Portable Network Graphics)格式的图片完全透明区域后面的内容。

了解了以上的内容，可以写一段简单的CSS代码（还不是完全正确的代码）：

引用内容

#div1 {
 height: 600px; width: 260px; padding: 20px; background-repeat: repeat; 
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod
=scale, src=”bj1.png”

}

这段简单的CSS代码就可以在IE中正常的显示PNG透明背景，但是会发现在FF下不会出现背景，
分析原因：
 AlphaImageLoader滤镜只能被IE支持，FF是不支持该滤镜的 有些初次写的时候
很多人会这样： 在代码中添加这样一段： background-image: url(bj1.png); 添加这样一段
代码虽然能解决FF下的问题，都是IE又出现问题：新的背景会覆盖在滤镜的背景之上，导致
滤镜显示无效，这时候就用到IE和FF对CSS读取的区别特性了： Firefox、Opera等完全支持
PNG透明图片的浏览器也支持子选择器（>），而IE不识别（包括IE7），所有我们可以通过这
来定义Firefox、Opera等浏览器中PNG图片的样式。代码如下：

引用内容
 html>body #div1 { background-repeat: repeat;background-image: url(bj1.
png); }

同时，我们通过只有IE才识别的通配符（*），来定义IE浏览器中的滤镜。代码如下：

引用内容
 * #div1 {filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled
=true, sizingMethod=scale, src=”bj1.png”)

}

而#div1 {}就放一些IE和FF共用的设置来减少代码文件的大小。最终就是这样：

引用内容
 #div1 { height: 600px; width: 260px; padding: 20px; background-repeat:
repeat;

}

html>body #div1 {
 background-repeat: repeat;background-image: url(bj1.png); } *#
div1 {filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod
=scale, src=”bj1.png”)

}

需要注意的是：AlphaImageLoader滤镜会导致该区域的链接和按钮无效，解决的办法是为链
接或按钮添加：position: relative;这样条代码，使其相对浮动。AlphaImageLoader无法设置
背景的重复，所以对图片的切图精度会有很高的精确度要求。

其实使用PNG透明特性做网页主要解决的问题是IE6对PNG图片的读取，需要应用滤镜：
 filter:
progid:DXImageTransform.Microsoft.AlphaImageLoader ( enabled=bEnabled , sizingMethod
=sSize , src=sURL ) 写法的例子： * #container #header {filter: progid:DXImageTransform.
Microsoft.AlphaImageLoader(enabled=true, sizingMethod=image, src=”http://www.fruit0769.
com/bj.png”);

}
 同时为了让FF单独读取背景（FF不支持滤镜，当是支持PNG透明特性），单独写段CSS： 
html>body #container #header{ background-image: url(h_bj.png); } 星玄宇告诉我还有
更好的优化写法，可以减少IE7下的读取速度：用*html #来单独为IE6写滤镜的代码，html>
body 可以同时被IE7和FF读取，这样就让IE7避免滤镜的使用以加快读取速度。我还没有测试。
在做PNG的皮肤中，PNG文件的切图要求很高，最好做到精确的切图和层的设置。链接失效的
问题不仅仅可以在链接CSS里设置相对定位，也可以对该内容所在的层进行相对定位设置。

❓ 延伸问答与排错指南（FAQ）

IE6 下 PNG 透明背景怎么实现？

可用 IE5.5+ 的 AlphaImageLoader 滤镜处理 PNG 透明效果，把图片作为背景载入。常见写法
是在 IE 专用规则里设置 filter，并配合 sizingMethod 控制缩放方式。这样能让老旧 IE
显示透明 PNG，但不适合所有场景。

为什么给背景同时写 background-image 和滤镜会冲突？

因为现代浏览器会正常读取 background-image，而 IE 还会执行滤镜，结果可能出现背景覆盖
或显示异常。更稳妥的做法是用选择器分流：现代浏览器走 background-image，IE 走 filter，
公共样式单独放在基础规则里。

AlphaImageLoader 有哪些实际限制？

它会导致该区域内的链接和按钮可能失效，通常需要给相关元素加 position: relative; 处理；
另外它不支持背景重复，所以对切图精度要求很高。适合做固定尺寸、透明效果明确的区域，
不适合复杂平铺背景。

📚 【[前端杂烩](https://yjyj.net/category/css)】专栏延伸阅读与热门精选（[全站文章归档](https://yjyj.net/archive)）：

 * [根据时段自动切换CSS风格](https://yjyj.net/css/986.html)
 * [div下图片自适应解决方法](https://yjyj.net/css/552.html)
 * [div透明](https://yjyj.net/css/1165.html)
 * [关于chrome下css3给宋体设置阴影的问题](https://yjyj.net/css/1560.html)
 * 热门必读[俩月了, DMIT 终于补货了!](https://yjyj.net/share/7795.html)
 * 热门必读[跨境电商 AI Prompts](https://yjyj.net/ad/7723.html)

## Comments

### By: 小 虾

- Link: https://yjyj.net/learn/990.html/comment-page-1#comment-1266
- Published: 2008-11-17T15:07:49+08:00

俺决定放弃ie6了.
 让ie6去死吧!

### By: 蝎子

- Link: https://yjyj.net/learn/990.html/comment-page-1#comment-1262
- Published: 2008-11-17T13:24:12+08:00

链接失效的问题，是因为被滤镜“遮住”了，对它进行相对定位是为了让它“浮上来”
 不过这
也导致很多问题，比如有时候一个层并相对定位的话布局就会出错，可是不相对定位链接又
会失效的情况。。。。囧

所以最好的解决办法还是少用alpha透明的png做背景。。。
