由于IE8不支持HTML5,而它又是Win7的默认浏览器,我们即使讨厌它,在这几年却也拿它没办法。

最近做了个需要兼容IE8的项目,不可避免地用了HTML5+CSS3,甚至canvas和svg,做兼容工作的时候不禁叫苦不迭。一个项目下来后,倒是收集了一些志于让HTML5兼容IE8的库,还有一些零散的代码和优雅降级的技巧,整理如下。IE8的兼容工作是个大活,这篇文章还不完整,肯定有很多疏漏和不足,望读者能在评论区指正,同时我也会在之后的项目中逐渐丰富这篇文章。

一、HTML5标签兼容方案:html5shiv.js

GitHub地址:https://github.com/aFarkas/html5shiv/

IE8不支持HTML5的新标签,如<header>、<nav>等标签在IE8无法渲染。html5shiv.js可帮助IE6-8浏览器兼容HTML5语义化标签。

使用方法:在页面中引用html5shiv.js文件。必须添加在页面的<head>元素内,因为IE浏览器必须在元素解析前知道这个元素,所以这个js文件不能在页面底部引用。

二、CSS3媒体查询兼容方案:Respond.js

GitHub地址:https://github.com/scottjehl/Respond

IE8不支持CSS媒体查询,对响应式设计大大不利。Respond.js可帮助IE6-8兼容“min/max-width”媒体查询条件。

使用方法:在页面中所有css文件的引用位置之后引用Respond.js。而且Respond.js的引用得越早,用户看到页面闪烁的机会越小。

三、CSS3字体单位“rem”兼容方案:rem.js

GitHub地址:https://github.com/chuckcarpenter/REM-unit-polyfill

CSS3引入了新的字体大小单位rem,与em的“相对于其父元素来设置字体大小”的功能不同,rem是相对于根元素<html>的字体大小比率单位,成了目前主流的单位之一。IE9+开始支持,IE8就只能通过引入js库来支持了。

使用方法:在页面中引用rem.js文件。需要引用在页脚,也就是<body>末尾,在所有css文件引用和DOM元素之后。

四、CSS3“background-size”属性的“cover”和“contain”属性值兼容方案:background-size polyfill

GitHub地址:https://github.com/louisremi/background-size-polyfill

“background-size”是CSS3新引入的属性,其中有两个属性值非常常用,分别为“cover”和“contain”。“cover”可以把背景图像扩展至足够大,以使背景图像完全覆盖背景区域,背景图像的某些部分也许无法显示在背景定位区域中。“contain”可以把图像图像扩展至最大尺寸,以使其宽度和高度完全适应内容区域。IE8同样不支持,非常不方便。这时可以引用“background-size polyfill”库来兼容。

使用方法:与以上几个库不同,“background-size polyfill”的代码文件需要在css中引用。在所有用到这两个“background-size”属性值的地方,加一行“-ms-behavior”属性:

.selector {
background-size: cover;
/* 以下相对路径是相对于文档,而非css文件! */
/* 使用绝对路径可以避免混淆 */
-ms-behavior: url(/backgroundsize.min.htc);
}

五、JS数组的forEach方法兼容方案:自行实现

IE8的数组对象没有forEach方法,晕。所以自行声明即可,代码如下:

if ( !Array.prototype.forEach ) {
Array.prototype.forEach = function forEach( callback, thisArg ) {
var T, k;
if ( this == null ) {
throw new TypeError( "this is null or not defined" );
}
var O = Object(this);
var len = O.length >>> 0;
if ( typeof callback !== "function" ) {
throw new TypeError( callback + " is not a function" );
}
if ( arguments.length > 1 ) {
T = thisArg;
}
k = 0;
while( k < len ) {
var kValue;
if ( k in O ) {
kValue = O[ k ];
callback.call( T, kValue, k, O );
}
k++;
}
};
}

此外,IE8不支持的js特性不止forEach一种,等以后遇到了再作补充。

六、SVG图形兼容方案:优雅降级

参考文章:http://www.zhangxinxu.com/wordpress/2013/09/svg-fallbacks/

对于svg图形是真的无法直接兼容了,因此使用优雅降级,在IE8下显示替代的jpg、png或gif图片。有三种比较实用的方法:一是用js修改<img>的src属性,这里省略;二是用HTML的hack实现优雅降级,类似于如下代码:

<svg width="96" height="96">
<image xlink:href="svg.svg" src="svg.png" width="96" height="96" />
</svg>

支持<svg>标签的浏览器会显示svg.svg,老版本浏览器会无视<svg>标签,渲染<image>标签,从而显示svg.png。

此外,还有一种比较巧妙的方法:

<img src="data:image.svg" onerror="this.src='image.png'">

此法有弊端:当image.png出现问题无法载入时,会陷入死循环。

七、Canvas兼容方案:Excanvas.js

下载地址:http://code.google.com/p/explorercanvas/downloads/list

Canvas的功能非常强大,兼容IE8的工作也很繁巨。可能有很大一部分情况要用优雅降级,但是一些情况下可以使用Google出的Excanvas.js库。它是利用IE支持的VML对象来模拟Canvas的绘图的,有些情况下可用,但无法穷尽Canvas的所有功能。

使用方法:在页面中引用Excanvas.js文件,最好在<head>标签中。

具体注意事项可以参考文章:http://rockyuse.iteye.com/blog/1618298

