2008-3-7 14:13
木舟
CSS的解决IE5/IE5.5/IE6/FF/IE7的兼容性问题(css hack) (转)
之前找了几个不同版本的可独立运行的IE浏览器,正好拿来试试页面的兼容性问题。不试不知道,在IE6和FF中没问题的页面在IE5和IE5.5中乱成一团,一直听说IE5是WEB标准制作的一个“钉子户”,现在不得不相信了。
既然有问题,那就找找解决的方法咯,在网上一搜,相关的文章还是不少的,觉得最直接的方法还是“IE条件注释”,很方便的就能为IE的不同版本写样式。但这样就得为每个版本写一个样式,不利于文件的优化。
找了一些相关的CSS HACK后,觉得应该可以把IE5/IE5.5/IE6/FF的HACK写到一起的,经过测试,终于找到了一个不错的方法,下面我们来看看怎么实现:
大家都知道用!important声明可以提升指定样式规则的应用优先权,如下面的例子:
[size=13px][img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img][color=#800000]E1[/color]{[img]http://www.cnblogs.com/Images/dot.gif[/img]}[color=#000000]{[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]background-color[/color][color=#000000]:[/color][color=#0000ff] red !important[/color][color=#000000];[/color]/**/[color=#008000]/*[/color][color=#008000]提升优先权[/color][color=#008000]*/[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]background-color[/color][color=#000000]:[/color][color=#0000ff] blue[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img][/color][color=#000000]}[/color][/size]
但这样写在IE中会有个问题,看过我的《关于CSS样式表优先级》和《关于CSS样式表优先级补遗》,你会知道在IE6和FF中用! important声明可以提高优先级别,但在IE6中的!important声明并不是绝对的,它会被之后的同名属性定义所替换。也就是说在上面的例子中,IE6所应用的是最后一个背景色的值,即“blue”;而在FF中背景色的值为“red”。根据这一点,我们就可以把FF和IE的样式分离开。
OK ,解决了FF和IE的问题,现在来解决IE自己的问题。
看过了嘟嘟的《绕过IE6支持IE5的别一种写法-IE也支持">"》后有感而发,使用“>”IE是否真的可以认得?我们来看个例子: [size=13px][img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img][color=#800000]E1[/color]{[img]http://www.cnblogs.com/Images/dot.gif[/img]}[color=#000000]{[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]background-color[/color][color=#000000]:[/color][color=#0000ff] red[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]>background-color[/color][color=#000000]:[/color][color=#0000ff] blue[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img][/color][color=#000000]}[/color][/size]
在FF中得到的是背景色红色,而在IE中得到的背景色是蓝色,根据样式重定义的规则,如果浏览器可以识别“>”,则应该得到的蓝色的背景,因此可以知道“>”只有IE可以识别,这点是很重要的哦!在后面大家就会知道了。(注:我测试过其它的一些符号,如“~”、“`”、“<”等,都只有IE可以识别,在此为了感谢嘟嘟,推荐使用“>”)
我们再来看个例子:
[size=13px][img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img][color=#800000]E1[/color]{[img]http://www.cnblogs.com/Images/dot.gif[/img]}[color=#000000]{[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]>[/color]/**/[color=#008000]/*[/color][color=#008000]IE only[/color][color=#008000]*/[/color][color=#ff0000]background-color[/color][color=#000000]:[/color][color=#0000ff] black[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]>[/color]/**/[color=#008000]/*[/color][color=#008000]IE only[/color][color=#008000]*/[/color][color=#ff0000]background-color [/color]/**/[color=#008000]/*[/color][color=#008000]IE5.5[/color][color=#008000]*/[/color][color=#000000]:[/color][color=#0000ff] green[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img][/color][color=#000000]}[/color][/size]
这个例子在IE6中得到了黑色的背景;而在IE5.5中得到的绿色的背景;在IE5中也得到了黑色的背景。这就说明了第二句定义只有IE5.5能识别,这是个很早就公布的HACK,可以在网上找到相关的资料,要注意的就是在属性名之后是有一个空格的。到此我们已经把FF、IE5.5、IE6分离出来了,那IE5呢?其实现在我们只要把IE5跟IE6分开就OK了,来看看例子:
[size=13px][img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img][color=#800000]E1[/color]{[img]http://www.cnblogs.com/Images/dot.gif[/img]}[color=#000000]{[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]>[/color]/**/[color=#008000]/*[/color][color=#008000]IE only[/color][color=#008000]*/[/color][color=#ff0000]background-color[/color][color=#000000]:[/color][color=#0000ff] red[/color][color=#000000];[/color]/**/[color=#008000]/*[/color][color=#008000]IE5[/color][color=#008000]*/[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img][/color][color=#000000]}[/color][color=#800000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img]E1[/color]/**/[color=#008000]/*[/color][color=#008000]IE5.5+[/color][color=#008000]*/[/color]{[img]http://www.cnblogs.com/Images/dot.gif[/img]}[color=#000000]{[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]>[/color]/**/[color=#008000]/*[/color][color=#008000]IE only[/color][color=#008000]*/[/color][color=#ff0000]background-color[/color][color=#000000]:[/color][color=#0000ff] black[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img][/color][color=#000000]}[/color][/size]
这里我们又用到一个HACK,就是“E1/**/{}”,这个定义在IE5以上的版本才能识别出来。这个例子得到的结果是,在IE5中的背景色为红色;在IE5以上版本中得到的是黑色背景。
终于把不同版本的浏览器都分离出来了,这样我们就可以为不同的浏览器定义不同的样式了。来看个完整的例子: [size=13px][img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img][color=#800000]E1[/color]{[img]http://www.cnblogs.com/Images/dot.gif[/img]}[color=#000000]{[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]width[/color][color=#000000]:[/color][color=#0000ff] 500px[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]height[/color][color=#000000]:[/color][color=#0000ff] 50px[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]background-color[/color][color=#000000]:[/color][color=#0000ff] red !important[/color][color=#000000];[/color]/**/[color=#008000]/*[/color][color=#008000]FF[/color][color=#008000]*/[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]background-color[/color][color=#000000]:[/color][color=#0000ff] blue[/color][color=#000000];[/color]/**/[color=#008000]/*[/color][color=#008000]IE5[/color][color=#008000]*/[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]text-align[/color][color=#000000]:[/color][color=#0000ff]center[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img][/color][color=#000000]}[/color][color=#800000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img]E1[/color]/**/[color=#008000]/*[/color][color=#008000]IE5.5+[/color][color=#008000]*/[/color]{[img]http://www.cnblogs.com/Images/dot.gif[/img]}[color=#000000]{[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]>[/color]/**/[color=#008000]/*[/color][color=#008000]IE only[/color][color=#008000]*/[/color][color=#ff0000]background-color[/color][color=#000000]:[/color][color=#0000ff] black[/color][color=#000000];[/color]/**/[color=#008000]/*[/color][color=#008000]IE6[/color][color=#008000]*/[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]>[/color]/**/[color=#008000]/*[/color][color=#008000]IE only[/color][color=#008000]*/[/color][color=#ff0000]background-color [/color]/**/[color=#008000]/*[/color][color=#008000]IE5.5[/color][color=#008000]*/[/color][color=#000000]:[/color][color=#0000ff] green[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img][/color][color=#000000]}[/color][/size]
需要注意的是,在上面例子中“background-color”定义的顺利不能改变,即FF-IE5-IE6-IE5.5。对于IE的定义在属性前要加“>”,因为“E1/**/{}”这个HACK在FF中可以识别。也许你会想,上面的例子不是可以写成: [size=13px][img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img][color=#800000]E1[/color]{[img]http://www.cnblogs.com/Images/dot.gif[/img]}[color=#000000]{[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]width[/color][color=#000000]:[/color][color=#0000ff] 500px[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]height[/color][color=#000000]:[/color][color=#0000ff] 50px[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]background-color[/color][color=#000000]:[/color][color=#0000ff] red[/color][color=#000000];[/color]/**/[color=#008000]/*[/color][color=#008000]FF[/color][color=#008000]*/[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]>background-color[/color][color=#000000]:[/color][color=#0000ff] blue[/color][color=#000000];[/color]/**/[color=#008000]/*[/color][color=#008000]IE5[/color][color=#008000]*/[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]text-align[/color][color=#000000]:[/color][color=#0000ff]center[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img][/color][color=#000000]}[/color][color=#800000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img]E1[/color]/**/[color=#008000]/*[/color][color=#008000]IE5.5+[/color][color=#008000]*/[/color]{[img]http://www.cnblogs.com/Images/dot.gif[/img]}[color=#000000]{[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]>[/color]/**/[color=#008000]/*[/color][color=#008000]IE only[/color][color=#008000]*/[/color][color=#ff0000]background-color[/color][color=#000000]:[/color][color=#0000ff] black[/color][color=#000000];[/color]/**/[color=#008000]/*[/color][color=#008000]IE6[/color][color=#008000]*/[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]>[/color]/**/[color=#008000]/*[/color][color=#008000]IE only[/color][color=#008000]*/[/color][color=#ff0000]background-color [/color]/**/[color=#008000]/*[/color][color=#008000]IE5.5[/color][color=#008000]*/[/color][color=#000000]:[/color][color=#0000ff] green[/color][color=#000000];[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img][/color][color=#000000]}[/color][/size]
这样不就又可以省下几个字节?是没错,可是HACK不是标准,如果滥用HACK,那只会离标准越来越远!
[b]总结:IE6/FF/IE7 能认识的符号[/b]
IE6能识别下划线_和星号*,IE7能识别星号*,当不能识别下划线_,而firefox两个都不能认识。等等
书写顺序,一般是将识别能力强的浏览器的CSS写在后面。下面如何写里面说得更详细些。
如何写CSS Hack
比如要分辨IE6和firefox两种浏览器,可以这样写: [size=13px][img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img][color=#800000]<style>
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img]div[/color]{[img]http://www.cnblogs.com/Images/dot.gif[/img]}[color=#000000]{[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img] background[/color][color=#000000]:[/color][color=#0000ff]green[/color][color=#000000];[/color]
/**/[color=#008000]/*[/color][color=#008000] for firefox [/color][color=#008000]*/[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img] *background[/color][color=#000000]:[/color][color=#0000ff]red[/color][color=#000000];[/color]
/**/[color=#008000]/*[/color][color=#008000] for IE6 [/color][color=#008000]*/[/color][color=#ff0000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img][/color][color=#000000]}[/color][color=#800000]
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img]</style>
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img]<div>我在IE6中看到是红色的,在firefox中看到是绿色的。</div>
[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img]<style> div[/color]{[img]http://www.cnblogs.com/Images/dot.gif[/img]}[color=#000000]{[/color][color=#ff0000] background[/color][color=#000000]:[/color][color=#0000ff]green[/color][color=#000000];[/color]
/**/[color=#008000]/*[/color][color=#008000] for firefox [/color][color=#008000]*/[/color][color=#ff0000] *background[/color][color=#000000]:[/color][color=#0000ff]red[/color][color=#000000];[/color]
/**/[color=#008000]/*[/color][color=#008000] for IE6 [/color][color=#008000]*/[/color]
[color=#000000]}[/color][color=#800000] </style>
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img]<div>我在IE6中看到是红色的,在firefox中看到是绿色的。</div>[/color][/size]
解释一下:
上面的css在firefox中,它是认识不了后面的那个带星号*的东东是什么的,于是将它过滤掉,不予理睬,解析得到的结果是:div{background:green},于是理所当然这个div的背景是绿色的。
在IE6中呢,它两个background都能识别出来,它解析得到的结果是:div{background:green;background:red;},于是根据优先级别,处在后面的red的优先级高,于是当然这个div的背景颜色就是红色的了。
CSS hack:区分IE6,IE7,firefox
区别不同浏览器,CSS hack写法:
区别IE6与FF: [size=13px][img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img][color=#800000]background:orange;*background:blue;[/color][/size]
区别IE6与IE7: [size=13px][img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img][color=#800000]background:green !important;background:blue;[/color][/size]
区别IE7与FF: [size=13px][img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img][color=#800000]background:orange; *background:green;[/color][/size]
区别FF,IE7,IE6: [size=13px][img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img][color=#800000]background:orange;*background:green !important;*background:blue;[/color][/size]
注:IE都能识别*;标准浏览器(如FF)不能识别*;
IE6能识别*,但不能识别 !important,
IE7能识别*,也能识别!important;
FF不能识别*,但能识别!important;
[font=NSimsun] IE6 IE7 FF
* √ √ ×
!important × √ √[/font]