css中hack是什么
css 中 hack 是什么
一、总结
1、CSS hack:由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览器的不同版本,如IE6和IE7,对 CSS 的解析认识不完全一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。 这个时候我们就需要针对不同的浏览器去写不同的 CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。
2、hack:本意:修改,引申为对软件的二次修改 css hack 的意思是浏览器兼容
3、hack 实例: 1、属性级 Hack:比如 IE6 能识别下划线“_
”和星号“*
”,IE7 能识别星号“*
”,但不能识别下划线”_
”,而 firefox 两个都不能认识。
二、hack 是什么
由于不同的浏览器,比如 Internet Explorer 6,Internet Explorer 7,Mozilla Firefox 等,对CSS的解析认识不一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。
这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。
这个针对不同的浏览器写不同的CSS code 的过程,就叫 CSS hack, 也叫写 CSS hack。
Hack,顾名思义是修改的意思。 这次普通的词汇在 IT 上得到了很广泛的应用: 1、针对Discuz!系统,Dvbbs 系统等论坛软件的二次修改。 Hack 是基于开源的程序的基础,对其代码进行增加、删除或者修改、优化,使之在功能上符合新的需求。 目前,Hack 大多和插件混为一谈,其实二者是有很大区别的:插件一般是利用程序的 API(接口),复用程序底层,利用一些程序既有的函数和类制作新的小作品,一般有文件的增加,且符合标准的插件,其目录结构和文件名都是有一定格式的(如Discuz!的插件文件需放在 plugin 目录下)。而 Hack 则是针对原程序文件的直接修改,在格式上也自然没有太严格的规定,且一般没有文件的增加。 由于基础是开源免费的,一般的 Hack 也都是开源免费的,许多程序爱好者会根据自己或者朋友的需求,去制作一些小 Hack 在各个程序的官方交流论坛发布(比如动网的 hack 就会发布在动网的交流论坛的插件区),以获得站长们和官方的肯定和鼓励。
三、那么在HTML中 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;
以下是引自百度百科的定义
CSS hack由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览器的不同版本,如IE6和IE7,对CSS的解析认识不完全一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。 这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。
简单的说,CSS hack的目的就是使你的CSS代码兼容不同的浏览器。当然,我们也可以反过来利用CSS hack为不同版本的浏览器定制编写不同的CSS效果。
注意: 我们通常主要考虑的浏览器有IE6、IE7、IE8、谷歌浏览器(chrome)、火狐(Mozilla Firefox)即可,至于我们常用的傲游、QQ 的 TT 浏览器是用你计算机中装的系统自带浏览器的内核,所以只需要兼容以上浏览器即可兼容 TT 傲游浏览器。
CSS Hack 常见的有三种形式:
CSS 属性 Hack、CSS 选择符 Hack 以及 IE 条件注释 Hack, Hack 主要针对 IE 浏览器。
1、属性级 Hack:比如 IE6 能识别下划线“_
”和星号“*
”,IE7 能识别星号“*
”,但不能识别下划线”_
”,而 firefox 两个都不能认识。
2、选择符级 Hack:比如 IE6 能识别*html .class{}
,IE7 能识别*+html .class{}
或者*:first-child+html .class{}
。
CSS<wbr>
Hack 技术介绍及常用的 Hack 技巧集锦
3、IE 条件注释 Hack:IE 条件注释是微软 IE5 开始就提供的一种非标准逻辑语句。比如针对所有 IE:<!-[if IE]><!-您的代码-><![endif]>
,针对 IE6 及以下版本:<!-[if it IE 7]><!-您的代码-><![endif]->
,这类 Hack 不仅对 CSS 生效,对写在判断语句里面的所有代码都会生效。
PS:条件注释只有在 IE 浏览器下才能执行,这个代码在非 IE 浏览下被当做注释视而不见。可以通过 IE 条件注释载入不同的CSS、JS、HTML和服务器代码等。
二、CSS hack 的实际应用
CSS hack 用来解决有些 css 属性在不同浏览器中显示的效果不一样的问题,如margin 属性在 ie6 中显示的距离会比其他浏览器中显示的距离宽 2 倍,也就是说margin-left:20px;
在 ie6 中距左侧对象的实际显示距离是 40px,而在非 ie6 中显示的距左侧对象的距离是设置的值 20px; 所以要想设置一个对象距离左侧对象的距离在所有浏览器中都显示是 20px 的宽度的样式应为:.kwstu{margin-left:20px;_margin-left:20px;}
。比如要分辨 IE6 和 firefox 两种浏览器,可以这样写:
div{
background:green;/*forfirefox*/
*background:red;/*forIE6*/(bothIE6&&IE7)
}
我在 IE6 中看到是红色的,在 firefox 中看到是绿色的。
解释一下:上面的 css 在 firefox 中,它是认识不了后面的那个带星号的东西是什么的,于是将它过滤掉,不予理睬,解析得到的结果是:div{background:green}
, 于是理所当然这个 div 的背景是绿色的。在 IE6 中呢,它两个 background 都能识别出来,它解析得到的结果是:div{background:green;*background:red;}
, 于是根据优先级别,处在后面的 red 的优先级高,于是当然这个 div 的背景颜色就是红色的了。CSS hack: 区分 IE6,IE7,firefox 区别不同浏览器,CSS hack 写法:
区别 IE6 与 FF:
background:orange;*background:blue;
区别 IE6 与 IE7:
background:green!important;background:blue;
区别 IE7 与 FF:
background:orange;*background:green;
区别 FF,IE7,IE6:
background:orange;*background:green;_background:blue;
background:orange;*background:green!important;*background:blue;
注:IE 都能识别*
; 标准浏览器 (如 FF) 不能识别*
;IE6 能识别*
;不能识别 !important
;IE7 能识别*
,能识别!important
;FF 不能识别*
,但能识别!important
;
浏览器优先级别:
FF<IE7<IE6,CSS hack
书写顺序一般为 FF IE7 IE6
以: " #demo {width:100px;}
" 为例:
#demo {width:100px;} /* 被 FIREFOX,IE6,IE7 执行.*/
* html #demo {width:120px;} /* 会被 IE6 执行, 之前的定义会被后来的覆盖, 所以 #demo 的宽度在 IE6 就为 120px; */
*+html #demo {width:130px;} /* 会被 IE7 执行 */
所以最后,#demo的宽度在三个浏览器的解释为: FIREFOX:100px; ie6:120px; ie7:130px;
IE8 最新css hack:
"9" 例:"border:1px 9;".这里的"9"可以区别所有IE和FireFox.(只针对IE9 Hack)
"0" IE8识别,IE6、IE7不能.
"*" IE6、IE7可以识别.IE8、FireFox不能.
"_" IE6可以识别"_",IE7、IE8、FireFox不能.
IE6 hack
_background-color:#CDCDCD;/*ie6*/
IE7 hack
*background-color:#dddd00; /* ie 7*/IE8 hack
background-color:red 0; /* ie 8/9*/IE9 hack
background-color:blue 90;火狐,傲游,浏览器通用
background-color:red!important;
注意写 hack 的顺序,其中:
background-color:red0;IE8和IE9都支持;
background-color:blue90; 仅IE9支持;
另外,background-color:eeeeee9;的HACK支持IE6-IE8,但是IE8不能识别“*”和“_”的CSS HACK。
可综合上述规律灵活应用。
IE9 和 IE8 以及其他版本的区别说明
background-color:blue; 各个浏览器都认识,这里给firefox用;
background-color:red9;9所有的ie浏览器可识别;
background-color:yellow0; 0 是留给ie8的,最新版opera也认识,后面自有hack写了给opera认的,所以,0我们就认为是给ie8留的;
+background-color:pink; + ie7定了;
_background-color:orange; _专门留给神奇的ie6;
:root #test {background-color:purple9;} :root 是给 ie9 的,网上流传了个版本是 :root #test {background- color:purple0;},这个,新版 opera 也认识,所以经笔者反复验证最终 ie9 特有的为:root 选择符 {属性 9;}
@media all and (min-width:0px){ #test {background-color:black0;} } 这个是老是跟 ie 抢着认 0 的神奇的 opera,必须加个 0, 不然 firefox,chrome,safari 也都认识。。。
@media screen and (-webkit-min-device-pixel-ratio:0){ #test {}} 最后这个是浏览器新贵 chrome 和 safari 的。
选择符级 HackCSS 内部选择符级 Hack 语法
<hack> selector{ sRules }
说明选择不同的浏览器及版本尽可能减少对 CSS Hack 的使用。Hack 有风险,使用需谨慎通常如未作特别说明,本文档所有的代码和示例的默认运行环境都为标准模式。一些 CSS Hack 由于浏览器存在交叉认识,所以需要通过层层覆盖的方式来实现对不同浏览器进行 Hack 的。简单列举几个:
* html .test{color:#090;} /* For IE6 and earlier */
* + html .test{color:#ff0;} /* For IE7 */
.test:lang(zh-cn){color:#f00;} /* For IE8+ and not IE */
.test:nth-child(1){color:#0ff;} /* For IE9+ and not IE */
内部属性 HackCSS 内部属性级 Hack 语法:
selector{<hack>?property:value<hack>?;}
取值:
注意: 不管是什么方法,书写的顺序都是 firefox 的写在前面,IE7 的写在中间,IE6 的写在最后面。补充:IE6 能识别*
,但不能识别 !important
,IE7 能识别 *
,也能识别!important
;FF 不能识别 *
,但能识别!important
; 下划线” _
“,IE6 支持下划线,IE7 和 firefox 均不支持下划线。
三、为什么不推荐不推荐使用 CSS hack 来解决兼容性问题
CSS hack 是因为现有浏览器对标准的解析不同,为了兼容各浏览器,所采用的一种补救方法。CSS hack 是一种类似作弊的手段,以欺骗浏览器的方式达到兼容的目的,是用浏览器的兼容性差异来解决浏览器的兼容性问题。因此,在设计之初,写 CSS hack 需要遵循以下三条原则:
- 有效: 能够通过 Web 标准的验证
- 只针对太古老的 / 不再开发的 / 已被抛弃的浏览器, 而不是目前的主流浏览器
- 代码要丑陋。让人记住这是一个不得已而为之的 Hack, 时刻记住要想办法去掉它。现在很多 hacks 已经抛弃了最初的原则,而滥用 hack 会导致浏览器更新之后产生更多的兼容性问题。因此,并不推荐使用 CSS hack 来解决兼容性问题。
常用的 CSS Hack
代码如下: