浏览器兼容问题总结
一、浏览器兼容性
浏览器的兼容性问题,往往是个别浏览器(没错,就是那个与众不同的浏览器)对于一些标准的定义不一致导致的。俗话说:没有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.如何机智地回答浏览器兼容性问题

浙公网安备 33010602011771号