同一份代码,有的浏览器效果正常,但有的浏览器效果无法达到预期,这时就是出现了浏览器不兼容的问题。
这种问题常常是因为不同产品的标准、实现方式不同,或是不同的时间出现的浏览器版本存在的bug、实现的功能都不同而产生的。
1. CSS hack
在遇到兼容问题时,针对不同浏览器去写不容的CSS,让它能在不同浏览器中获得相同的效果。
CSS Hack 大致有三种表现形式:CSS属性前缀法、选择器前缀法、IE条件注释法。
例如:
.box{
color: red;
_color: blue; /*ie6*/
*color: pink; /*ie6 7*/
color: yellow\9; /*ie/edge 6-8*/
}
2. 浏览器兼容的思路
1). 一般考虑浏览器兼容问题的流程
要不要做
产品的角度——产品的受众、受众的浏览器比例、效果和基本功能哪个优先
成本的角度——有没有必要实现做到什么程度
让哪些浏览器支持哪些效果如何做
根据兼容需求选择技术框架/库(jQuery)
根据兼容需求选择兼容工具
postCSS
条件注释、CSS Hack、JS 能力检测来做修补
2).两种常见的浏览器兼容思路:
** 渐进增强和优雅降级:**
- 渐进增强 —— 针对低版本浏览器进行构建页面,保证基本功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
- 优雅降级 —— 一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
3. 常见的5种浏览器兼容的写法
- 条件注释:
<!–-[if IE 7]><link rel="stylesheet" href="ie7.css" type="text/css" /><![endif]–->
- 属性选择器
.box{
color: red;
_color: blue; /*ie6*/
*color: pink; /*ie6 7*/
color: yellow\9; /*ie/edge 6-8*/
}
- 选择器前缀法
*html //只对IE6生效
*+html //只对IE7生效
@media screen\9{...} //只对IE6 7生效
- 条件注释结合类选择器
<!--[if IEMobile 7 ]> <html dir="ltr" lang="en-US"class="no-js iem7"> <![endif]-->
<!--[if (gte IE 9)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html dir="ltr" lang="en-US" class="no-js"><!--<![endif]-->
- 利用Modernizr工具
4. 浏览器兼容相关常见工具/名词:
-
条件注释
在HTML源码中被IE有条件解释的语句,可被用来向IE提供及隐藏代码。
但使用了条件注释的页面只能在IE9中正常工作,IE10不再支持条件注释。
项目 | 范例 | 说明 |
---|---|---|
! | [if !IE] | 非IE |
il | [if lt IE 5] | 小于IE5 |
lte | [if lte IE6] | 小于等于IE6 |
gt | [if gt IE5] | 大于IE5 |
gte | [if gte IE 7] | 大于等于IE7 |
| | [if (IE6)l(IE7)] | IE6或者IE7 |
IE Hack
针对不同的IE浏览器编写不同的CSS,从而使IE能够渲染出预期效果的过程。js 能力检测
使用JS的语法检测浏览器支持的属性,以便展示效果html5shiv.js
用来在 IE6、7、8 中模拟实现 html5 的标签,以实现对 IE 6、7、8 的兼容respond.js
在IE6、7中模拟实现CSS3的媒体查询,实现响应式css reset
用来完全去除浏览器的默认样式normalize.css
是css reset的改良版,在css reset的基础上保护有用的浏览器默认样式、为大部分HTML元素提供一般化的样式、修复浏览器自身的bug并保证各浏览器的一致性、使用一些小技巧优化CSS可用性、用注释和详细的文档来解释代码。Modernizr
Modernizr是一个 JavaScript 库,用于检测用户浏览器的 HTML5 与 CSS3 特性postCSS
PostCSS是一个JS插件转换样式表的工具,这些插件能够检验你的CSS、支持变量和混合,转化css3的新特性语法、行内图片等。
5. 一般在哪个网站查询属性兼容性?
可以使用 caniuse.com来查询CSS属性兼容情况,使用browserhacks.com来查询浏览器兼容的写法。