2016/06/30
这是个前端
开发人员绕不开的话题,除非你做自己的网站,不用考虑那些使用IE
浏览器的用户,我的网站我做主!
但是更多的开发人员是在耕耘公司的项目,而公司的项目是需要面向所有用户的。
前言
现状
现实情况是国内甚至全世界仍然有使用windows XP
操作系统(自带IE 6
浏览器)和windows 7
操作系统(自带IE 8
浏览器)的用户。它并不像Chrome
和Firefox
这些所谓的现代浏览器
那样,版本升级可以覆盖,而微软的这一系列浏览器早期因为标准的缺失,导致了需要对它进行兼容性处理。
因为
windows
系统的内部原因,这些版本的浏览器无法升级至最新版本。
完整的兼容性问题列表,请点击这里,扫一眼你会发现,大部分问题都集中在IE 6~9
。
说明
现在的前端
开发方式分为两种,我的理解是:基于浏览器
的和基于bundle工具
的。
基于浏览器的
使用require.js
或sea.js
等模块化工具开发项目,CSS
和JS
在HTML
文档中通过link
和script
标签引入,有时候顺序很重要。
基于bundle工具的
使用诸如webpack
等为SPA
应用而生的构建工具,用CommonJS
规范引用公共库或者自己编写的库,然后构建工具将所有依赖一起打包。
下文主要针对基于浏览器
的开发方式解决兼容性,而基于bundle工具
的,不同的框架有不同的解决方案。
正文
HTML
规范
整个文档的内容:注释
和标签
(包括像div
内容标签,meta
标签,link
标签,script
标签等所有以尖括号包围内容的标签)写法的规范。
不同的浏览器对注释
和标签
属性的解析和内容的处理略有不同,但大部分问题都可以为文档指定最新的DTD
而得以解决:
<!DOCTYPE html>
指定DTD
之后,参照HTML5
规范写即可避免大部分问题,点这里看规范。
语义化
如果定义了上述HTML5
的DTD
,而且需要使用到HTML 5
语言的新标签
,比如:
<main></main>
<section></section>
<nav></nav>
等等 语义化 标签,但是IE 6~9
是无法识别的,这时你需要 html5shiv 来帮助IE
浏览器理解这些标签。
如果你的网站使用DIV+CSS
布局,那就不需要了。
多媒体
低版本的IE
浏览器无法理解HTML 5
语言的多媒体标签<video>
和<audio>
,这时你需要这个polyfills
:MediaElement.js,不过针对IE
,它只支持IE 9+
。
CSS
选择器
现在遍地都是CSS 3
语法,但是IE 8
以下的浏览器无法理解CSS 3
语法中的一些选择器,这时你需要一个polyfills
:selectivizr。
属性
同样,IE 9
以下的浏览器无法理解诸如border-radius
等CSS 3
样式属性,这时你需要 PIE(Progressive Internet Explorer)。
布局
传统网站内容的布局(layout)是依赖 盒模型,垂直居中
这种老大难的问题就不好解决。所以W3C
在CSS 3
中提出了 Flexible Box(弹性布局),不过只支持IE 9+
。
而针对IE 6~8
,如果需要使用弹性布局
,你需要这个polyfills
:flexie。
hack
针对IE 6~9
的hack
写法,还有就是解决低版本IE
对属性表现的不一致。
div {
margin-top: 13px; /* 所有浏览器都支持 */
margin-top: 13px !important; /* Firefox、IE7支持 */
_margin-top: 13px; /* IE6支持 */
*margin-top: 13px; /* IE6、IE7支持 */
+margin-top: 13px; /* IE7支持 */
margin-top: 13px\9; /* IE6、IE7、IE8、IE9支持 */
margin-top: 13px\0; /* IE8、IE9支持 */
}
盒模型
IE 6
的文档可以设置一种Quirks Mode
(怪异模式),它的本意是模拟IE 5.5
的一些行为,但是这种模式下盒模型的计算与W3C
的盒模型解析有差别:
处理方式就是在
CSS 3
中设置所有标签
的box-sizing
属性为border-box
,以适应IE 6
。但是这个属性只有IE 8+
支持。
div {
box-sizing: border-box;
}
JavaScript
现在的市面上大部分JS
语言指南的标准都是ES 3
,而现在的浏览器能解析的标准列表如下:
-
IE 6~7
完全解析ES 3
-
IE 8
部分解析ES 5
-
IE 9+
完全解析ES 5
-
现代浏览器
完全解析ES 5
,部分解析ES 6
诸如React
等框架已经开始使用ES 6
和ES 7
了(但是他们最终都需要转换成ES 5
甚至是ES 3
才能在浏览器运行),但更多的框架都在逐渐抛弃IE 8
。
排除框架不谈,我们在开发中或多或少的在使用ES 5
标准了,那IE 6~8
不认识ES 5
中的一些属性和方法怎么办?
这时,你需要 es5-shim,它包含两个内容:shim
和sham
- shim,它使用
ES 3
的标准实现ES 5
的功能 - sham,它还是使用
ES 3
的标准模拟ES 5
功能,但是不保证能实现
最后
polyfills
浏览器不支持新API
的话,它会切换到能够实现的API
代码段。
比如ajax
请求,所有浏览器都可以通过XMLHttpRequest
这个API
,现在已有诸如 fetch 来处理。那么使用这种polyfills
,你在项目中使用fetch
时,遇到无法识别的浏览器时,它会切换到使用XMLHttpRequest
。
shim
他是使用旧的JS
引擎实现新标准,例子就是jQuery
。
这些所谓的polyfills
、shim
,源码都是使用JS
来解决兼容性问题,再次证明了JS
语言的重要性。
不管是HTML
、JS
、CSS
语言的属性或方法,使用这个网站可以查看兼容性,点我,点我。
网友评论