IE浏览器兼容问题总结

引自掘金:https://juejin.cn/post/6844903825854185480

一、标准盒模型和怪异盒模型

浏览器的盒子模型分为两类:

  1. 标准的W3C盒子模型。 chrome、firefox、IE9、IE10、IE11的盒模型为标准盒模型。
  2. IE6-8的盒子模型。多了Offset。

解决方法:

​ 使用DOCTYPE声明<!DOCTYPE html>,让浏览器使用标准模式

二、IE9 以下浏览器不能使用 opacity

<style>
.mydiv {
opacity: 0.5;
filter: alpha(opacity=50); /*IE6-IE8我们习惯使用filter滤镜属性来进行实现*/
filter: progid:DXImageTransform.Microsoft.Alpha(style=0, opacity=50); /*IE4-IE9都支持滤镜写法progid:DXImageTransform.Microsoft.Alpha(Opacity=xx)*/
}
</style>
<div class="mydiv"></div>

三、new Date('2019-4-18') IE不兼容

val= '2019-4-18' 想要获取下一天的日期 也要返回该格式。

var dd = new Date(val);
dd.setDate(dd.getDate()+1);//获取AddDayCount天后的日期
let Y = dd.getFullYear() + '-';
let M = (dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1) + '-';
let D = (dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate()) + ' ';
return (Y + M + D + '00:00:00');

IE中会报NAN的错误 因为IE无法识别new Date('2019-4-18')

  • 解决方法一:new Date('2019/4/18')
  • 解决方法二: val 转换为 Thu Apr 18 2019 15:33:55 GMT+0800 (中国标准时间) 原始格式
val.setMinutes(val.getMinutes() - val.getTimezoneOffset() + 24 * 60); //获取明天 需要多加24小时*60分钟
return val.toJSON().slice(0, 10) + ' 00:00:00'

四、IE事件绑定

4.1、W3C方式

element.addEventListener('click', function(e){}, false);

W3C绑定的优点:

  • 1.该方法同时支持事件处理的捕获和冒泡阶段。事件阶段取决于addEventListener最后的参数设置:false (冒泡) 或 true (捕获)。
  • 2.在事件处理函数内部,this关键字引用当前元素。
  • 3.事件对象总是可以通过处理函数的第一个参数(e)捕获。
  • 4.可以为同一个元素绑定你所希望的多个事件,同时并不会覆盖先前绑定的事件

W3C绑定的缺点:

  • 1.IE不支持,你必须使用IE的attachEvent函数替代。

4.2、IE方式

element.attachEvent('onclick', function(){});

IE方式的优点

  • 1.可以为同一个元素绑定你所希望的多个事件,同时并不会覆盖先前绑定的事件。

IE方式的缺点

  • 1.IE仅支持事件捕获的冒泡阶段;
  • 2.事件监听函数内的this关键字指向了window对象,而不是当前元素(IE的一个巨大缺点);
  • 3.事件对象仅存在与window.event参数中;
  • 4.事件必须以ontype的形式命名,比如,onclick而非click;
  • 5.仅IE可用。你必须在非IE浏览器中使用W3C的addEventListener.

4.3、兼容写法

var eventshiv = {
// event兼容
getEvent: function(event) {
return event ? event : window.event;
}, // type兼容
getType: function(event) {
return event.type;
}, // target兼容
getTarget: function(event) {
return event.target ? event.target : event.srcelem;
}, // 添加事件句柄
addHandler: function(elem, type, listener) {
if (elem.addEventListener) {
elem.addEventListener(type, listener, false);
} else if (elem.attachEvent) {
elem.attachEvent('on' + type, listener);
} else {
// 在这里由于.与'on'字符串不能链接,只能用 []
elem['on' + type] = listener;
}
}, // 移除事件句柄
removeHandler: function(elem, type, listener) {
if (elem.removeEventListener) {
elem.removeEventListener(type, listener, false);
} else if (elem.detachEvent) {
elem.detachEvent('on' + type, listener);
} else {
elem['on' + type] = null;
}
}, // 添加事件代理
addAgent: function (elem, type, agent, listener) {
elem.addEventListener(type, function (e) {
if (e.target.matches(agent)) {
listener.call(e.target, e); // this 指向 e.target
}
});
}, // 取消默认行为
preventDefault: function(event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
}, // 阻止事件冒泡
stopPropagation: function(event) {
if (event.stopPropagation) {
event.stopPropagation();
} else {
event.cancelBubble = true;
}
}
};

