使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE

跨浏览器兼容性是网页制作永恒的难题。别看各浏览器厂商都努力在自己的浏览器中实现新式的css3标准特性,但都是以扩展样式的形式提供的, 所以在未来一段时间里,样式表里的-moz-,-webkit-,(-ms-,-o-)等等前缀将长期存在。

另外,虽说各家有志于扩张自己市场的浏览器厂商都提供了css3的新特性,但鉴于其老式版本的浏览器依然存在于用户的主机上(主要是微软旗下的ie6,7,8),除了考虑各家浏览器之间的兼容性外,我们还有必要向前兼容老式浏览器。

这些老式浏览器(低版本ie)对于css3的不支持问题,真是阻碍我们迈向css3时代的一大障碍。
不幸之幸,当年ie在轻视w3c标准之时,自成一套的Filters滤镜却是具备长远眼光的。在这些Filters滤镜中,不少效果正是我们CSS3中目前实现的。
对于Filters滤镜,我们不建议单独使用,只作为解决兼容性时候的一个选择。
下面我们将解决以下低版本浏览器的问题
1. ie6下对透明png的不支持;
2. ie6,7,8下阴影(box-shadow,text-shadow)效果的不支持;
3. ie6,7,8下渐变(Gradients)效果的不支持;
4. ie6,7,8下对rgba的不支持(一般用来做半透明层)。

1. 解决ie6对24位透明png的不支持
第一个问题非常常见,其实有两个解决方法,
一个就是使用ie滤镜:AlphaImageLoader

 
<!DOCTYPE html> 
<html > 
<head> 
<meta charset="utf-8" /> 
<title>使用AlphaImageLoader滤镜支持ie6的透明png</title> 
<style> 
.pngBg{ 
width:160px;height:240px;background: url(http://files.bitsCN.com/file_images/article/201301/2013123145523265.png); 
_background:none; 
_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=‘http://files.bitsCN.com/file_images/article/201301/2013123145523265.png‘,sizingMethod=‘scale‘); 
/* sizingMethod参数还可以是image,crop */ 
} 
</style> 
</head> 
<body> 
<div class=‘pngBg‘> 
请尝试使用ie6 
</div> 
</body> 
</html> 

 使用这个滤镜之后,仍然是有一些问题没法弥补的,比如图片的repeat等等。


2. 解决ie6,7,8下对阴影(box-shadow,text-shadow)效果的不支持
现在很多网站为求美观采用了很多css3的样式,其中box-shadow和text-shadow的使用率最高。
下面我们就利用Blur和dropShadow滤镜在ie6,7,8中实现这种效果:

 
<!Doctype html> 
<html> 
<head> 
<meta charset="UTF-8" /> 
<title>Blur滤镜模拟box-shadow,dropShadow滤镜模拟text-shadow</title> 
<style type="text/css"> 
body{ 
position:relative; 
color:#c00; 
font-family:‘黑体‘; 
font-size:20px; 
background:#cfc; 
} 
.shadow{ 
width:200px;height:100px; 
background:#fff; 
border:1px solid #ccc; 
} 
.shadow span{zoom:1;filter:progid:DXImageTransform.Microsoft.dropShadow( Color=cccccc,offX=2,offY=1,positive=true); } 
.ieShadow{ 
position:absolute;width:200px;height:100px;z-index:-1; 
background: #333; 
top:-5px;left:-5px; 
filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius=‘6‘, MakeShadow=‘true‘, ShadowOpacity=‘0.3‘); 
} 
</style> 
</head> 
<body> 
<div class="wrap"> 
<div class=‘ieShadow‘></div> 
<div class=‘shadow‘> 
<span>文字shadow</span> 
</div> 
</div> 
</body> 
</html> 

 ie的滤镜是必须要在触发haslayout情况下才能生效的(ie8除外,它已经抛弃了haslayout这个私有属性),这就是为什么我们在那里加了个zoom:1;
另外,当使用dropShadow滤镜做文字阴影时,就不应该使用background,否则阴影效果是对背景起作用了,所以我们将dropShadow滤镜加在了span上而不是class=shadow层上。
做box-shadow效果,我们还多加了一层class=ieShadow,然后使用blur滤镜来模拟的。其实滤镜中还有个Shadow滤镜,可以不需要这个额外层,但是效果并不好,所以我们并没有采用。
下面,我们做一个兼容所有浏览器的demo。

技术分享
 
<!Doctype html> 
<html> 
<head> 
<meta charset="UTF-8" /> 
<title>块阴影(Firefox,Safari, Chrome,opera)与文字阴影(Firefox 3.1,Safari,Opera,chrome)</title> 
<style type="text/css"> 
body{ 
position:relative; 
color:#c00; 
font-family:‘黑体‘; 
font-size:20px; 
background:#cfc; 
} 
.shadow{ 
width:200px;height:100px; 
background:#fff; 
border:1px solid #ccc; 
box-shadow: 1px 1px 10px rgba(200,200,200,0.9); 
-webkit-box-shadow:1px 1px 10px rgba(200,200,200,0.9) ; 
-moz-box-shadow: 1px 1px 10px rgba(200,200,200,0.9) ; 
} 
.shadow span{ 
zoom:1;filter:progid:DXImageTransform.Microsoft.dropShadow( Color=cccccc,offX=2,offY=1,positive=true); 
text-shadow: 2px 1px 2px #ccc; 
} 
.ieShadow{ 
display:none; 
display:block\9; 
position:absolute;width:200px;height:100px;z-index:-1; 
background: #ccc; 
top:-5px;left:-5px; 
filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius=‘6‘, MakeShadow=‘true‘, ShadowOpacity=‘0.2‘); 
} 
</style> 
</head> 
<body> 
<div class="wrap"> 
<div class=‘ieShadow‘></div> 
<div class=‘shadow‘> 
<span>文字shadow</span> 
</div> 
</div> 
</body> 
</html> 
View Code

