常见的兼容性问题

常见兼容性问题

浏览器有着大量不同的版本,不同种类的浏览器的内核也不尽相同,所以不同浏览器对代码的解析会存在差异,这就导致对页面渲染效果不统一的问题

初始化样式

因浏览器兼容的问题,不同的浏览器对标签的默认样式值不同,如果不初始化会造成不同浏览器之间的显示差异,布局出现错乱,所以要初始化样式,达到统一的布局。
最粗暴的方案就是使用*初始化样式,但是其会对于所有的标签加载样式以及计算样式优先级,可能会对性能有所影响。

* { margin: 0; padding: 0; }

通常使用Normalize.css抹平默认样式差异,当然也可以根据样式定制自己的reset.css。

<link href="http://cdn.bootcss.com/normalize/7.0.0/normalize.min.css"> 内核样式兼容

在CSS3标准还未确定时,部分浏览器已经根据最初草案实现了部分功能,为了与之后确定下来的标准进行兼容,所以每种浏览器使用了自己的私有前缀与标准进行区分,当标准确立后,各大浏览器将逐步支持不带前缀的CSS3新属性,目前已有很多私有前缀可以不写了,但为了兼容老版本的浏览器,可以仍沿用私有前缀和标准方法,逐渐过渡。

内核 代表浏览器 前缀
Trident   IE浏览器   -ms  
Gecko   Firefox   -moz  
Presto   Opera   -o  
Webkit   Chrome、Safari   -webkit  
透明属性

用来设定元素透明度的opacity是CSS 3里的一个属性,现代浏览器都已经支持,对于老版本浏览器可以通过加入私有前缀来支持,对于IE6-IE8可以通过filter属性来支持,IE4-IE9都可以通过滤镜写法提供兼容支持。

opacity: 0.5; -moz-opacity:0.5; filter: alpha(opacity = 50); //IE6-IE8 filter: progid:DXImageTransform.Microsoft.Alpha(style = 0, opacity = 50); //IE4-IE9 媒体查询

对于IE9以下浏览器不支持CSS3媒体查询的问题,通常使用respond.js来作为兼容性解决方案。

<script type="text/javascript" src="http://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script> HTML5标签

对于IE9以下浏览器不支持HTML5新标签的问题,可以使用document.createElement创建元素并设置其CSS样式即可,通常使用html5shiv.js来作为兼容性解决方案。

<script> document.createElement('header'); </script> <style> header{display: block;} </style> <script type="text/javascript" src="http://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script> placeholder兼容性

placeholder是html5新增的一个属性,当input或者textarea设置了该属性后,该值的内容将作为灰字提示显示在文本框中,当文本框获得焦点或输入内容时,提示文字消失。对于其兼容性首先需要判断input是否支持placeholder,然后在不支持的情况下可以通过input的onfocus与onblur事件监听来实现placeholder效果。

<!-- 简单示例 --> <input type="text" value="Tips" onFocus="this.value = '';" onBlur="if (this.value == '') {this.value = 'Tips';}"> 事件监听句柄

在IE9之前,必须使用attachEvent而不是使用标准方法addEventListener来注册元素的监听器,事件兼容的问题,通常需要会封装一个适配器的方法,过滤事件句柄绑定、移除。

var handler = {} //绑定事件 handler.on = function(target, type, handler) { if(target.addEventListener) { target.addEventListener(type, handler, false); } else { target.attachEvent("on" + type, function(event) { return handler.call(target, event); }, false); } }; //取消事件监听 handler.remove = function(target, type, handler) { if(target.removeEventListener) { target.removeEventListener(type, handler); } else { target.detachEvent("on" + type, function(event) { return handler.call(target, event); }, true); } }; 阻止默认行为

W3C推荐的阻止默认行为的方式是event.preventDefault(),此方法只会阻止默认行为而不会阻止事件的传播。IE9之前的浏览器阻止默认行为需要使用window.event.returnValue = false。直接在事件处理函数中return false也能阻止默认行为,只在DOM0级模型中有效。此外,在jQuery中使用return false会同时阻止默认行为与事件传播,通常也会封装一个方法来实现默认行为的阻止。

handler.preventDefault = function(event) { event = event || window.event; if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } } 阻止事件冒泡

W3C推荐的阻止冒泡的方法是event.stopPropagation(),IE9之前则是使用window.event.cancelBubble = true;,通常也会封装一个方法来实现阻止事件冒泡。

handler.stopPropagation = function(event) { event = event || window.event; if (event.stopPropagation) { event.stopPropagation(); } else { event.cancelBubble = false; } } 滚动高度

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgsyj.html