浏览器兼容性总结

作为一个前端,工作过程中总免不了会遇到一些浏览器兼容性的问题, 编码过程中对于兼容性有一定的预见性会大大提高编码效率,因此对于各大浏览器的兼容性总结还是很有必要的。

内核

平时人们上网用的浏览器五花八门,这些浏览器的内核是不尽相同的,浏览器的内核决定了浏览器对于网页的语法解释,因此不同的内核将导致不同的渲染效果,也就产生了浏览器的兼容性问题。目前的浏览器内核主要有以下几种:

  • Trident ([‘traɪd(ə)nt])
    Trident内核又被称为IE内核,常见的浏览器有IE6-IE10,360浏览器(1.0-5.0是Trident,6.0是Trident+Webkit,7.0是Trident+Blink),猎豹浏览器(1.0-4.2版本是Trident+Webkit,4.3及以后版本为Trident+Blink);傲游浏览器(傲游1.x、2.x为IE内核,3.x为Webkit双内核);百度浏览器的早期版本,世界之窗浏览器( 最初为IE内核,2013年采用chorme+IE内核);腾讯TT,搜狗高速浏览器(1.x是Trident,2.0以后是Trident+Webkit),UC浏览器(Blink内核+Trident内核);
  • Gecko([‘gekəʊ])
    Gecko又称为Firefox内核,最开始由Netscape6开始采用,后来火狐浏览器采用,其特点是代码公开,因此全世界程序员都可以对其进行代码编写。
  • Presto([‘prestəʊ])
    Presto浏览器是Opera的前内核,现在已经停止使用,Opera现在已经改用Blink内核。
  • Webkit内核
    webkit内核是苹果公司自己开发的,safari浏览器使用。常见浏览器傲游浏览器3,Android默认浏览器
  • Blink/Chormium
    由谷歌发布,Blink是Webkit的分支,在Webkit的基础上研发更加快速和渲染引擎更加简约,并逐步脱离Webkit影响。

浏览器的兼容性通常可以分为css样式渲染的兼容性和api差异:

常见的css兼容性问题(不考虑IE6)

  • 浏览器对于样式的初始化不同
    我们可以采用 *{margin:0;padding:0;}这种方式来清除浏览器初始的默认边距,这种方式写起来简单,但是通配符就需要把所有的标签遍历一遍,当网站较大时,样式比较多,这样写会大大加大网站运行的负载,会使网站加载时间过长。
    所以我们应该把reset的元素单独列出来,具体初始化某个标签,或者也可以使用Normalize.css和reset.css,这两个浏览器默认样式重置库。
  • 透明度
    IE: filter: alpha(opacity=60)
    非IE: opacity:0.6
  • IE7-IE9在设置了margin:0 auto;后不能使div居中显示
  • Firefox点击链接出现虚线框
    。。。未完待续

常见的api兼容

  • 浏览器宽高问题
var winW = document.body.clientWidth || document.documentElement.clientWidth; // 获取网页可见区域的宽度
var winH = document.body.clientHeight || document.documentElement.clientHeight; // 获取网页可见区域高度
// 以上都不包含边框的宽高,滚动条高度,offsetWidth和offsetHeight包含边框和滚动条高度
var winW = document.body.scrollWidth || document.documentElement.scrollWidth;
var winW = document.body.scrollHeight || document.documentElement.scrollHeight;
// 获取整个网页的宽高,包括滚动隐藏掉的距离
var winW = document.body.scrollTop || document.documentElement.crollTop;
var winW = document.body.scrollLeft || document.documentElement.scrollLeft;
// 浏览器被卷去的距离
var  screenH = window.screen.height; //   屏幕分辨率的高
var screenW = window.screen.width; // 屏幕分辨率的宽
var screenX = window.screenLeft; // 浏览器窗口相对于屏幕的x坐标(除FireFox)
var screenXX = window.screenX; // FireFox相对于屏幕的x坐标
var screenY= window.screenTop; // 浏览器窗口相对于屏幕的y坐标(除FireFox)
var screenYY = window.screenY; // FireFox相对于屏幕的y坐标
  • 事件相关
  // 设置监听事件
function addEvent(obj,type,fn) { // 添加事件监听,三个参数分别为对象,事件类型,事件处理函数
  if(obj.addEventListener){
      obj.addEventListener(type,fn,false); // 非IE
  }else{
      obj.attachEvent('on'+type,fn);
  }
  
}

// 取消事件监听
function removeEvent(obj,type,fn){
    if(obj.removeEventListener){
        obj.removeEventListener(type,fn,false);
    }else {
        obj.detachEvent('on'+type,fn);
    }
}

// event
document.onclick = function (ev){
  var e = ev; //  谷歌火狐支持,IE9以上支持,以下不支持
}
document.onclick = function(){
  var e = window.event; // 谷歌和IE支持,火狐不支持 
}
// 兼容写法
document.onclick = function(ev) {
  var e = ev || window.event;
}

// 阻止事件冒泡
document.onclick = function(e) {
  var e = e || window.event;
   if(e.stopPropagation){
      e.stopPropagation();
  }else{
      e.cancelBubble = true;
  }
}

// 阻止默认事件
  document.onclick = function(e){
      var e = e || window.event;
       if(e.preventDefault){
          e.preventDefault();
      }else {
          e.returnValue = 'false';
      }
  }
  • DOM节点操作
  • 获取类名
  • 获取非行间样式
  • 页面加载 DOMContentLoaded

参考文章:
主流浏览器内核介绍(前端开发值得了解的浏览器内核历史)
浏览器兼容性问题及解决方案(CSS部分)
浏览器兼容性问题及解决方案(JS部分)

你可能感兴趣的:(浏览器兼容性总结)