五、样式兼容IE

5.1、不同浏览器的默认样式存在差异

<link href="https://cdn.bootcss.com/normalize/7.0.0/normalize.min.css" rel="stylesheet">

或者:

* {
margin: 0;
padding: 0;
}

5.2、解决 ie9 以下浏览器对 html5 新增标签不识别的问题

<!--[if lt IE 9]>
<script type="text/javascript" src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<![endif]-->

5.3、解决 ie9 以下浏览器不支持 CSS3 Media Query 的问题

<script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>

5.4、解决 IE 9 10 11 等浏览器不支持 标签的问题

<script src="https://cdn.bootcss.com/picturefill/3.0.3/picturefill.min.js"></script>

5.5、IE6 双倍边距的问题

在ie6 中设置浮动,同时又设置 margin,会出现双倍边距的问题。

display: inline;

5.6、解决 IE6 不支持 fixed 绝对定位以及IE6下被绝对定位的元素在滚动的时候会闪动的问题

/* IE6 hack */
*html, *html body {
background-image: url(about:blank);
background-attachment: fixed;
}
*html #menu {
position: absolute;
top: expression(((e=document.documentElement.scrollTop) ? e : document.body.scrollTop) + 100 + 'px');
}

5.7、解决 IE6 不支持 min-height 属性的问题

min-height: 350px;
height: 350px;

5.8、让 IE7 IE8 支持 CSS3 background-size属性

由于 background-size 是 CSS3 新增的属性,所以 IE 低版本自然就不支持了,但是老外写了一个 htc 文件,名叫 background-size polyfill,使用该文件能够让 IE7、IE8 支持 background-size 属性。其原理是创建一个 img 元素插入到容器中,并重新计算宽度、高度、left、top 等值,模拟 background-size 的效果。

html {
height: 100%;
}
body {
height: 100%;
margin: 0;
padding: 0;
background-image: url('img/37.png');
background-repeat: no-repeat;
background-size: cover;
-ms-behavior: url('css/backgroundsize.min.htc');
behavior: url('css/backgroundsize.min.htc');
}

5.9、IE6-7 line-height 失效的问题

问题:在ie 中 img 与文字放一起时,line-height 不起作用

解决:都设置成 float

5.10、ie6/7/8 鼠标显示小手指

cursor:hand;  /*IE浏览器*/
cursor: pointer;/*其他浏览器*/

六、浏览器 CSS 兼容前缀

-o-transform:rotate(7deg); // Opera
-ms-transform:rotate(7deg); // IE
-moz-transform:rotate(7deg); // Firefox
-webkit-transform:rotate(7deg); // Chrome
transform:rotate(7deg); // 统一标识语句

七、键盘事件 keyCode 兼容性写法

var inp = document.getElementById('inp')
var result = document.getElementById('result') function getKeyCode(e) {
e = e ? e : (window.event ? window.event : "")
return e.keyCode ? e.keyCode : e.which
} inp.onkeypress = function(e) {
result.innerHTML = getKeyCode(e)
}

八、窗口大小的兼容写法

// 浏览器窗口可视区域大小(不包括工具栏和滚动条等边线)
// 1600 * 525
var client_w = document.documentElement.clientWidth || document.body.clientWidth;
var client_h = document.documentElement.clientHeight || document.body.clientHeight; // 网页内容实际宽高(包括工具栏和滚动条等边线)
// 1600 * 8
var scroll_w = document.documentElement.scrollWidth || document.body.scrollWidth;
var scroll_h = document.documentElement.scrollHeight || document.body.scrollHeight; // 网页内容实际宽高 (不包括工具栏和滚动条等边线)
// 1600 * 8
var offset_w = document.documentElement.offsetWidth || document.body.offsetWidth;
var offset_h = document.documentElement.offsetHeight || document.body.offsetHeight; // 滚动的高度
var scroll_Top = document.documentElement.scrollTop||document.body.scrollTop;

