头闻号

陈创丰

牙膏|眼影|洗发精|沐浴液|洗面奶|护肤膏霜

首页 > 新闻中心 > 科技常识:使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
科技常识:使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
发布时间:2024-10-03 14:19:51        浏览次数:6        返回列表

今天小编跟大家讲解下有关使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关使用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(//img.jbzj.com/file_images/article/201301/2013123145523265.png); _background:none; _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='https://img.jbzj.com/file_images/article/201301/2013123145523265.png',sizingMethod='scale'); } </style> </head> <body> <div class='pngBg'> 请尝试使用ie6 </div> </body> </html> 提示:您可以先修改部分代码再运行使用这个滤镜之后 仍然是有一些问题没法弥补的 比如图片的repeat等等。 之前 我曾极力推荐过另外一个解决方法:使用VML 称之为完美解决方案。在这个js里已经封装好代码DD_belatedPNG 但是后来发现 使用VML效率问题比AlphaImageLoader更甚 君当慎之。 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> 提示:您可以先修改部分代码再运行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)); background:-webkit-linear-gradient(0, #FEFEFE, #E0E0E2 ); 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); 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一样 我还是建议读者谨慎采用。 ie各个Filters静态滤镜演示Demo:DXTidemo

来源:爱蒂网