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\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 all
and (min-width:0px){ #test {background-color:black\0;} } 这个是老是跟ie抢着认\0的神奇的opera,必须加个\0,不然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;

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;

例如:

 

<#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; width:800px;}

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

#right{
width:50%;}

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

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

时间: 2024-11-05 14:51:37

CSShack的相关文章

浏览器兼容之条件注释,cssHack

对于形形色色的浏览器,随之而来的就是一些兼容问题,大多应该都是IE下的兼容问题,因为任何浏览器下出现渲染不一致都极有可能是我们自己的结构或样式不符合W3C的某些要求,或者说违背了浏览器的某些规则而先造成的,所以我们应该尽量通过结构或CSS的修改来达到各浏览器渲染一致效果! 条件表达式(注:条件注释只能用在IE5-IE9,因为微软已经在IE10以后的版本中已禁用IE特有的条件注释功能,详情见:https://msdn.microsoft.com/zh-cn/library/ie/hh801214%

浏览器兼容处理(HTML条件注释、CSSHack和JS识别)

前面的话 本文中所有IEx+代表包含x及x以上:IEx-代表包含x及x以下,仅个人习惯.例:IE7+代表IE7.IE8…… 本文中所有例子全部经过测试,欢迎交流. HTML识别 条件注释法(IE10+已经不支持条件注释) [注意]两个--和左中括号[之间不能有空格,否则无效 [1]IE9-(<!--[if IE]><![endif]-->) <!DOCTYPE html> <html lang="en"> <head> <

IE浏览器常见CSS兼容性问题及解决办法

对于前端开发者来讲,世界上存在着一个神奇的东西——IE浏览器,尤其是低版本的IE浏览器,惨不忍睹的兼容性使其臭名昭著.前端工作者很多的时间都花在了和它打交道上,所以大家纷纷吐槽IE浏览器如何的渣,简直是万恶之源.但是IE浏览器市场份额有非常大,喷完还要接着搞兼容.对于IE浏览器来讲,我们应该有一个客观的评价.首先其兼容性差,原因可想而知,更新速度太慢,要几年才出一个版本,而市场上的FireFox.chrome等浏览器几个月就有一个版本上市.中间那么长的时间足以将其bug充分的暴露出来,其他浏览器

IE浏览器下常见的CSS兼容问题

[1]IE6-浏览器下子元素能撑开父级设置好的宽高 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> body{ margin: 0; } ul{ margin: 0; padding: 0; list-style: none; } .list{

css中的hack

1.什么是CSS hack? CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器识别不同的符号(什么样的浏览器识别什么样的符号是有标准的,CSS hack就是让你记住这个标准),以达到应用不同的CSS样式的目的,比如.kwstu{width:300px;_width:200px;},一般浏 览器会先给元素使用width:300px;的样式,紧接着后面还有个_width:200px;由于下划线_width只有IE6可以识别,所以此样式 在IE6中实际设置对象的宽度为200px,

【转】Web前端浏览器兼容初探

原文地址:http://blog.jobbole.com/38638/ 前言 浏览器兼容是前端开发人员必须掌握的一个技能,但是初入前端的同学或者其他后台web开发同学往往容易选择忽略,而形成两个极端: 1 我最开始都是使用IE6,IE6上没问题,其它浏览器坑爹(多出现与前端后端一起搞的同学,小生2年前就这种状态,鼓励人家用ie6....) 2 我要遵循标准,我只要ff就好,IE就是坑爹的玩意,我不必去理他(小生一年前的心态...) 现在看来,之前的想法都是不对的,我们诚然应该追求最新的浏览器使用

几种垂直居中的方式

一.内容高度不固定,容器高度固定,要使内容在容器中垂直居中 a.使用空标签 <div class="cont"> <div class="inner">比较满意比较满意比较满意</div><div class="v">cssHack</div> </div> * { margin: 0; padding: 0; } .cont { background-color: #ccc

CSS Hack技术详解,支持IE 6-11、Chrome、FireFox、Safari、Opera

转自: http://www.365mini.com/page/css-hack-ie-chrome-firefox-safari-opera.htm 当前网络时代,各种各样的网页向我们展示着丰富多彩的网络世界,而浏览器则是我们欣赏网络世界的窗口. 以前,浏览器主要有IE和NetScape两家:到现在,各种各样功能强大的浏览器层出不穷.例如:举世闻名的浏览器有Chrome.FireFox.Safari.Opera,常见的"国产"浏览器有遨游.QQ.360.搜狗.UC.世界之窗. 由于不

&gt;&gt;我要做特工系列 之 CSS 3_animation_向右滑出后下滑并停止

新手入门还没有正式发点啥东西,都是在装潢博客这个家了,到现在为止还是没有装修好..熟悉了这边的发布规范之后会持续在这里记录,给自己留下学习的脚印~ 这正式的第一篇随笔写个使用css3的动画效果. 总感觉电影里特工那种酷炫的应用界面很舒服,开始尝试用css3做一个,所以这是系列篇,名字就叫做 '我要做特工' .之前没怎么深入过css3,就从这里开始吧,毕竟指望别人提供近似项目化的需求还给时间学习的机会不是很现实,自己动手丰衣足食嘛~ 先看一下效果: <!DOCTYPE html> <htm