• 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="images/style_IE5.css" />
    3. <![endif]–>
    4. <!--[if IE 6]>
    5. <LINK rel="stylesheet" type="text/css" href="images/style_IE6.css" />
    6. <![endif]-->
    7. <!--[if IE 7]>
    8. <LINK rel="stylesheet" type="text/css" href="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;IE8和IE9都支持, IE6、IE7不能.;

    background-color:blue9; 仅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

     

     

    Y

    Y

     

    9

     

     

     

    Y

     

    :root 选择符 {属性9;}

     

     

     

     

    Y

     

    史上最全的例子

     <style>  
        #test   
        {   
            width:300px;   
            height:300px;   
            background-color:blue;      /*firefox*/
            background-color:red9;      /*all ie*/
            background-color:yellow;    /*ie8*/
            +background-color:pink;        /*ie7*/
            _background-color:orange;       /*ie6*/
        }  
        :root #test { background-color:purple9; }  /*ie9*/
        @media all and (min-0px){ #test {background-color:black;} }  /*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:red9;9所有的ie浏览器可识别;

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

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

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

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

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

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

     

     

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

    注意:

    <meta http-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;

    700px;

    margin: 0 auto;

    }

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

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

    #box{ float:left; 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;

    例如:

     

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

     

     

    相应的css为

     

    #IamFloat{

    float:left;

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

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

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

     

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

     

    #box{ float:left; 800px;}

    #left{ float:left; 50%;}

    #right{ 50%;}

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

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

  • 相关阅读:
    java:transient是什么,有什么作用
    如何阅读java源码
    java里面list是引用的好例子
    sort给文件按照大小排序
    HBase的rowkey排序和scan输出顺序
    记录一次事故——idea,sbt,scala
    一个简单的synchronized多线程问题、梳理与思考
    Android TextView文字描边的实现!!
    android中include标签的使用
    layout_weight 的解释及使用
  • 原文地址:https://www.cnblogs.com/QingFlye/p/4121975.html
Copyright © 2020-2023  润新知