之前找了几个可以独立运行的不同版本的IE浏览器,就是为了试试页面的兼容性。试了才知道,IE6和FF还好的页面在IE5和IE5.5就一塌糊涂了,一直听说IE5是WEB标准做的钉子户。
我现在不得不相信了。
既然有问题,那就想办法解决吧。在网上搜了一下,相关文章还是很多的。我觉得最直接的方式就是“IE条件注释”,针对不同版本的IE编写样式非常方便。但是这样你就要为每个版本写一个样式,不利于文件优化。
找了一些相关的CSS HACK,我觉得可以把IE5/IE5.5/IE6/FF的HACK一起写出来。经过试验,我终于找到了一个好方法。我们来看看如何实现:
大家都知道怎么用!重要声明可以提高指定样式规则的应用优先级,如下例所示:
E1{
Background color: red! Important; /* Increase the priority */
background-color: blue;
}
但是,在IE中这样写会有问题。看了我的《关于CSS样式表优先级》和《关于CSS样式表优先级补遗》就知道是IE6和FF用的!重要声明可以提高优先级,
但是在IE6!重要声明不是绝对的,它将被后面的同名属性定义所取代。也就是说,在上面的例子中,IE6应用了最后一个背景色的值,即“蓝色”;在FF中,背景颜色的值是“红色”。
据此,我们可以区分FF和IE的风格。
好了,解决了FF和IE的问题,现在来解决IE自身的问题。
看了嘟嘟的《绕过IE6支持IE5的别一种写法-IE也支持"gt;"》,感觉到了。用“>”IE真的能认出来吗?让我们看一个例子:
E1{
background-color: red;
> background color: blue;
}
在FF中,背景色是红色,而在IE中,背景色是蓝色。根据样式重定义的规则,如果浏览器能识别“>”,就应该得到蓝色背景,所以可以知道“>”只能被IE识别。
这一点很重要!后面大家就知道了。(注:我测试过一些其他符号,比如“~”、“`”和“<”,只有IE能识别,所以推荐用“>”来感谢嘟嘟。)
让我们看另一个例子:
E1{
>/* IE only */Background color: black;
>/*仅IE */背景色/* IE 5.5 */:绿色;
}
这个例子在IE6中有黑色背景;以及IE5.5中获得的绿色背景;IE5中也获得了黑色背景。这说明第二句的定义只有IE5.5才能识别,这是很早就发表的HACK,网上也能查到相关资料。
请注意,属性名后面有一个空格。至此,我们已经把FF,IE5.5,IE6分开了。IE5呢?其实现在我们只需要把IE5和IE6分开就可以了。让我们来看看这个例子:
E1{
>/* IE only */Background color: red; /*IE5*/
}
E1/*IE5.5+*/{
>/* IE only */Background color: black;
}
这里我们用另一个HACK,就是“E1/**/{}”,这个定义只有IE5以上的版本才能识别。这个例子的结果是IE5中的背景色是红色;在IE5及以上版本中,你会看到黑色背景。
终于把不同版本的浏览器都分离出来了,这样我们就可以为不同的浏览器定义不同的样式了。来看个完整的例子:
E1{
width: 500px;
height: 50px;
background-color: red !important;/*FF*/
background-color: blue;/*IE5*/
text-align:center;
}
E1/*IE5.5+*/{
/*IE only*/background-color: black;/*IE6*/
/*IE only*/background-color /*IE5.5*/: green;
}
需要注意的是,在上面例子中“background-color”定义的顺利不能改变,即FF-IE5-IE6-IE5.5。对于IE的定义在属性前要加“”,
因为“E1/**/{}”这个HACK在FF中可以识别。也许你会想,上面的例子不是可以写成:
E1{
width: 500px;
height: 50px;
background-color: red;/*FF*/
background-color: blue;/*IE5*/
text-align:center;
}
E1/*IE5.5+*/{
/*IE only*/background-color: black;/*IE6*/
/*IE only*/background-color /*IE5.5*/: green;
}
这样不就又可以省下几个字节?是没错,可是HACK不是标准,如果滥用HACK,那只会离标准越来越远!