一.什么是CSS hack

由于不同厂商的流览器或某浏览器的不同版本(如IE6-IE11,Firefox/Safari/Opera/Chrome等),对CSS的支持、解析不一样,导致在不同浏览器的环境中呈现出不一致的页面展现效果。这时,我们为了获得统一的页面效果,就需要针对不同的浏览器或不同版本写特定的CSS样式,我们把这个针对不同的浏览器/不同版本写相应的CSS code的过程,叫做CSS hack!

二.CSS hack的原理

由于不同的浏览器和浏览器各版本对CSS的支持及解析结果不一样,以及CSS优先级对浏览器展现效果的影响,我们可以据此针对不同的浏览器情景来应用不同的CSS。

三.CSS hack分类

CSS Hack大致有3种表现形式,CSS属性前缀法、选择器前缀法以及IE条件注释法(即HTML头部引用if IE)Hack,实际项目中CSS Hack大部分是针对IE浏览器不同版本之间的表现差异而引入的。

  1. IE条件注释法(即HTML条件注释Hack):针对所有IE(注:IE10+已经不再支持条件注释): ,针对IE6及以下版本: 。这类Hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效。
  2. 选择器前缀法(即选择器Hack):例如 IE6能识别html .class{},IE7能识别+html .class{}或者*:first-child+html .class{}。
  3. 属性前缀法(即类内部Hack):例如 IE6能识别下划线"“和星号” * “,IE7能识别星号” * “,但不能识别下划线”",IE6~IE10都认识"\9",但firefox前述三个都不能认识。
      
    CSS hack书写顺序,一般是将适用范围广、被识别能力强的CSS定义在前面。

方式一:条件注释法

这种方式是IE浏览器专有的Hack方式,微软官方推荐使用的hack方式。举例如下

只在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]-->

方式二:类内属性前缀法
属性前缀法是在CSS样式属性名前加上一些只有特定浏览器才能识别的hack前缀,以达到预期的页面展现效果。

IE浏览器各版本 CSS hack 对照表

说明:在标准模式中

  • “-″减号是IE6专有的hack
  • “\9″ IE6/IE7/IE8/IE9/IE10都生效
  • “\0″ IE8/IE9/IE10都生效,是IE8/9/10的hack
  • “\9\0″ 只对IE9/IE10生效,是IE9/10的hack
    demo如下
<script type="text/javascript">//alert(document.compatMode);
</script>
<style type="text/css">
body:nth-of-type(1) .iehack{color: #F00;/* 对Windows IE9/Firefox 7+/Opera 10+/所有Chrome/Safari的CSS hack ,选择器也适用几乎全部Mobile/Linux/Mac browser*/
}
.demo1,.demo2,.demo3,.demo4{width:100px;height:100px;
}
.hack{/*demo1 */
/*demo1 注意顺序,否则IE6/7下可能无法正确显示,导致结果显示为白色背景*/background-color:red; /* All browsers */background-color:blue !important;/* All browsers but IE6 */*background-color:black; /* IE6, IE7 */+background-color:yellow;/* IE6, IE7*/background-color:gray\9; /* IE6, IE7, IE8, IE9, IE10 */background-color:purple\0; /* IE8, IE9, IE10 */background-color:orange\9\0;/*IE9, IE10*/_background-color:green; /* Only works in IE6 */*+background-color:pink; /*  WARNING: Only works in IE7 ? Is it right? */
}/*可以通过javascript检测IE10,然后给IE10的<html>标签加上class=”ie10″ 这个类 */
.ie10 #hack{color:red; /* Only works in IE10 */
}/*demo2*/
.iehack{/*该demo实例是用于区分标准模式下ie6~ie9和Firefox/Chrome的hack,注意顺序
IE6显示为:绿色,
IE7显示为:黑色,
IE8显示为:红色,
IE9显示为:蓝色,
Firefox/Chrome显示为:橘色,
(本例IE10效果同IE9,Opera最新版效果同IE8)
*/background-color:orange;  /* all - for Firefox/Chrome */background-color:red\0;  /* ie 8/9/10/Opera - for ie8/ie10/Opera */background-color:blue\9\0;  /* ie 9/10 - for ie9/10 */*background-color:black;  /* ie 6/7 - for ie7 */_background-color:green;  /* ie 6 - for ie6 */
}/*demo3
实例是用于区分标准模式下ie6~ie9和Firefox/Chrome的hack,注意顺序
IE6显示为:红色,
IE7显示为:蓝色,
IE8显示为:绿色,
IE9显示为:粉色,
Firefox/Chrome显示为:橘色,
(本例IE10效果同IE9,Opera最新版效果也同IE9为粉色)
*/
.element {background-color:orange;  /* all IE/FF/CH/OP*/
}
.element {*background-color: blue;    /* IE6+7, doesn't work in IE8/9 as IE7 */
}
.element {_background-color: red;     /* IE6 */
}
.element {background-color: green\0; /* IE8+9+10  */
}
:root .element { background-color:pink\0; }  /* IE9+10 *//*demo4*/
/*
该实例是用于区分标准模式下ie6~ie10和Opera/Firefox/Chrome的hack,本例特别要注意顺序
IE6显示为:橘色,
IE7显示为:粉色,
IE8显示为:黄色,
IE9显示为:紫色,
IE10显示为:绿色,
Firefox显示为:蓝色,
Opera显示为:黑色,
Safari/Chrome显示为:灰色,
*/
.hacktest{ background-color:blue;      /* 都识别,此处针对firefox */background-color:red\9;      /*all ie*/background-color:yellow\0;    /*for IE8/IE9/10 最新版opera也认识*/+background-color:pink;        /*for ie6/7*/_background-color:orange;       /*for ie6*/
}@media screen and (min-width:0){ .hacktest {background-color:black\0;}  /*opera*/
}
@media screen and (min-width:0) { .hacktest { background-color:purple\9; }/*  for IE9/IE10  PS:国外有些习惯常写作\0,根本没考虑Opera也认识\0的实际 */
}
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { .hacktest { background-color:green; } /* for IE10+ 此写法可以适配到高对比度和默认模式,故可覆盖所有ie10的模式 */
}
@media screen and (-webkit-min-device-pixel-ratio:0){ .hacktest {background-color:gray;} }  /*for Chrome/Safari*//* #963棕色 :root is for IE9/IE10, 优先级高于@media, 慎用!如果二者合用,必要时在@media样式加入 !important 才能区分IE9和IE10 */
/*
:root .hacktest { background-color:#963\9; }
*/
</style>

