
这个bug 在以前写代码的时候就碰到过了,因为觉得碰到的几率不高,所以就忽略不计了。
现在又碰上了,就努力的分析了一下,然后共享出来,晒晒更健康。
先说一下历史背景:
最近看了太多架构式的书,写出来的样式都比较戳。比如: 提交成功的提示框会这么写。
div class = "msg-mod error" //html标签就省略了,自己YY ^__^
所有的信息提示框,用msg-mod 这个通用库来封装。然后 改 通用库包含了一些状态,如:error ,ok ,tip ,notice等来表现“错误,正确,提示,注意”等状态。
于是如果你想写一个输出的正确框就可以写成这样。
div class = "msg-mod ok"
这样做有什么好处呢,
- 1. 首先样式全局化,使用msg-mod 来全局控制,
- 2. 使用非常语义化的状态:error,ok ,来衍生出不同的样式(使用并行结构式方法来实现,后面会解释)。
- 3. 更适合功能的一些特性:有些时候需要使用js 动态的改变msg的样式,这样写出来的js 语义也更强,可读性也增强。
如何实现:
这个应该都清楚。我就一笔带过,贴个代码。
div.msg-mod{ //全局msg-mod 样式,并且有一种初始的样式,使用div开头,增加选择器效率。
padding:5px 7px;
border:1px solid #92e577;
background-color:#eefbed;
}
然后通过结构式定义不同状态的样式,这种将两个class组合起来, 并行定义的样式,我称之为并行结构式
div.msg-mod.error{ //error 状态
border:1px solid #ff8c40;
background-color:#fff5e6;
}
div.msg-mod.notice{ //notice 状态
border:1px solid #ffcc7f;
background-color:#ffffe5;
}
思维扩展:
这样的表现形式还能接受吧? 那么我们继续扩展。比如:如果想给一些msg-mod 添加图片来增加视觉效果(如配图^__^)。
要想配图么,于是又给msg-mod 新加了个class属性 has-ico,当然有人会说:默认为什么不给所有msg-mod都配图,给没图的配上属性no-ico,嘎嘎随你~~~,因为后面还有,慢慢看下去就知道了。
div class = "msg-mod has-ico ok"
h2 提交成功
p 订单已成功递交,请进入我的订单查看订单状态。
如上面的代码 当有 大字的时候就使用 大的ico图标,当只有小字的时候,使用小ico。(如配图=,=)
于是乎我又添加了个属性 has-sml-ico。
div class = "msg-mod has-sml-ico ok"
p 订单已成功递交,请进入我的订单查看订单状态。
然后在css样式实现的时候又重现了这个IE6bug,就是IE6下用并行结构式实现不了大小图配置。
分析原因:
经过分析,发现原因是,IE6在解析并行结构式的时候会出现解析错乱现象。比如
div.msg-mod.notice.has-ico{ //notice 有has-ico 的时候显示notice 图标
background:...
}
div.msg-mod.error.has-ico{ //error 有has-ico 的时候显示error 图标
background:...
}
这个时候,非IE6情况下,都能够根据css 的结构来显示出想要的结果,但是IE6脑残了,就将其解析成。
div.msg-mod.has-ico{ //忽略了中间的class。
background:...
}
这样IE6下就以最后一个样式来呈现has-ico的状态。有兴趣可以回家试试,oh yah。
div.msg-mod.error.has-ico{ //error 有has-ico 的时候显示error 图标
background:...
}
当然有人会说:那把结构式换成 div.msg-mod.has-ico.error试试。
经过尝试,IE6同样会忽略掉中间的class,解析成div.msg-mod.error囧rz~~~~
然后就无解。 ··· 折腾了好久,终于放弃了。然后想了另外的情况来解决。
解决方法:
导致样式错乱的原因初步定位为:3层class 并行结构式会忽略中间的class,(或者说忽略掉第一个也可能,具体我没有深入研究)
解决办法很简单,当然跟解决IE6的其他办法一样,能避开就避开,用其他方式来实现。
于是乎,重新整理了代码思路,整理如下:
既然 并行结构式会导致bug,那么不并行的结构式会有问题么?
我将图片的实现放在子标签h2 上来实现,问题就解决了。如下:
div.msg-mod.error.has-ico h2{
background:...
}
得出结论,使用非并行结构式样式在IE6下有解。·· oh yah。
不过以上代码还有些bug,这样会对msg-mod 下的所有h2 都增加了图标,于是这样优化了一下。
div.msg-mod.has-ico{
padding-left:42px;
}
div.msg-mod.has-ico h2.ico{
margin-left:-37px;
}
div.msg-mod h2.ico{
padding:7px 5px 10px 37px;
}
div.msg-mod.error h2.ico{
background:...
}
这样这样实现,通过给msg-mod添加has-ico 属性给内容增加左侧留白(多行的时候)。通过给h2添加ico样式来添加图标。当然单行时候也可以不用加ico,但是根据语义化,还是加上会happy 点。
同样实现小图的时候就 添加 has-sml-ico属性,在标签p上添加ico 样式。代码如下:
div.msg-mod.has-sml-ico{
padding-left:30px;
}
div.msg-mod.has-sml-ico p.ico{
margin-left:-25px;
}
div.msg-mod p.ico{
padding:0 5px 0 20px;
}
div.msg-mod.notice p.ico{
background:...
}
这样,有效的避免了并行结构式带来的错乱压力~~~~ 万恶的IE6丫~~~~
这样处理有利有弊啦··。
就是必须要在里面的标签上多加一个ico 的样式。
其他目前还没有碰到什么问题。欢迎反馈~~·
该文章已经被摸了488次。 共有 16 条评论
图片内容很强大@_@
回复
飞鱼 Reply:
August 17th, 2010 at 19:41
那必须的嘎嘎·~~
回复
已经被系统全部没收 = =
回复
发现.notice.has-ico都米有反应,想不出来了
回复
飞鱼 Reply:
August 18th, 2010 at 11:12
纳尼~~~ 什么情况·~
回复
我想问下灰鱼这文章写了多久。。。喵喵
回复
飞鱼 Reply:
August 19th, 2010 at 17:01
额~~ 一定木有你看得快· 下班吃完饭 开始写的。
回复
话说你用Intellij IDEA的话,直接就会提醒你IE6不认识这种写法。。。
回复
飞鱼 Reply:
August 21st, 2010 at 10:02
话说~~~ 我去用用看·· 嘎嘎~··
回复
葉子 Reply:
August 24th, 2010 at 10:21
Intellij IDEA 这是哪里的东西
回复
大猫 Reply:
August 24th, 2010 at 10:31
http://www.jetbrains.com/
回复
飞鱼 Reply:
August 24th, 2010 at 10:44
这东西··收费的说···有钱宁~~ 嘎嘎~
回复
大猫 Reply:
August 26th, 2010 at 23:20
可以找我要KEY
回复
[...] 以上只是过分 属性分离的后果. 但是上文中张鑫旭的文章 中也又好的部分, 比如他的 oocss 对象式css 书写规则, 这种对象式的书写方法也是我慢慢积累出来的一种方法. oocss 的 书写带来的效率及性能可以看这里: 翻译:同CSS技术及其CSS性能 也可以查看我之前写的 又见IE6吐槽~ 并行结构式class引起的bug [...]
div.msg-mod.error.has-ico 一般我会加空格 以避免你说的这种情况div.msg-mod .error .has-ico
回复
飞鱼 Reply:
December 7th, 2011 at 17:25
亲~ div.msg-mod.error.has-ico 是 将class 写在 同一个dom 的写法。
div.msg-mod .error .has-ico 加空格的是 层叠式 写法,一个是同级的一个是上下级的 注意哦· ^__^
同级的结构式写法在IE6下是有 硬伤的·
回复
发表评论