我们在做前端的时候,经常会遇到各种浏览器显示不太一致的情况,css hack就是让你的css代码兼容不同的浏览器。
css hack大部分针对IE不同版本之间的表现差异而引入的,下面有几个demo可以把IE6-IE10和其他的浏览器做一个兼容。
1、那么什么是css hack呢?
由于各大浏览器来自不同的厂商(如Internet Explorer/Safari/ Mozilla Firefox/Chrome等),对css的支持、解释都不太一样,导致页面效果在不同的浏览器环境中显示不一致。
所以我们就要针对不同的浏览器/不同版本写出一些特定的css样式啦,要不然写出页面显示杂七杂八的,自己都会觉得不舒服。
我们把这个过程叫做css hack。
2、接下来我们来看一下css hack的原理吧
不同的浏览器和不同的浏览器版本对css的支持和解析不一样,以及css优先级对浏览器展现效果的影响,我们可以根据这个对不同的浏览器情景来使用不同的css。
3、css hack分类:(3中表现形式)
(1)css属性前缀法:(即内部hack)
- IE6:能识别下划线“_”和星号“*”;
- IE7:不能识别“_”,能识别“*”;
- IE6-IE10:识别“9”;
- Firefox:不识别“_”、“*”、“9”。
(2)选择器前缀法:(即选择器hack)
- IE6:能识别*html .class{};
- IE7:能识别*+html .class{}或者*:first-child+html .class{};
(3)IE条件注释法(即HTML头部引用 if IE)(即HTML条件注释hack):
针对除了IE10+以外所有的IE:<!--[if IE]>IE浏览器显示的内容<![endif]-->;
针对IE6及以下的版本:<!--[if It IE 6]>只在IE6-显示的内容<![endif]-->;
这类hack不仅对css生效,对写在判断句里面的所有代码都会生效。
4、css hack 书写顺序
一般是将使用范围广、被识别能力强的css定义在后面。
5、css hack 方式一:条件注释法
这种方式是专门归IE浏览器所有的hack方式。
下面是几个例子:
- 只在IE下生效
- <!--[if IE]>这个注释在IE中才能显示。<!endif]-->
- 只在IE6下生效
- <!--[if IE 6]>这个注释在IE6中才能显示。<!endif]-->
- 只在IE6以上版本生效
- <!--[if gte IE 6]>这个注释在IE6以上(包括)浏览器中才能显示。<!endif]-->
- 只在IE8上不生效
- <!--[if ! IE 8]>这个注释在非IE8中才能显示。<!endif]-->
- 非IE下生效
- <!--[if !IE]>这个注释在非IE中才能显示。<!endif]-->
6、css hack 方式二:类内属性前缀法
属性前缀法:在css样式样式属性名前加上一些只有特定浏览器才能识别的hack前缀。
IE浏览器各版本 CSS hack 对照表:
hack | 写法 | 实例 | IE6(S) | IE6(Q) | IE7(S) | IE7(Q) | IE8(S) | IE8(Q) | IE9(S) | IE9(Q) | IE10(S) | IE10(Q) |
* | *color | 青色 | Y | Y | Y | Y | N | Y | N | Y | N | Y |
+ | +color | 绿色 | Y | Y | Y | Y | N | Y | N | Y | N | Y |
- | -color | 黄色 | Y | Y | N | N | N | N | N | N | N | N |
_ | _color | 蓝色 | Y | Y | N | Y | N | Y | N | Y | N | N |
# | #color | 紫色 | Y | Y | Y | Y | N | Y | N | Y | N | Y |