【声明:此文仅是对低版本ie使用透明图片的一个研究,当时出于工作要求,所以花费了一番心思在兼容旧版本ie上,现在对ie8都是做降级处理了。不培养用户坏习惯、引导用户跟随潮流体验新技术应是我们前端开发者的责任。】
一个老生常谈的问题就是ie6不支持透明png图片啊。但其实ie6只是不支持png-24格式的透明背景图片,但对透明背景的png-8图片还是支持的,只是png-8图片只有256色,放到任意浏览器都会呈现白色的锯齿。
当代码这样时:
<style type="text/css">
.gif{
width: 400px;
height:200px;
background:#f00 url(png8.png) no-repeat;
}
</style>
<div class="gif"></div>
div中的背景图片是下图的透明背景png-8图片:
浏览器打开的效果如下(chrome,firefox,ie6+都是这么个效果):
看到这些泛白的锯齿要哭瞎了,怎么去除这恶心的锯齿呢,ps保存png-8图片时,有多个选项,经测试通过勾选“扩散透明度仿色”时锯齿的能达到最小,
如下图所示,锯齿此时没那么恶心:
但是远远不够啊,这个视觉效果还是太差了。上网查询下,这是由于png-8白色杂边导致的问题,可以在保存图片前将杂边的颜色设置成和背景一致来解决。
在ie6下的效果如下,其他浏览器显示效果也一致:
此时ie6下png-8透明背景图片能正常显示了,且不只是针对ie6,对其他浏览器也是用,好像很好用,但是png-8只有256色啊,色彩不丰富,而现在广泛使用的png-24有2^24=1678万色,能展示很丰富的色彩,而且没有锯齿。所以如果原图色彩很丰富,那么只能转换为png-8图片作为降级的方法用到ie6上。还有个问题是,杂边处理的前提是图片覆盖区域的背景色是单色,如果是多种颜色,那么总会出现锯齿了。
我们需要寻找更灵活的方法,ie有专用的AlphaImageLoader过滤器,可以让ie6支持png-24的透明背景,而不是将透明色显示为灰色,这里要用到ie hack技巧,将background-image设置为none去掉背景图片,在使用滤镜加载图片。AlphaImageLoader过滤器中的参数src指向要显示的png-24图片,sizingMethod有3个可选值:crop:直接放置到容器中,图片左上角对齐容器左上角,image:让容器的边缘调整至包住整个图片,scale:让图片调整至充满整个容器。
.gif{
width: 400px;
height:200px;
background: #f00 url(ie6.png) no-repeat;
*background-image:none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='png_24.png',sizingMethod=crop);
}
效果妥妥的:
不过需要注意的是浏览器会有提示,需要用户点击允许才能运行滤镜效果,否则不仅没有滤镜效果,而且由于取消了背景图片,图片压根就看不到(只看到红色,字是见不到的,图略):
div{ behavior:url(iepngfix.htc); }
补充:
评论区有人说连ie8都不去兼容了,我不想多说,拿数据说话,下图截取自百度对浏览器市场份额统计。过去的3个月ie8用户占了21.62%,ie7用户占5.12%,ie6用户占3.85%,我想你作为开发者,不兼容ie低版本,难道是你的网站不对30%的用户开放?当然这个统计基于一般情况,如果知道访问自己网站的特定用户群都使用chrome或firxfox浏览器,那当然可以不去兼容ie低版本。js框架基本抛弃低版本,这个是事实,因为js框架大部分都是外国人写的。而外国人基本用chrome浏览器,这不符合国情,国内依然有很多人在用低版本的ie浏览器,甚至都懒得去升级。我始终觉得,不去兼容多方浏览器的不是好开发者,因为兼容各方浏览器是每个开发者的分内事,而你永远无法要求用户使用和你一样的浏览器。
-------------------------------转载注明出处^_^: http://www.cnblogs.com/suspiderweb/