首页 > 代码库 > CSShack

CSShack

CSS  hack

一、原理

由于不同的浏览器对CSS的支持及解析结果不一样,还由于CSS中的优先级的关系。我们就可以根据这个来针对不同的浏览器来写不同的CSS。

CSS Hack大致有3种表现形式,CSS类内部Hack、选择器Hack以及HTML头部引用(if IE)Hack,CSS Hack主要针对。

1、类内部Hack:比如 IE6能识别下划线"_"和星号" * ",IE7能识别星号" * ",但不能识别下划线"_",而firefox两个都不能认识。 (即:IE6和IE7都能识别”*”,但IE6还能识别”_ ”)

2、选择器Hack:比如 IE6能识别*html .class{},

IE7能识别*+html .class{}或者*:first-child+html .class{}。等等

3、HTML头部引用(if IE)Hack:针对所有IE:<!--[if IE]><!--您的代码--><![endif]-->,针对IE6及以下版本:<!--[if lt IE 7]><!--您的代码--><![endif]-->,这类Hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效。

  1. <!--[if lte IE 6]>
  2. <LINK rel="stylesheet" type="text/css" href="http://www.mamicode.com/images/style_IE5.css" />
  3. <![endif]–>
  4. <!--[if IE 6]>
  5. <LINK rel="stylesheet" type="text/css" href="http://www.mamicode.com/images/style_IE6.css" />
  6. <![endif]-->
  7. <!--[if IE 7]>
  8. <LINK rel="stylesheet" type="text/css" href="http://www.mamicode.com/images/style_IE7.css" />
  9. <![endif]-->

 

书写顺序,一般是将识别能力强的浏览器的CSS写在前面。下面如何写里面说得更详细些。

二、实际应用

1.区别IE和非IE浏览器

#tip {
background
:blue; /*IE 背景藍色*/
background
:red \9; /*IE6IE7IE8背景紅色*/
}


2.
区别IE6,IE7,IE8,FF

【区别符号】:「\9」、「*」、「_
【示例】:

#tip {
background
:blue; /*Firefox 背景变蓝色*/
background
:red \9; /*IE8 背景变红色*/
*background
:black; /*IE7 背景变黑色*/
_background
:orange; /*IE6 背景变橘色*/
}

【说明】:因为IE系列浏览器可读「\9」,而IE6IE7可读「*(米字号),另外IE6可辨识「_(底线),因此可以依照顺序写下来,就会让浏览器正确的读取到自己看得懂得CSS语法,所以就可以有效区分IE各版本和非IE浏览器(像是FirefoxOperaGoogle ChromeSafari)


3.
区别IE6IE7Firefox (方法 1)

【区别符号】:「*」、「_
【示例】:

#tip {
background
:blue; /*Firefox背景变蓝色*/
*background
:black; /*IE7 背景变黑色*/
_background
:orange; /*IE6 背景变橘色*/
}

【说明】:IE7IE6可读「*(米字号)IE6又可以读「_(底线),但是IE7却无法读取「_」,至于Firefox(IE浏览器)则完全无法辨识「*」和「_」,因此就可以透过这样的差异性来区分IE6IE7Firefox


4.
区别IE6IE7Firefox (方法 2)

【区别符号】:「*」、「!important
【示例】:

#tip {
background
:blue; /*Firefox 背景变蓝色*/
*background
:green !important; /*IE7 背景变绿色*/
*background
:orange; /*IE6 背景变橘色*/
}

【说明】:IE7可以辨识「*」和「!important」,但是IE6只可以辨识「*」,却无法辨识「!important」,至于Firefox可以读取「!important」但不能辨识「*」因此可以透过这样的差异来有效区隔IE6IE7Firefox


5.
区别IE7Firefox

【区别符号】:「*」、「!important
【示例】:

#tip {
background
:blue; /*Firefox 背景变蓝色*/
*background
:green !important; /*IE7 背景变绿色*/
}

【说明】:因为Firefox可以辨识「!important」但却无法辨识「*」,而IE7则可以同时看懂「*」、「!important」,因此可以两个辨识符号来区隔IE7Firefox


6.
区别IE6IE7 (方法 1)

【区别符号】:「*」、「_
【示例】:

#tip {
*background
:black; /*IE7 背景变黑色*/
_background
:orange; /*IE6 背景变橘色*/
}

【说明】:IE7IE6都可以辨识「*(米字号),但IE6可以辨识「_(底线)IE7却无法辨识,透过IE7无法读取「_」的特性就能轻鬆区隔IE6IE7之间的差异。


7.
区别IE6IE7 (方法 2)

【区别符号】:「!important
【示例】:

#tip {
background
:black !important; /*IE7 背景变黑色*/
background
:orange; /*IE6 背景变橘色*/
}

【说明】:因为IE7可读取「!important;」但IE6却不行,而CSS的读取步骤是从上到下,因此IE6读取时因无法辨识「!important」而直接跳到下一行读取CSS,所以背景色会呈现橘色。


8.
区别IE6Firefox

【区别符号】:「_
【示例】:

#tip {
background
:black; /*Firefox 背景变黑色*/
_background
:orange; /*IE6 背景变橘色*/
}

