目录
一、什么是浏览器兼容问题
二、JavaScript兼容问题及解决方案
2.1addEventListener与attachEvent的区别
2.2集合类对象问题
2.3自定义属性问题
2.4event.x与event.y问题
2.5window.location.href问题
2.6事件委托方法
三、CSS兼容问题及解决方案
3.1浏览器CSS样式初始化
3.2浏览器私有属性
3.3使用Autoprefixer工具
一、什么是浏览器兼容问题
浏览器兼容问题指:“不同浏览器(IE、Chrome、FireFox、Safari、Edge)对同一种CSS样式或同一段JS代码的解析和渲染会有所不同”,从而用户在不同浏览器环境下的访问呈现的页面效果不一致。
浏览器兼容问题分为:“CSS兼容问题”、“JavaScript兼容问题”
造成浏览器兼容问题的根本原因是:“不同浏览器使用的内核不同”,不过随着时代的发展Webkit内核逐渐统一市场,浏览器兼容问题也越来越少。
常见浏览器内核:
浏览器 | 内核 |
---|---|
IE | Trident |
Chrome | Blink |
Firefox | Gecko |
Safari | Webkit |
Edge | Blink |
Blink内核是Webkit内核的一个分支,属于同一个源代码开发
而在手机浏览器中,几乎全是Webkit内核开发
二、JavaScript兼容问题及解决方案
2.1addEventListener与attachEvent的区别
attachEvent—————————兼容IE7、IE9
addEventListener———————兼容Firefox、chrome、IE、safari,不兼容IE7、IE8
解决方法:
function addEvent(el,eventName,callback){
if (elment.addEventListener){
//现代浏览器使用addEventListener
el.addEventListener(eventName,callback,false);
}
else if (el.attachEvent){
//旧浏览器使用attachEvent
el.attachEvent('on' + eventName,callback);
}
else{
//最后使用内联事件属性
element['on' + eventName] = callback;
}
}
//使用示例
const button = document.getElementById('myButton');
addEvent(button,'click',funcion(){
console.log('按钮被点击了');
})
2.2集合类对象问题
IE下,可以使用()或[]获取集合类对象
FireFox下,只能使用[]获取集合对象
解决方法:
统一使用[]获取集合类对象
2.3自定义属性问题
IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用gettAttribute()获取自定义属性
firefox下,只能使用getAttribute()获取自定义属性
解决方法:
统一使用getAttribute()获取属性
2.4event.x与event.y问题
IE下,event对象有x,y属性,没有pageX、pageY属性
Firefox下,event对象有pageX、pageY属性,没有x,y属性
解决方法:
var myDirectionX = event.x ? event.x : event.pageX;
var myDirectionY = event.y ? event.y : event.pageY;
2.5window.location.href问题
IE可以使用window.location或window.location.href
Firefox1.5下,只能使用window.location
解决方法:
统一使用window.location
2.6事件委托方法
function f(){...}
在IE下,使用document.body.onload = f;
在Firefox下,使用document.body.onload = f();
解决方法:
统一使用document.body.onload = function() {}
三、CSS兼容问题及解决方案
3.1浏览器CSS样式初始化
* {
margin:0;
padding:0;
/* 根据需要添加 */
box-size:border-box;
}
3.2浏览器私有属性
- -moz表示firefox浏览器私有属性
- -ms表示IE浏览器私有属性
- -webkit-表示chrome、safari、edge私有属性
- -o表示opera私有属性
对于私有属性的顺序,要把标准写法放到最后,兼容性写法放到前面:
-webkit-transform:rotate(-3deg); /*为Chrome/Safari*/
-moz-transform:rotate(-3deg); /*为Firefox*/
-ms-transform:rotate(-3deg); /*为IE*/
-o-transform:rotate(-3deg); /*为Opera*/
transform:rotate(-3deg);
3.3使用Autoprefixer工具
使用该工具可以根据原CSS文件一键生成新CSS文件,新CSS文件会在原CSS文件属性基础上自动添加浏览器前缀。
具体可参考:
进阶插件和技巧:使用Autoprefixer自动管理浏览器前缀-CSDN博客