3. 解决ie6,7,8下渐变(Gradients)效果的不支持
自从有了gradient渐变这个css3属性后,很多设计效果我们就不需要去切图了,直接使用代码就能实现,并且相对图片来说局限性更小。
为了弥补ie低版本下对gradient的不支持,我们可以使用Gradient滤镜。
ie的Gradient滤镜只支持线性渐变,且只能设置两个渐变色,不过这里注意一下,这个渐变颜色可以设置alpha透明度。

 
<!Doctype html> 
<html> 
<head> 
<meta charset="UTF-8" /> 
<title>ie6下的gradient滤镜线性渐变</title> 
<style type="text/css"> 
.Box{ 
width:300px;height:200px; 
filter:progid:DXImageTransform.Microsoft.gradient(gradientType = 0, startColorstr = #FEFEFE, endColorstr = #E0E0E2); 
} 
</style> 
</head> 
<body> 
<div class=‘Box‘>渐变背景</div> 
</body> 
</html> 

 我们在看一下各浏览器兼容性的写法,遗憾的是opera并未支持。

 
<!Doctype html> 
<html> 
<head> 
<meta charset="UTF-8" /> 
<title>线性渐变(未支持opera)</title> 
<style type="text/css"> 
.Box{ 
width:300px;height:200px; 
background:linear-gradient(top, #FEFEFE, #E0E0E2 ); 
background:-moz-linear-gradient(top, #FEFEFE, #E0E0E2 ); 
background:-webkit-gradient(linear, 50% 0, 50% 100%, from(#FEFEFE), to(#E0E0E2)); /* webkit老式写法 */ 
background:-webkit-linear-gradient(0, #FEFEFE, #E0E0E2 ); /* webkit新式写法 */ 
filter:progid:DXImageTransform.Microsoft.gradient(gradientType = 0, startColorstr = #FEFEFE, endColorstr = #E0E0E2); 
} 
</style> 
</head> 
<body> 
<div class=‘Box‘>渐变背景</div> 
</body> 
</html> 

 4. 解决ie6,7,8下对rgba的不支持(一般用来做半透明层)
这第四个问题,非常普遍,而且ie低版本下的解决方法在网上也是随处可见,就是半透明层的效果。
因 为ie不支持rgba色,所以我们一般都使用ie的alpha滤镜来达到半透明效果,但是,同我们上面举的box-shadow的模拟例子一样,这个 alpha滤镜和上面的blur滤镜都是针对层元素内所有子元素且包括文本节点的。所以,一旦使用了alpha滤镜,那么这个元素下面的所有东西都透明 了,这常常和我们要的效果不一致。
网上一般的解决方法同上面的模拟box-shadow的blur滤镜一样,将透明层单独提取成一个层。

 
<!Doctype html> 
<html> 
<head> 
<meta charset="UTF-8" /> 
<title>ie半透明层</title> 
<style type="text/css"> 
body{background:#fee;} 
.Box{ 
position:relative;width:300px;height:200px;border:1px solid #ccc; 
} 
.ieAlpha{ 
position:absolute;z-index:-1;top:0;left:0;width:300px;height:200px;background:#333; 
filter:alpha(opacity=30); 
} 
</style> 
</head> 
<body> 
<div class=‘Box‘> 
<div class=‘ieAlpha‘></div> 
透明背景 
</div> 
</body> 
</html> 

 这种方法使用的比较普遍,但是多加的一层实在有些多余,并且有时候控制起来还比较麻烦。
我们可以换一个滤镜方法:在上面的渐变的滤镜里,我们提到了渐变色也可以使用alpha半透明值,并且这个渐变滤镜是针对于元素背景的,元素内容并不会受其影响。
那么我们可以这样实现

 
<!Doctype html> 
<html> 
<head> 
<meta charset="UTF-8" /> 
<title>利用gradient实现半透明层</title> 
<style type="text/css"> 
body{background:#fee;} 
.Box{ 
position:relative;width:300px;height:200px;border:1px solid #ccc; 
filter:progid:DXImageTransform.Microsoft.gradient(gradientType = 1,startColorstr = #66000000,endColorstr = #66000000); 
} 
</style> 
</head> 
<body> 
<div class=‘Box‘> 
透明背景 
</div> 
</body> 
</html> 

 显然结构,样式简单多了,再做一下其他浏览器的兼容性:

 
<!Doctype html> 
<html> 
<head> 
<meta charset="UTF-8" /> 
<title>半透明层</title> 
<style type="text/css"> 
body{background:#fee;} 
.Box{ 
position:relative;width:300px;height:200px;border:1px solid #ccc; 
background:rgba(0,0,0,0.35); /* 这里也不独立使用opacity了 */ 
filter:progid:DXImageTransform.Microsoft.gradient(gradientType = 1,startColorstr = #66000000,endColorstr = #66000000); 
} 
</style> 
</head> 
<body> 
<div class=‘Box‘> 
透明背景 
</div> 
</body> 
</html> 

 虽然我们以上解决了四种ie低版本下的不足,但在解决的过程中某些地方还是稍显繁复了,且在具体应用当中的情况或许并没有这么简单,读者当理解之后再做延伸。
除 了以上四种问题被解决之外,还是有太多的css3效果在ie低版本下是无法实现的,我们不得不(在低版本浏览器中)放弃之,其中最最最遗憾的就是css3 圆角效果了,当然使用VML也是能解决,封装的方法:Curved corner,同DD_belatedPNG一样,我还是建议读者谨慎采用。

 

源:http://www.bitscn.com/school/HTMLCSS/201301/285451.html

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。