1、什么是CSS hack?
简单地讲,css hack指各版本及各品牌浏览器之间对CSS解释后出现网页内容的误差(比如我们常说错位)的处理。由于各浏览器的内核不同,所以会造成一些误差就像JS 一样,一个JS网页特效,在微软IE6、IE7、IE8浏览器有效果,但可能在火狐(Mozilla Firefox)谷歌浏览器无效,这样就叫做JS hack ,所以我们对于CSS来说他们来解决各浏览器对CSS解释不同所采取的区别不同浏览器制作不同的CSS样式的设置来解决这些问题就叫作CSS Hack。
CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器识别不同的符号(什么样的浏览器识别什么样的符号是有标准的,CSS hack就是让你记住这个标准),以达到应用不同的CSS样式的目的,比如.kwstu{width:300px;_width:200px;},一般浏 览器会先给元素使用width:300px;的样式,紧接着后面还有个_width:200px;由于下划线_width只有IE6可以识别,所以此样式 在IE6中实际设置对象的宽度为200px,后面的把前面的给覆盖了,而其他浏览器不识别_width不会执行_width:200px;这句样式,所以 在其他浏览器中设置对象的宽度就是300px;
兼容性建议:实际开发先如果不是很清楚可以先写布局代码,写一个阶段用浏览器测试工具(常用工具推荐IETEST)测试一个各个版本浏览器的布局效果,如有问题针对有问题的浏览器单独调试。
2. CSS hack方式
l 方式一、 条件注释法
Ø 只在IE下生效
<!--[if IE]>
这段文字只在IE浏览器显示
<![endif]-->
Ø 只在IE6下生效
<!--[if IE 6]>
这段文字只在IE6浏览器显示
<![endif]-->
Ø 只在IE6以上版本生效
<!--[if gte IE 6]>
这段文字只在IE6以上(包括)版本IE浏览器显示
<![endif]-->
Ø 只在IE8上不生效
<!--[if ! IE 8]>
这段文字在非IE8浏览器显示
<![endif]-->
Ø 非IE浏览器生效
<!--[if !IE]>
这段文字只在非IE浏览器显示
<![endif]-->
示例:
<!--[if IE 6]>
<link rel="stylesheet" type="text/css" href="css/ie6.css" />
<![endif]-->
<!--[if IE 7]>
<link rel="stylesheet" type="text/css" href="css/ie7.css" />
<![endif]-->
方式二、 选择器前缀法
选择器前缀法是针对一些页面表现不一致或者需要特殊对待的浏览器,在CSS选择器前加上一些只有某些特定浏览器才能识别的前缀进行hack。
l 方式三、 属性前缀法
Ø 浏览器识别字符标准对应表(1)
Ø 3、浏览器识别字符标准对应表(2)
由上面可以看出来:
1. 大部分特殊字符IE浏览器支持,其他主流浏览器firefox,chrome,opera,safari不支持 (opera可识别除外)。 2. _和- :仅IE5、IE6支持3. * :IE6、E7支持
4. \9 :所有IE浏览器都支持5. \0 :IE8、IE9支持,opera部分支持6. \9\0 :IE8部分支持、IE9支持7. \0\9 :IE8、IE9支持
3、各种常用CSS hack
1. 区别IE和非IE浏览器
#tip{
background:blue;/*非IE背景蓝色 因为所有浏览器都能解释*/
background:red\9;/*IE6、IE7、IE8、IE9背景紅色 因为\9在IE6.7.8.9中可以识别,覆盖上面样式IE10跟11应该不识别,IE11测试确定*/
}
2.区别IE6,IE7,IE8,FF
【区别符号】:“\9”、“*”、“_”
#tip{
background:blue; /*Firefox背景变蓝色 所有浏览器都支持*/
background:red\9; /*IE8背景变红色 IE6、7、8、9支持覆盖上面样式*/
*background:black;/*IE7背景变黑色 IE6、7支持又一次覆盖上面样式*/
_background:orange;/*IE6背景变橘色 紧IE6支持又一次覆盖上面样式*/
}
【说 明】:因为IE系列浏览器可读「\9」,而IE6和IE7可读「*」(米字号),另外IE6可辨识「_」(底线),因此可以依照顺序写下来,就会让浏览器 正确的读取到自己看得懂得CSS语法,所以就可以有效区分IE各版本和非IE浏览器(像是Firefox、Opera、GoogleChrome、Safari等)。
3.区别IE6、IE7、Firefox(方法1)
【区别符号】:“*”、“_”
#tip{
background:blue;/*Firefox背景变蓝色*/
*background:black;/*IE7背景变黑色*/
_background:orange;/*IE6背景变橘色*/
}
【说明】:IE7和IE6可读「*」(米字号),IE6又可以读「_」(底线),但是IE7却无法读取「_」,至于Firefox(非IE浏览器)则完全无法辨识「*」和「_」,因此就可以透过这样的差异性来区分IE6、IE7、Firefox
4.区别IE6、IE7、Firefox(方法2)
【区别符号】:“*”、“!important”
#tip{
background:blue;/*Firefox背景变蓝色*/
*background:green!important;/*IE7背景变绿色*/
*background:orange;/*IE6背景变橘色*/
}
【说明】:IE7可以辨识「*」和「!important」,但是IE6只可以辨识「*」,却无法辨识「!important」,至于Firefox可以读取「!important」但不能辨识「*」因此可以透过这样的差异来有效区隔IE6、IE7、Firefox。
5.区别IE7、Firefox
【区别符号】:“*”、“!important”
#tip{
background:blue;/*Firefox背景变蓝色*/
*background:green!important;/*IE7背景变绿色*/
}
【说明】:因为Firefox可以辨识「!important」但却无法辨识「*」,而IE7则可以同时看懂「*」、「!important」,因此可以两个辨识符号来区隔IE7和Firefox。
6.区别IE6、IE7(方法1)
【区别符号】:“*”、“_”
#tip{
+background:red;/*IE7背景变黑色*/
*background:black;/*IE6、7背景变黑色*/
_background:orange;/*IE6背景变橘色*/
}
【说明】:IE7和IE6都可以辨识「*」(米字号),但IE6可以辨识「_」(底线),IE7却无法辨识,透过IE7无法读取「_」的特性就能轻鬆区隔IE6和IE7之间的差异。
7.区别IE6、IE7(方法2)
【区别符号】:“!important”
#tip{
background:black!important;/*IE7背景变黑色*/
background:orange;/*IE6背景变橘色*/
}
【说明】:因为IE7可读取「!important;」但IE6却不行,而CSS的读取步骤是从上到下,因此IE6读取时因无法辨识「!important」而直接跳到下一行读取CSS,所以背景色会呈现橘色。
8.区别IE6、Firefox
【区别符号】:“_”
#tip{
background:black;/*Firefox背景变黑色*/
_background:orange;/*IE6背景变橘色*/
}
【说明】:因为IE6可以辨识「_」(底线),但是Firefox却不行,因此可以透过这样的差异来区隔Firefox和IE6,有效达成CSShack。
9.兼容各大主流浏览器(最新版本)css hack汇总如下(最全的):
.element{
color:#000; /*w3c标准*/
[;color:#f00;]; /*Webkit(chrome和safari)*/
color:#666\9; /*IE6+*/
*color:#999; /*IE6、7*/
_color:#333; /*IE5、6*/
+color:#333; /*IE7*/
color:#333\0; /*IE8、9*/
}
:root .element{color:#0f0\9;} /*IE9+*/
@media all and (-webkit-min-device-pixel-ratio:10000), not all and (
-webkit-min-device-pixel-ratio:0) { .element{color:#336699;}} /*opera*/
@-moz-document url-prefix(){ .element{color:#f1f1f1;}}/*Firefox*/
4. 使用X-UA-Compatible来设置IE浏览器兼容模式
1. 强制IE8使用IE7模式来解析
<meta http-equiv="X-UA-Compatible" content="IE=8″>
2. Google Chrome Frame也可以让IE用上Chrome的引擎:
<meta http-equiv="X-UA-Compatible" content="chrome=1″ />
3.强制IE8使用IE7模式来解析
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"><!– IE7 mode –>
//或者
<meta http-equiv="X-UA-Compatible" content="IE=7"><!– IE7 mode –>
4.强制IE8使用IE6或IE5模式来解析
<meta http-equiv="X-UA-Compatible" content="IE=6″><!– IE6 mode –>
<meta http-equiv="X-UA-Compatible" content="IE=5″><!– IE5 mode –>
5.如果一个特定版本的IE支持所要求的兼容性模式多于一种,如
<meta http-equiv="X-UA-Compatible" content="IE=5; IE=8″ />