来源:http://www.ido321.com/938.html
一、什么是CSS Hack?
不同的浏览器对CSS的解析结果是不同的,因此会导致同样的CSS输出的页面效果不同,这就须要CSS Hack来解决浏览器局部的兼容性问题。
而这个针对不同的浏览器写不同的CSS 代码的过程。就叫CSS Hack。
CSS Hack常见的有三种形式:CSS属性Hack、CSS选择符Hack以及IE条件凝视Hack。 Hack主要针对IE浏览器。
1、属性级Hack:比方IE6能识别下划线”_”和星号” * “,IE7能识别星号” * “,但不能识别下划线”_”。而firefox两个都不能认识。
2、选择符级Hack:比方IE6能识别*html .class{},IE7能识别*+html .class{}或者*:first-child+html .class{}。
3、IE条件凝视Hack:IE条件凝视是微软从IE5開始就提供的一种非标准逻辑语句。比方针对全部IE:<!–[if IE]><!–您的代码–><![endif]–>。针对IE7下面版本号:<!–[if lt IE 7]><!–您的代码–><![endif]–>,这类Hack不仅对CSS生效。对写在推断语句里面的全部代码都 会生效。
PS:条件凝视仅仅有在IE浏览器下才干运行。这个代码在非IE浏览下被当做凝视视而不见。能够通过IE条件凝视加载不同的CSS、JS、HTML和server代码等。
二、经常使用的CSS Hack
/* CSS属性级Hack */ color:red; /* 全部浏览器可识别*/ _color:red; /* 仅IE6 识别 */ *color:red; /* IE6、IE7 识别 */ +color:red; /* IE6、IE7 识别 */ *+color:red; /* IE6、IE7 识别 */ [color:red; /* IE6、IE7 识别 */ color:red\9; /* IE6、IE7、IE8、IE9 识别 */ color:red\0; /* IE8、IE9 识别*/ color:red\9\0; /* 仅IE9识别 */ color:red \0; /* 仅IE9识别 */ color:red!important; /* IE6 不识别!important*/
------------------------------------------------------------- /* CSS选择符级Hack */ *html #demo { color:red;} /* 仅IE6 识别 */ *+html #demo { color:red;} /* 仅IE7 识别 */ body:nth-of-type(1) #demo { color:red;} /* IE9+、FF3.5+、Chrome、Safari、Opera 能够识别 */ head:first-child+body #demo { color:red; } /* IE7+、FF、Chrome、Safari、Opera 能够识别 */ :root #demo { color:red\9; } : /* 仅IE9识别 */ -------------------------------------------------------------- /* IE条件凝视Hack */ <!--[if IE]>此处内容仅仅有IE可见<![endif]--> <!--[if IE 6]>此处内容仅仅有IE6.0可见<![endif]--> <!--[if IE 7]>此处内容仅仅有IE7.0可见<![endif]--> <!--[if !IE 7]>此处内容仅仅有IE7不能识别,其它版本号都能识别。当然要在IE5以上。<![endif]--> <!--[if gt IE 6]> IE6以上版本号可识别,IE6无法识别 <![endif]--> <!--[if gte IE 7]> IE7以及IE7以上版本号可识别 <![endif]--> <!--[if lt IE 7]> 低于IE7的版本号才干识别,IE7无法识别。 <![endif]--> <!--[if lte IE 7]> IE7以及IE7下面版本号可识别<![endif]--> <!--[if !IE]>此处内容仅仅有非IE可见<![endif]-->
三、IE6对!important的支持
!important一般用来做区分IE6和Firefox等浏览器的基本Hack手法。由于IE6不支持!important,而Firefox能读懂!important,其改变了样式的优先级。事实上IE6在某些情况下,也能认识!important。
比如:
<style type="text/css"> .demo{ color:red !important; color:green; } </style> <div class="demo">www.ido321.com</div>
上面代码在FF下字体为红色、IE6下字体为绿色。说明IE6忽视!important的存在。
再来看看:
<style type="text/css"> .demo{ color:red !important; } .demo { color:green; } </style> <div class="demo">www.ido321.com</div>
假设IE6不认!important的话,上面代码.demo的内容应该显示为绿色。可偏偏不是。.demo的内容显示为红色,说明IE6是认得!important的。
两种情况的差别就在于:当在一个选择器中。利用!important改变样式优先级的时候。IE6下是无效的,后面的样式覆盖了前面的。!important被彻底无视了,利用!import
四、IE6下的多选择符
多类选择符的写法。
比如:
#my.c1.c2 { color:red;}
.c1.c2 { color:red;}
以上写法在IE7+/FF/Opera/Safari 等浏览器都支持。
但在IE6中,后一个类名会覆盖前一个类名。也就是说,上例被IE6理解为:
#my.c2 { color:red;}
.c2 { color:red;}
同理:
#my.c1.c2.c3 { color:red;}
IE6理解为 #my.c3 {color:red;}
.c1.c2.c3 { color:red;}
IE6理解为 .c3 { color:red; }
所以开发中用多类来组合实现css效果的时候。注意IE6的这个问题。
最好的方法就是,不要用类组合的形式。