猿吟鹤唳本无意,不知下有行人行

在IE6下 png背景图片透明和插入图片透明兼容解决

写在前面的话:我曾经找了个JS解决了png在IE6下的不透明。可是后来在做某个登录页面时,写了两个按钮的背景图片和Hover是两个不同圆角的,加上了JS可是按钮图片在碰触hover的时候出现的背景图片在IE6下出现的竟然还是不透明,有难看的青灰色边框。百思不得其解,后经过在各处寻找资料得到原来在IE6下,你的透明png图片在做背景图片,而不是直接插入的时候也会出现兼容问题。故总结此文,希望能帮上和我遇到同样问题的同学。

PNG图片,具有透明背景的png格式图片在IE6中却不是 背景透明的,透明背景部分会显示出#DBEAED的淡灰色,表现效果很糟糕,为了使用透明背景图片只有采用gif格式了,但是gif格式会出现明显的锯齿 效果,所以只有设法修复IE6的这个问题。解决的办法就是使用IE的Microsoft.AlphaImageLoader滤镜。

· 在PS切页的时候,保存为png24.(在某设计群讨论过png8和png24的区别。Png24无调色板、支持阿尔法-alpha通道的半透明、每个点阵都有透明度的定义,最低32位真彩色。)

下面的都是在png24保存下进行的。(因为png24的保存容量较大,建议只透明图片用png保存,其他img用gif、 jpg保存。)

方法1所能达到的效果是,在页面html上面插入的所有png图片能保持透明。

correctpng.Js (因为百度博客写的字数有限制,可以下载JS)

Html页面写<script type="text/javascript"  src="js/correctpng.js" ></script>

这个方法很快捷,优点是在页面html上面插入的所有png图片IE6I、IE7、 E8、 FF都能保持兼容透明。

缺点是:不过在处于在CSS中写的背景图时,在IE6会有灰色边框,不透明。解决方法是需要方法2

方法2:所需图片为png背景图的时候。可以用css属性写,用的是图图片路径调用(这也是少的原因,每个png图都要有路径写的是!import)。

.png{
background: url(/angel.png) no-repeat !important;  
_filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="http://images.baidu.com/angel.png");  
background:none;  
width:100px;  
height:100px;
}
HTML代码:
<div class="png">背景PNG透明<div>

以上代码使用了一些IE的Hack,IE7,IE8,Firefox直接应用_background,IE6则会应用filter!

方法2解释原理

应用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;
  

}

/* for ie7 ff*/
html>body #div1 {
     background:url(../images/menu1.png) no-repeat;
}
/* for ie6 */
* #div1 {
     background:none;
     filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=’images/menu1.png’, sizingMethod=’crop’);
}

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

发表评论

您的电子邮箱地址不会被公开。