方式三:选择器前缀法
选择器前缀法是针对一些页面表现不一致或者需要特殊对待的浏览器,在CSS选择器前加上一些只有某些特定浏览器才能识别的前缀进行hack。

目前最常见的是

*html *前缀只对IE6生效
*+html *+前缀只对IE7生效
@media screen\9{…}只对IE6/7生效
@media \0screen {body { background: red; }}只对IE8有效
@media \0screen,screen\9{body { background: blue; }}只对IE6/7/8有效
@media screen\0 {body { background: green; }} 只对IE8/9/10有效
@media screen and (min-width:0\0) {body { background: gray; }} 只对IE9/10有效
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {body { background: orange; }} 只对IE10有效
等等
结合CSS3的一些选择器,如html:first-child,body:nth-of-type(1),衍生出更多的hack方式,具体的可以参考下表:

CSS3选择器结合JavaScript的Hack
我们用IE10进行举例:

由于IE10用户代理字符串(UserAgent)为:Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0),所以我们可以使用javascript将此属性添加到文档标签中,再运用CSS3基本选择器匹配。

JavaScript代码:

var htmlObj = document.documentElement;
htmlObj.setAttribute('data-useragent',navigator.userAgent);
htmlObj.setAttribute('data-platform', navigator.platform );

CSS3匹配代码:

html[data-useragent*=‘MSIE 10.0’] #id {
color: #F00;
}

第三部分:为什么不推荐使用CSS hack来解决兼容性问题

CSS hack是因为现有浏览器对标准的解析不同,为了兼容各浏览器,所采用的一种补救方法。CSS hack是一种类似作弊的手段,以欺骗浏览器的方式达到兼容的目的,是用浏览器的兼容性差异来解决浏览器的兼容性问题。因此,在设计之初,写CSS hack需要遵循以下三条原则:

有效: 能够通过 Web 标准的验证
只针对太古老的/不再开发的/已被抛弃的浏览器, 而不是目前的主流浏览器
代码要丑陋。让人记住这是一个不得已而为之的 Hack, 时刻记住要想办法去掉它。现在很多hacks已经抛弃了最初的原则,而滥用hack会导致浏览器更新之后产生更多的兼容性问题。因此,并不推荐使用CSS hack来解决兼容性问题。

