如果IE6浏览器是一个活生生的人,我真的很想把他拖出去海扁一顿,直到他体无完肤、摇摇欲坠,我还想耍一通“还我漂漂拳~~~”扫除IE6满身的BUG,至少把他打成IE7的人模人样,也算造福了全人类。

最近看多了唐伯虎点秋香,说话也变味儿了,言归正传,讲讲IE6一直困扰我很久的问题:同一元素应用多个class样式优先级BUG。

先定义几个class样式

<br/>.example div{background:#f1f1f1;border:1px dashed #360;margin-bottom:5px;}/*默认DIV框样式,CSS优先级0,0,1,1*/<br/>.classA{color:red;}/*文字红色,CSS优先级0,0,1,0*/<br/>.classB{color:blue;}/*文字蓝色,CSS优先级0,0,1,0*/<br/>.classA.classB{color:yellow;background:#666;}/*文字黄色,背景中度灰,CSS优先级0,0,2,0*/<br/>



用几个DIV来应用上面的样式:


单独应用classA,文字应为红色
单独应用classB,文字应为蓝色(IE6并非如此:黄色的,哦卖糕的)
同时运用两个class,根据优先级比较,此时级别最高,文字应为黄色,背景也要深很多

如果你用IE6就可以看到大不同。

<br/><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br/><html xmlns="http://www.w3.org/1999/xhtml"><br/><head><br/><style><br/>.example div{background:#f1f1f1;border:1px dashed #360;margin-bottom:5px;}/*默认DIV框样式,CSS优先级0,0,1,1*/<br/>.classA{color:red;}/*文字红色,CSS优先级0,0,1,0*/<br/>.classB{color:blue;}/*文字蓝色,CSS优先级0,0,1,0*/<br/>.classA.classB{color:yellow;background:#666;}/*文字黄色,背景中度灰,CSS优先级0,0,2,0*/<br/></style><br/></head><br/><br/><div id="exampleDiv" class="example"><div class="classA">单独应用classA,文字应为红色</div><div class="classB">单独应用classB,文字应为蓝色(IE6并非如此:黄色的,哦卖糕的)</div><div class="classA classB">同时运用两个class,根据优先级比较,此时级别最高,文字应为黄色,背景也要深很多</div></div><br/><br/>



可以确定的是IE6对.classA.classB的优先级解释是不对的,而且.classA.classB的声明同时还影响了

<div class="classB">

这个可怜的元素,说明IE6只识别了.classA.classB的.classB,也就是把双class当做一个看待了,我们可以这么理解(IE6的角度):

<br/>.example div{background:#f1f1f1;border:1px dashed #360;margin-bottom:5px;}/*默认DIV框样式,CSS优先级0,0,1,1*/<br/>.classA{color:red;}/*文字红色,CSS优先级0,0,1,0*/<br/>.classB{color:blue;}/*文字蓝色,CSS优先级0,0,1,0*/<br/>.classB{color:yellow;background:#666;}/*文字黄色,背景中度灰,CSS优先级0,0,1,0*/<br/>


没错,等于是把classB定义了两遍。
于是就有了.classA.classB被解释成0,0,1,0之说,优先级不及.example div这个0,0,1,1,所以到最后连背景色都保持原样~~~~囧!!!
借由这个理论,用div.classA.classB在IE6可以获得和.example div同样的优先级;用#exampleDiv .classA.classB可以获得比.example div更高的优先级;这些都可以让第3个div获得和IE7,FF同样的效果,不过,同样又改变了第2个div。.classA.classB这种选择方式在IE6看来始终是残疾的。所以我难免会有想扁人的冲动~~~~

补救的方法:用新的classC代替.classA.classB(很无奈的方法啊),为了能够把优先级提高,我们要用这个

<br/>div.classC{color:yellow;background:#666;}/*文字黄色,背景中度灰,CSS优先级0,0,1,1*/<br/>


或者

<br/>.example .classC{color:yellow;background:#666;}/*文字黄色,背景中度灰,CSS优先级0,0,2,0*/<br/>



调整之后的结果:


单独应用classA,文字应为红色
单独应用classB,文字应为蓝色
无奈之举,又多了一个class,文字应为黄色,背景也要深很多


结论:不得不接受的事实是,在IE6还尚存人间的时候,尽量避免用.style.style的方式去选择一个元素,否则会让你很难堪,尤其css样式比较复杂多样,你会搞不清什么时候已经用过了style这个类。

, , , , ,
Trackback

2 comments untill now

  1. 想到ie6就想扁~每次页面做好,最后兼容问题都是在ie6上花的比较多。有时候逼我使用zoom,又不让通过标准验证。做浏览器不能太ie6 – -!

  2. @popdo,的确如你所说,没有IE6的阻扰,我们可以用更少的代码优化页面的结构、精简CSS代码量!M$自己也意识到了这个问题,虽说提倡IE浏览器升级,不过现状是我们还是得去照顾这个“残疾人”~~~

Add your comment now

Please wrap all source codes with [code][/code] tags.