一,什么是css hack?
CSS hack由于不同厂商的浏览器,比如Internet Explorer,Safar,Mozilla Firefo,Chrome等,或者是同一厂商的浏览器的不同版本,如IE6和IE7,对CSS的解析认识不完全一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。 这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。 简单的说,CSS hack的目的就是使你的CSS代码兼容不同的。当然,我们也可以反过来利用CSS hack为不同版本的浏览器定制编写不同的CSS效果。
二,谈一谈浏览器兼容的思路
要不要做
产品的角度:产品的受众、受众的浏览器比例、效果优先还是基本功能优先
成本的角度 :有无必要做某件事做到什么程度
让哪些浏览器支持哪些效果如何做
根据兼容需求选择技术框架/库(jquery)
根据兼容需求选择兼容工具(html5shiv.js、respond.js、css reset、normalize.css、Modernizr)
postCSS
条件注释、CSS Hack、js 能力检测做一些修补
三,列举5种以上浏览器兼容的写法
1.属性前缀法(即类内部Hack):
例如 IE6能识别下划线""和星号" * ",IE7能识别星号" * ",但不能识别下划线"",IE6~IE10都认识"\9",但firefox前述三个都不能认识
.top{
_color:red;/*只被ie6所解析*/
*color:blue;/*只被ie6、ie7所解析*/
color:white/9;/*可被ie6~ie10所解析*/
}
2.条件注释法
是于HTML源码中被IE有条件解释的语句。条件注释可被用来向IE提供及隐藏代码。
<!--[if IE]>用于 IE <![endif]-->
<!--[if IE 6]>用于 IE6 <![endif]-->
<!--[if IE 7]>用于 IE7 <![endif]-->
<!--[if IE 8]>用于 IE8 <![endif]-->
<!--[if IE 9]>用于 IE9 <![endif]-->
<!--[if gt IE 6]> 用于 IE6 以上版本<![endif]-->
<!--[if lte IE 7]> 用于 IE7或更低版本 <![endif]-->
<!--[if gte IE 8]>用于 IE8 或更高版本 <![endif]-->
<!--[if lt IE 9]>用于 IE9 以下版本<![endif]-->
<!--[if !IE]> -->用于非 IE <!-- <![endif]-->
3.选择合适的框架和属性
框架如:
- Bootstrap (>=ie8)
- jQuery 1.~ (>=ie6), jQuery 2.~ (>=ie9)
- Vue (>= ie9)
属性如:
inline-block: >=ie8
min-width/min-height: >=ie8
:before,:after: >=ie8
div:hover: >=ie7
inline-block: >=ie8
background-size: >=ie9
圆角: >= ie9
阴影: >= ie9
动画/渐变: >= ie10
4.浏览器私有前缀法
- -moz代表firefox浏览器私有属性
- -ms代表IE浏览器私有属性
- -webkit代表chrome、safari私有属性
5.使用Modernizr等类似工具来帮助页面进行各新旧浏览器的兼容
四,以下工具/名词是做什么的?
- 条件注释:一种安全的区分IE浏览器版本的语法,且被认为是取代针对IE css hack的首选办法,对IE的版本和非IE有优秀的区分能力。
- IE Hack:针对IE浏览器各版本的漏洞或特性,来分别兼容IE各版本浏览的做法,常用的方法如条件注释。
- js 能力检测:利用js进行浏览器的能力检测,能力检查的目标不是识别特定的浏览器,而是识别浏览器的能力,然后根据浏览器的能力,设定不同的兼容方案。
- html5shiv.js:用于解决IE9以下版本浏览器对HTML5新增标签不识别,并导致CSS不起作用的问题。
- respond.js:帮助ie6~ie8浏览器支持响应式布局。
- css reset:默认样式重置
- Normalize:在默认的HTML元素样式上提供了跨浏览器的高度一致性。它的主要目的是
1.保护有用的浏览器默认样式而不是完全去掉它们
2.一般化的样式:为大部分HTML元素提供
3.修复浏览器自身的bug并保证各浏览器的一致性
4.优化CSS可用性:用一些小技巧
5.解释代码:用注释和详细的文档来 - Modernizr:是一个用来检测浏览器功能支持情况的 JavaScript 库,它会在会在页面加载后立即检测特性;然后创建一个包含检测结果的 JavaScript 对象,同时在 html 元素加入方便你调整 CSS 的 class 名。
- POSTCSS: 它可以被理解为一个平台,可以让一些插件在上面跑,它提供了一个解析器,可以将CSS解析成抽象语法树,通过PostCSS这个平台,我们能够开发一些插件,来处理CSS。