【说明】:因为IE6可以辨识「_(底线),但是Firefox却不行,因此可以透过这样的差异来区隔FirefoxIE6,有效达成CSS hack

9、IE8 最新css hack:

"\9" 例:"border:1px \9;".这里的"\9"可以区别所有IE和FireFox.

background-color:red\0;IE8和IE9都支持, IE6、IE7不能.;

background-color:blue\9\0; 仅IE9支持;

"*" IE6、IE7可以识别.IE8、FireFox不能.

"_" IE6可以识别"_",IE7、IE8、FireFox不能.

 

Ie6

Ie7

Ie8

Ie9

Ff

\9

Y

Y

Y

Y

N

*

Y

Y

N

N

N

_

Y

N

N

N

N

!important

N

Y

Y

N

Y

\0

 

 

Y

Y

 

\9\0

 

 

 

Y

 

:root 选择符 {属性\9;}

 

 

 

 

Y

 

史上最全的例子

 <style>  
    #test   
    {   
        width:300px;   
        height:300px;   
        background-color:blue;      /*firefox*/
        background-color:red\9;      /*all ie*/
        background-color:yellow\0;    /*ie8*/
        +background-color:pink;        /*ie7*/
        _background-color:orange;       /*ie6*/
    }  
    :root #test { background-color:purple\9; }  /*ie9*/
    @media all and (min-width:0px){ #test {background-color:black\0;} }  /*opera*/
    @media screen and (-webkit-min-device-pixel-ratio:0){ #test {background-color:gray;} }  /*chrome and safari*/
    </style> 

上面这段代码大家可以直接copy出来,保存成html在各浏览器试试。下面我来分析下:

   background-color:blue; 各个浏览器都认识,这里给firefox用;

   background-color:red\9;\9所有的ie浏览器可识别;

   background-color:yellow\0; \0 是留给ie8的,但笔者测试,发现最新版opera也认识,汗。。。不过且慢,后面自有hack写了给opera认的,所以,\0我们就认为是给ie8留的;

   +background-color:pink; + ie7定了;

   _background-color:orange; _专门留给神奇的ie6;

    :root #test{ background-color:purple\9; } :root是给ie9的,网上流传了个版本是 :root #test {background-color:purple\0;},呃。。。这个。。。,新版opera也认识,所以经笔者反复验证最终ie9特有的为:root 选择符 {属性\9;}

    @media alland (min-width:0px){ #test {background-color:black\0;} } 这个是老是跟ie抢着认\0的神奇的opera,必须加个\0,不然firefox,chrome,safari也都认识。。。

    @mediascreen and (-webkit-min-device-pixel-ratio:0){ #test {background-color:gray;} }最后这个是浏览器新贵chrome和safari的。

 

 

浏览器优先级别:FF<IE7<IE6,CSS hack书写顺序一般为FF IE7 IE6

 

注意:

<metahttp-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
大意是:在<head>中, <title>和任何 <meta>之前插入这个 <meta http-equiv="X-UA-Compatible"content="IE=EmulateIE7"/> ,这一行信息就告诉IE8将该页面按照IE7的规则来处理!

 

 

 

三、兼容技巧

1.

ul标签在默认是有padding值的,而在IE中只有margin有值。所以先定义ul{margin:0;padding:0;}就能解决大部分问题。

 

2. 居中问题.

1).垂直居中.将 line-height 设置为 当前 div 相同的高度, 再通过 vertical-align: middle.( 注意内容不要换行.)

2).水平居中.margin: 0 auto;(当然不是万能)

你可以把html的body之内任何项目置于中,该项目将自动获得相等的左右边界值从而保证了居中显示。不过,这在IE6之前版本的浏览器中仍然有问题,将不会居中,因此必须修改如下:

body {

text-align:center;

}

#content {

text-align:left;

width: 700px;

margin: 0 auto;

}

对body的设定将导致主体内容居中,但是连所有的文字也居中了,这恐怕不是你想要的效果,为此#content的div还要指定一个值:text-align: left

3. 浮动ie产生的双倍距离

#box{float:left; width:100px; margin:0 0 0 100px; //这种情况之下IE会产生200px的距离 display:inline; //使浮动忽略}

这里细说一下block与inline两个元素:block元素的特点是,总是在新行上开始,高度,宽度,行高,边距都可以控制(块元素);Inline元素的特点是,和其他元素在同一行上,不可控制(内嵌元素);

#box{display:block; //可以为内嵌元素模拟为块元素 display:inline; //实现同一行排列的效果

margin加倍的问题。

 

设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。

解决方案是在这个div里面加上display:inline;

例如:

 

<#divid="imfloat"></#div>

 

 

相应的css为

 

#IamFloat{

float:left;

margin:5px;/*IE下理解为10px*/

display:inline;/*IE下再理解为5px*/}

4、 DIV浮动IE文本产生3象素的bug

 

左边对象浮动,右边采用外补丁的左边距来定位,右边对象内的文本会离左边有3px的间距.

 

#box{float:left; width:800px;}

#left{float:left; width:50%;}

#right{width:50%;}

*html#left{ margin-right:-3px; //这句是关键}

HTML代码<divid="box"> <div id="left"></div> <divid="right"></div></div>

CSShack