IE浏览器兼容问题总结的更多相关文章

  1. CSS3与页面布局学习总结(八)——浏览器兼容与前端性能优化

    一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...

  2. CSS-各种cs样式之浏览器兼容处理方式汇总大全(更新中...)

    页面模板 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 ...

  3. 浅谈CSS hack(浏览器兼容)

    今天简单写一点关于浏览器兼容的处理方法,虽然百度上已经有很多,但是我还是要写! 先看一个图 这个图描述了2016年1月至8月网民们所使用的浏览器市场份额(来源:http://tongji.baidu. ...

  4. jQuery-1.9.1源码分析系列(七) 钩子(hooks)机制及浏览器兼容

    处理浏览器兼容问题实际上不是jQuery的精髓,毕竟让技术员想方设法取弥补浏览器的过错从而使得代码乱七八糟不是个好事.一些特殊情况的处理,完全实在浪费浏览器的性能:突兀的兼容解决使得的代码看起来既不美 ...

  5. 【跟着子迟品 underscore】for ... in 存在的浏览器兼容问题你造吗

    Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...

  6. 浏览器兼容innerText nextElementSibling firstElementChild

    //下面是封装的方法,可以直接使用 //获dom对象的innerText的取值 function getInnerText(element){ //判断浏览器是否支持innerText if(type ...

  7. web前端~~浏览器兼容问题(百度)

    所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况.在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们的系统,都应该是统一的 ...

  8. 关于浏览器兼容问题及hack写法

    浏览器的兼容问题 1.浏览器内核: Mozilla Firefox ( Gecko ) Internet Explorer ( Trident ) Opera ( Presto ) Safari ( ...

  9. 转:【总结】浏览器CSS Hacks汇总,浏览器兼容方式CSS Hacks

    [总结]浏览器CSS Hacks汇总   浏览器兼容可以说是前端开发所要面对的第一个挑战,目前我的电脑上已经安装了6种浏览器(基于IE内核的不算,如Maxthon等). CSS hacks利用浏览器的 ...

  10. js 浏览器兼容的一些方法

    使用js是一件令人很抓狂的事情,很多的浏览器兼容,一大推的代码,谁的脑袋能记住那么多的东西,只有平时多积累,所谓熟能生巧嘛..这里列出一些常用的兼容代码,一点点积累哈~~~     一.以跨浏览器的方 ...

随机推荐

  1. 安装nodejs 版本控制器

    安装下载地址: https://pan.baidu.com/s/1Ed_IPDTOHxR9NShUEau-ZA 下载好后,放在安装nodejs的文件夹下 然后敲cmd,进入安装nodejs的文件夹下. ...

  2. 【java学习笔记2】访问控制修饰符 public、protected、默认、private

    先写了一个User()类: package chapter01; public class User { // 私有的 private int id; // 受保护的 protected int ag ...

  3. Tomcat如何使用线程池处理远程并发请求

    Tomcat如何使用线程池处理远程并发请求 通过了解学习tomcat如何处理并发请求,了解到线程池,锁,队列,unsafe类,下面的主要代码来自 java-jre: sun.misc.Unsafe j ...

  4. Sharding jdbc 强制路由策略(HintShardingStrategy)使用记录

    背景 随着项目运行时间逐渐增加,数据库中的数据也越来越多,虽然加索引,优化查询,但是数据量太大,还是会影响查询效率,也给数据库增加了负载. 再加上冷数据基本不使用的场景,决定采用分表来处理数据,从而来 ...

  5. JavaDailyReports10_13

    今天完成了课堂测试二的内容要求,开阔了编程的思路,学到了很多程序设计思想,为以后的学习提供了很多帮助. 明天开始继续完善四则运算的程序,并且开始JavaWeb的学习!

  6. 原生小程序中实现将scss文件实时编译为wxss文件

    参考链接 全局安装gulp,方便以后直接执行gulp命令 npm install gulp -g 用原生小程序新建一个项目 在小程序根目录(app.js同级目录)中新建package.json文件 n ...

  7. Hadoop之WordCount

    求平均数是MapReduce比较常见的算法,求平均数的算法也比较简单,一种思路是Map端读取数据,在数据输入到Reduce之前先经过shuffle,将map函数输出的key值相同的所有的value值形 ...

  8. 2.1JAVA文件基本结构

    命名 包名 全为英文小写 项目包命名 域名反转.团队名.项目名 相关项目包命名 域名反转.团队名.父项目名.子项目名 类和接口名 所有单词首字母大写 抽象类 用"Abstract" ...

  9. 在onelogin中使用OpenId Connect Implicit Flow

    目录 简介 OpenId Implicit Flow 创建onelogin的配置 页面的运行和请求流程 关键代码 总结 简介 onelogin支持多种OpenId Connect的连接模式,上一篇文章 ...

  10. [Skill]加速npm与yarn还原

    npm源 使用cnpm alias cnpm="npm --registry=https://registry.npm.taobao.org //或者 npm install -g cnpm ...