CSS Hack的概念相关推荐

  1. css Hack

    1.css hack的概念 由于不同厂商的浏览器或浏览器的不同版本(如IE,firefox/Safari/Chrome等),对css的支持,解析不一样,导致在不同浏览器的环境中呈现出不一致的页面展现效 ...

  2. 今天才知道css hack是什么

    先来个冷笑话:一晚下班回家,一民警迎面巡逻而来.突然对我大喊:站住! 民警:int类型占几个字节? 我:4个. 民警:你可以走了. 我感到很诧异. 我:为什么问这样的问题? 民警:深夜还在街上走,寒酸 ...

  3. CSS Core CSS hack CSS优化

    web前端2021–小白进阶之路CSS3(2) CSS Core 复杂选择器 兄弟选择器 (1)相邻兄弟选择器 选择器1+选择器2{} 要求匹配选择器2紧挨着选择器1,修改选择器2的样式 (2)通用兄 ...

  4. CSS hack常用方案(摘选)

    邮箱因为默认了line-height?:170%,导致采用table元素时继承问题,可以采用line-height:50% 很好解决. 常 在使用float时,后面的显示不正常,因为继承了float了 ...

  5. [转]CSS hack大全详解

    转自:CSS hack大全&详解 1.什么是CSS hack? CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器识别不同的符号(什么样的浏览器识别什么样的符号是有标准的, ...

  6. 针对IE6\7\8\9\10浏览器的CSS hack大全详解

    目前IE内核浏览器仍然是国内主流浏览器,占据着PC浏览器的大部分市场份额,版本从IE6到IE10,所有前段工作者都必须面对和解决多个IE浏览器对代码的兼容性问题.在很多情况下,我们需要专门针对IE写c ...

  7. 对ie6、ie7、ff兼容性的详细css hack介绍

    这个毛病把我憋了好久了,最近到底找到了解决滴方式,通过偶测试系完整ok滴,和大伙儿共享. 以下为引佣: 如今偶大多数全是用!important来hack,关于ie6和firefox测试可以正常卖弄,可 ...

  8. 【总结】IE6,IE7,IE8,Firefox兼容的css hack 补充!

    IE6,IE7,IE8,Firefox兼容的css hack 补充: .color{ background-color: #CC00FF; /*所有浏览器都会显示为紫色*/ background-co ...

  9. Google Chrome的CSS hack写法

    Google自从2010年9月3日推出了浏览器Google Chrome,写前端效果的同志们又得辛苦了,现在就是个浏览器混乱的时代,自从Google混进来之后,就更混乱了. 不过还好Google用的是 ...

最新文章

  1. Spring Boot 揭秘与实战(二) 数据缓存篇 - EhCache
  2. 成功解决./nvidia-installer: invalid option: ‐‐no‐opengl‐files ERROR: Invalid commandline, please run `
  3. boost::ratio_string相关的测试程序
  4. git小乌龟一次性设置密码
  5. IEnumerableT和IQueryableT区分
  6. 记一次曲折的jsp手工半盲注入
  7. 带着canvas去流浪系列之九 粒子动画
  8. 使用冷门装机助手/流氓软件导致被捆绑安装各种奇奇怪怪软件的问题
  9. php 实现url rewrite 伪静态
  10. HTTP 405Method not allowed
  11. 魔兽世界服务器同时在线人数,魔兽世界服务器人数,魔兽世界服务器人数查询...
  12. HTML meta标签使用介绍
  13. 【3-hexo】为啥我又搭建了一个博客?【服务器自建博客】
  14. 简单排序算法时间空间复杂度分析及应用(7)-希尔排序
  15. DIV+CSS网页设计常用布局代码
  16. ATX 双电源切换电路
  17. Linux基础入门-2
  18. Eltra EL40A1024Z5/28P6X6PR2.004C
  19. 人工智能(mysql)—— mysql事务、存储引擎及调优
  20. JAVA中的多线程与运动仿真(1)——用JAVA来放一场烟花

热门文章

  1. 昨天已经过去,今天即将过完,那么明天呢……?
  2. clang+cmake设置编译工具链
  3. 2023年淮阴工学院五年一贯制专转本应用文写作考试大纲
  4. 官方 | 谷歌 AI 中国中心成立
  5. 我的心灵鸡汤之--心灵鸡汤--小故事,大道理
  6. 均值漂移(mean shift )聚类算法Matlab实现详解
  7. C# 第六章『交互式图形界面』◆第4节:FileDialog类 、OpenFileDialog类、SaveFileDialog类、示例
  8. 如何理解什么是keep-alive?
  9. 安装Linuxqq所遇到的问题及解决方法
  10. Hadoop完全分布式搭建过程、maven和eclipse配置hadoop开发环境、配置Map/Reduce Locations、简单wordcount测试!