浏览器兼容问题总结

一、浏览器兼容性

      浏览器的兼容性问题,往往是个别浏览器(没错,就是那个与众不同的浏览器)对于一些标准的定义不一致导致的。俗话说:没有IE就没有伤害。

二、进行浏览器兼容性之前分析

      1.根据用户群体使用的浏览器版本,是采用优雅降级,还是渐进增强。

      优雅降级:一开始就构建站点的完整功能,然后针对浏览器测试和修复。比如一开始使用 CSS3 的特性构建了一个应用,然后逐步针对各大浏览器进行 hack 使其可以在低版本浏览器上正常浏览。

      渐进增强:一开始就针对低版本浏览器进行构建页面,完成基本的功能,然后再针对高级浏览器进行效果、交互、追加功能达到更好的体验。

       2.分析市场上主要浏览器的市场份额,决定是否有必要进行兼容

         可访问浏览器市场份额网站:statcounter,查看当前浏览器对特定CSS3和HTML5特性的支持成都:caniuse

三、浏览器兼容处理

       浏览器的兼容性主要是样式兼容性(css),交互兼容性(javascript),浏览器 hack 三个方面。

       1.样式兼容性(css)方面          

  • 不同的浏览器样式存在差异,可以通过 Normalize.css 抹平差异,也可以定制自己的 reset.css,重置浏览器的默认样式
  • 在还原设计稿的时候我们常常会需要用到透明属性,所以解决 IE9 以下浏览器不能使用 opacit。
    opacity: 0.5;
     filter: alpha(opacity = 50); //IE6-IE8我们习惯使用filter滤镜属性来进行实现
  • 浏览器厂商提供了针对浏览器的前缀,部分的属性需要加上浏览器前缀

    内核 主要代表浏览器 前缀
    Trident IE浏览器 -ms
    Gecko Firefox -moz
    Presto Opera -o
    Webkit Chrome和Safari -webkit





  • Modernizr.js既能给老版本浏览器打补丁,又能保证新浏览器渐进增强的用户体验。它是帮助我们提高开发实践的,使用一个非常时髦的方法来帮助探测浏览器是否支持某种新特性,甚至可以加载额外的script脚本。

       2.交互兼容性(javascript)

  • 事件兼容的问题
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;
        }
    }
};

 

 

      3.浏览器 hack

  • IE 条件注释

IE 的条件注释仅仅针对IE浏览器,对其他浏览器无效

操作符 含义
lt 小于
gt 大于
lte 小于等于
gte 大于等于
! 不等于







html5shiv.js:解决 ie9 以下浏览器对 html5 新增标签不识别的问题。
respond.js:解决 ie9 以下浏览器不支持 CSS3 Media Query 的问题
picturefill.js:解决 ie9 以下浏览器不支持 CSS3 Media Query 的问题

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

 

  • IE 属性过滤器(较为常用的hack方法)
字符 例子 说明
_ _color:red; 只有IE6可以识别
* *color:red; IE6/7可以识别
\9 color:red\9; IE8及以下可以识别




 

参考文章:1.如何机智地回答浏览器兼容性问题

                  2. 浏览器兼容性问题解决方案 · 总结

                  3.JS进阶篇--前端的瑞士军刀Modernizr.js

 

 

 

posted @ 2019-01-27 09:21  天黑听雨  阅读(542)  评论(0)    收藏  举报