CSS解决IE5/IE5.5/IE6/FF的兼容性问题

在6G改版过程中,好多页面需要把在IE5/IE5.5下的兼容性问题考虑进去,最直接的方法还是“IE条件注释”,很方便的就能为IE的不同版本写样式。但这样就得为每个版本写一个样式,不利于XHTML代码的简洁。

后来从蓝色理想找到了一种通过CSS HACK实现的处理方法,简单而且实用,原文:
http://www.blueidea.com/tech/site/2006/3296.asp

大家都知道用!important声明可以提升指定样式规则的应用优先权,如下面的例子:

  1. E1{
  2. background-color: red !important;/*提升优先权*/
  3. background-color: blue;
  4. }

但这样写在IE中会有个问题,在IE6和FF中用! important声明可以提高优先级别,但在IE6中的!important声明并不是绝对的,它会被之后的同名属性定义所替换。也就是说在上面的例子中,IE6所应用的是最后一个背景色的值,即“blue”;而在FF中背景色的值为“red”。根据这一点,我们就可以把FF和IE的样式分离开。
OK ,解决了FF和IE的问题,现在来解决IE自己的问题。
看过了嘟嘟的《绕过IE6支持IE5的别一种写法-IE也支持”>”》后有感而发,使用“>”IE是否真的可以认得?我们来看个例子:

  1. E1{
  2. background-color: red;
  3. >background-color: blue;
  4. }

在FF中得到的是背景色红色,而在IE中得到的背景色是蓝色,根据样式重定义的规则,如果浏览器可以识别“>”,则应该得到的蓝色的背景,因此可以知道“>”只有IE可以识别,这点是很重要的哦!在后面大家就会知道了。(注:我测试过其它的一些符号,如“~”、“`”、“<”等,都只有IE可以识别,在此为了感谢嘟嘟,推荐使用“>”)

我们再来看个例子:

  1. E1{
  2. >/*IE only*/background-color: black;
  3. >/*IE only*/background-color /*IE5.5*/: green;
  4. }

这个例子在IE6中得到了黑色的背景;而在IE5.5中得到的绿色的背景;在IE5中也得到了黑色的背景。这就说明了第二句定义只有IE5.5能识别,这是个很早就公布的HACK,可以在网上找到相关的资料,要注意的就是在属性名之后是有一个空格的。到此我们已经把FF、IE5.5、IE6分离出来了,那IE5呢?其实现在我们只要把IE5跟IE6分开就OK了,来看看例子:

  1. E1{
  2. >/*IE only*/background-color: red;/*IE5*/
  3. }
  4. E1/*IE5.5+*/{
  5. >/*IE only*/background-color: black;
  6. }

这里我们又用到一个HACK,就是“E1/**/{}”,这个定义在IE5以上的版本才能识别出来。这个例子得到的结果是,在IE5中的背景色为红色;在IE5以上版本中得到的是黑色背景。
终于把不同版本的浏览器都分离出来了,这样我们就可以为不同的浏览器定义不同的样式了。来看个完整的例子:

  1. E1{
  2. width: 500px;
  3. height: 50px;
  4. background-color: red !important;/*FF*/
  5. background-color: blue;/*IE5*/
  6. text-align:center;
  7. }
  8. E1/*IE5.5+*/{
  9. >/*IE only*/background-color: black;/*IE6*/
  10. >/*IE only*/background-color /*IE5.5*/: green;
  11. }

需要注意的是,在上面例子中“background-color”定义的顺利不能改变,即FF-IE5-IE6-IE5.5。对于IE的定义在属性前要加“>”,因为“E1/**/{}”这个HACK在FF中可以识别。也许你会想,上面的例子不是可以写成:

  1. E1{
  2. width: 500px;
  3. height: 50px;
  4. background-color: red;/*FF*/
  5. >background-color: blue;/*IE5*/
  6. text-align:center;
  7. }
  8. E1/*IE5.5+*/{
  9. >/*IE only*/background-color: black;/*IE6*/
  10. >/*IE only*/background-color /*IE5.5*/: green;
  11. }

这样不就又可以省下几个字节?是没错,可是HACK不是标准,如果滥用HACK,那只会离标准越来越远!
看完之后随即写了一段用CSS判断浏览器版本的代码:

浏览器版本测试:

CSS:

  1. #ie5{
  2. display:none !important;
  3. display: block;
  4. }
  5. #ie5/**/{
  6. >/**/display: none;
  7. }#ie55{
  8. display: none;
  9. }
  10. #ie55/**/{
  11. >/**/display /**/: block;
  12. }
  13.  
  14. #ie6{
  15. display: none;
  16. }
  17. #ie6/**/{
  18. >/**/display: block;
  19. >/**/display /**/: none;;
  20. }
  21.  
  22. #ff{
  23. display:block !important;
  24. display:none;
  25. }

Body:

  1. <span id="ie5">您使用的是IE5</span>
  2. <span id="ie55">您使用的是IE5.5</span>
  3. <span id="ie6">您使用的是IE6</span>
  4. <span id="ff">您使用的是FF</span>

至于用CSS解决IE7的兼容性问题的办法现在网上众说纷纭,无非也是通过hack实现,但毕竟IE7现在还只是beta,M$还在继续修复现存的CSS Bug,成熟的做法还要等IE7正式发布后才能出来。

网友评论 (1条)

  1. Yucca -

    哇!果然厉害耶!(其实我啥也不懂,凑凑热闹啦…… [cool] )

发表评论