大家都知道,除了旧版本的IE之外,其它主流浏览器基本都支持了css3,而且Windoes XP系统下也能升级。所以最简单粗暴的办法,就是判断浏览器厂商和版本。只要是IE浏览器,并且版本不超过8,那么就不支持CSS3。
但此法精度不高,因为非IE浏览器也有一些较低的版本对CSS3的支持不太好,此其一。其二,另一方面国产浏览器对内核的改动也一定程度上影响了CSS3的最终运行效果。最后,移动端平台的浏览器在CSS3方面也未必做得尽善尽美。
不支持CSS3最直接的表现是网页上的元素没有按照预期的效果正确显示出来。利用这一点,我们可以更准确地判断浏览器是否支持CSS3,这跟邓小平金句“不管白猫黑猫,抓到老鼠就是好猫”是一样的道理。
既然要通过元素进行判断,那么我们必须先创建一个html元素。所以我们先来编写基础的HTML代码。
html代码
为什么要使用ID而不用class呢?因为这样可以让javaScript访问起来更加方便。
接下来我们通过ID选择器为check设置样式
#check {
display:none;
width:0;
height:0;
}
这样的话,id=check的元素将完全不可见。然而这并不能判断浏览器是否支持CSS3。因为CSS1都可以识别这个,所以接下来的才是重点。
我们为id=check的span元素设置了rel属性。为此,我们利用属性选择器对这个元素再设置另一套样式(注意两套样式的先后顺序不能调换)。
#check[rel^=”D”] {
display:block;
width:0;
height:0;
}
rel^=”D”被称作“子串匹配属性选择器”,它类似于模糊搜索。虽然W3CSchool把该选择器放到早期CSS教程中进行讲述,但文中也明确指出它是在CSS2完成之后才发布的。所以CSS2尚未支持这类选择器,只有CSS3才支持。
下面我们来看一下两套样式同时设置的效果。
本例中,#check[rel^=”D”]和#check都匹配同一个元素。按照CSS默认的优先级规则,下面的#check[rel^=”D”]选择器中的样式会把#check里面同名的属性给替换掉,display属性将等于block。但若浏览器不支持CSS3,它将会无法识别#check[rel^=”D”]的写法,于是覆盖失败,display属性仍然等于#check中所设置的none。
换而言之,判断check这个元素的display样式就可以知道浏览器是否支持CSS3了。
Javascript获取元素样式中某一属性的方法很简单,一般使用“obj.style.属性名”就能得到结果。但是style指的是通过CSS或者JavaScript直接设置所得到的属性值,它并不能反映最终渲染出来的效果。比如我们设置一个div的height=100px,overflow=auto,然后在里面放入大量的文字把容器撑大,那么div的实际高度将会超过100像素,但通过div.style.height获取出来的值仍然等于我们设定的100像素,而非撑大后的高度。
对于这样的问题,我们需要把style换成另一个属性,使其可以反映元素的最终效果。对于不同的浏览器,这个属性有不同的名字,IE里面是currentStyle,而非IE浏览器里面则叫getComputedStyle。两者不会在同一浏览器共存,所以我们分别判断这两个属性是否存在,存在的话我们就获取该属性下的display样式。
if (window.getComputedStyle){
stat = window.getComputedStyle(obj,null).getPropertyValue(“display”);
}else if(obj.currentStyle){
stat = obj.currentStyle.display;
}
接下来,是否支持CSS3就是看stat是否等于block了
css3 = (stat==”block”);
if(css3){
alert(“您的浏览器支持CSS3”);
}else{
alert(“您的浏览器不支持CSS3”);
}
把这些代码都追加到JavaScript中,运行即可通过alert的信息得知你的浏览器是否支持CSS3了。
很多时候,判断是否支持CSS3的目的也就为了在完成判断以后作出兼容性处理。可能有的朋友会觉得这样做很没必要,反正CSS3也就是一些效果,利用IE的filter样式一半都能兼容下来。但实际情况往往没有这么简单,至少除了IE以外,还有一些旧版本的非IE浏览器不支持CSS3。而且,filter也不是万能的,想想通过transition,keyframes那些强大的动画功能,旧版IE要兼容它们,哪会是一两行filter就能搞定的?
#p#分页标题#e#
此时我们就需要编写大量的JavaScript,如果功能很复杂,那大概还要再专门为不支持CSS3的浏览器重新给页面制作一个版本,然后在浏览器不支持CSS3的时候跳转过去。所有的这些操作,都需要建立在判断CSS3可用性的的基础上,否则一切都是空谈。因此我们不应过度追求CSS3的纯粹性,必要时我们还是得借助JavaScript完成任务。技术,没有最好的,只有最合适的。