八、Canvas+WebGL兼容方案:优雅降级

最近WebGL库——Three.js越来越流行了,但它只支持IE11+,IE8的兼容好像无解……所以只能优雅降级,但是效果肯定大打折扣。如有兼容方案,还请不吝赐教!

Web前端页面的浏览器兼容性测试心得(三)总结一些IE8兼容问题的解决方案的更多相关文章

  1. Web前端页面的浏览器兼容性测试心得(二)搭建原汁原味的IE8测试环境

    如果你做的页面被老板或PM要求兼容IE8,你就值得同情了.IE8不支持HTML5,在2017年的前端界,开发者不涉及HTML5标准简直寸步难行.然而,有一个可怕的事实客观存在,那就是IE8是Win7系 ...

  2. Web前端页面的浏览器兼容性测试心得(一)搭建测试用本地静态服务器

    自从实习以来,我体验了由一个人编程再到多人协作编程的转换.同时也接触了很多新鲜事物,学到了很多东西.工作时,常常需要多个人协同测试一张H5页面(PC.手机.平板等跨设备测试),也会经常把页面给PM或老 ...

  3. 【web前端开发】浏览器兼容性处理

    1.居中问题div里的内容,IE默认为居中,而FF默认为左对齐,可以尝试增加代码margin: 0 auto;2.高度问题两上下排列或嵌套的div,上面的div设置高度(height),如果div里的 ...

  4. 转:【web前端开发】浏览器兼容性处理大全

    解决思路: ①.写代码的时候遵循W3C标准,按照最新稳定版本的IE或WebKit内核浏览器进行编码 ②.遇到部分无法全面解决浏览器兼容的时候,采取CSS的hack手段进行针对性微调.简单的说,CSS ...

  5. 【web前端开发】浏览器兼容性处理大全

    1.居中问题 div里的内容,IE默认为居中,而FF默认为左对齐,可以尝试增加代码margin: 0 auto; 2.高度问题 两上下排列或嵌套的div,上面的div设置高度(height),如果di ...

  6. Web浏览器兼容性测试工具如何选择

    对于前端开发工程师来说,网页兼容性测试工程师而言,确保代码在各种主流浏览器的各个版本中都能正常工作是件很费时的事情,幸运的是,有很多优秀的工具可以帮助测试浏览器的兼容性,领测软件测试网向您推荐12款很 ...

  7. web前端页面优化——个人见解

    web前端页面优化,我们从JavaScript.css.html这3个方面说下,我的见解,希望大神们能有刚好优化方法,一起探讨. 一.  有关javascript方面 优化见解. 1. 首先举个例子: ...

  8. Web 前端页面性能监控指标

    Web 前端页面性能监控指标 性能监控 / 性能指标 / 性能优化 白屏时间计算 FCP 白屏时间:从浏览器输入地址并回车后到页面开始有内容的时间: 首屏时间计算 FMP 首屏时间:从浏览器输入地址并 ...

  9. web前端页面项目经验总结

    项目时间:2016年4月5日--4月9日项目名称:阿七果子园web前端页面项目内容:    1.HTML5+CSS+JavaScript(banner+timer)+JQuery(small_bann ...

随机推荐

  1. iOS: NSObject中执行Selector的相关方法

    本文转载至 http://www.mgenware.com/blog/?p=463 1. 对当前Run Loop中Selector Sources的取消 NSObject中的performSelect ...

  2. Servlet与JSP九大内置对象的对应关系

    JSP对象 Servlet中怎样获得 out resp.getWriter request service方法中的req参数 response service方法中的resp参数 session re ...

  3. JqGrid 获取所有数据

    jqGrid使用本地数据时,当jqGrid配置的rowNum小于本地总数据量(records属性记录总数据,可以通过records获取到本地总数据量),调用getRowData方法获取到的只是显示的部 ...

  4. ORA-12899: value too large for column

    ORA-12899: value too large for column "SOAU"."SJQY_QTSBSPEC"."PROPERTY_6&qu ...

  5. 堪称神器的Windows软件推荐

    更多软件使用技巧.破解软件以及硬件选购知识,欢迎加入我的QQ群(701974765)与我们交流!! 先贴上软件列表,详细描述后期更新,可自行百度 TrafficMonitor CPU.内存.网速资源监 ...

  6. 按批次处理list数据 (list按条数取)

    按批次处理list数据的两种方法 主要应用于list存储数据过多,不能使list整体进行其余操作 Java | 复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  7. ambari安装集群下python连接hbase之安装thrift

    简介: python连接hbase是需要通过thrift连进行连接的,ambari安装的服务中貌似没有自带安装hbase的thrift,我是看配置hbase的配置名称里面没有thrift,cdh版本的 ...

  8. PCRE library

    wget http://nginx.org/download/nginx-1.15.6.tar.gz tar -xvf nginx-1.15.6.tar.gz ln -s nginx-1.15.6 n ...

  9. 多进程使用matplotlib.pyplot绘heatmap(多线程不可以)

    数据格式如下: 8_15/l_eye/2732.png -20.5773 -5.17769 -3.34583 21.5859 9_13_1/l_eye/1211.png -10.1145 34.992 ...

  10. C. Mail Stamps---cf29c(离散化,图)

    题目链接:http://codeforces.com/problemset/problem/29/C 题意就是有n(1e5)个点,找到一条能把所有的点都包含在内的路径,由于点的编号是 1e9 所以不得 ...