常见的兼容性问题
浏览器有着大量不同的版本,不同种类的浏览器的内核也不尽相同,所以不同浏览器对代码的解析会存在差异,这就导致对页面渲染效果不统一的问题。
#
初始化样式因浏览器兼容的问题,不同的浏览器对标签的默认样式值不同,如果不初始化会造成不同浏览器之间的显示差异,布局出现错乱,所以要初始化样式,达到统一的布局。
最粗暴的方案就是使用*
初始化样式,但是其会对于所有的标签加载样式以及计算样式优先级,可能会对性能有所影响。
通常使用Normalize.css
抹平默认样式差异,当然也可以根据样式定制自己的reset.css
。
#
内核样式兼容在CSS3
标准还未确定时,部分浏览器已经根据最初草案实现了部分功能,为了与之后确定下来的标准进行兼容,所以每种浏览器使用了自己的私有前缀与标准进行区分,当标准确立后,各大浏览器将逐步支持不带前缀的CSS3
新属性,目前已有很多私有前缀可以不写了,但为了兼容老版本的浏览器,可以仍沿用私有前缀和标准方法,逐渐过渡。
内核 | 代表浏览器 | 前缀 |
---|---|---|
Trident | IE浏览器 | -ms |
Gecko | Firefox | -moz |
Presto | Opera | -o |
Webkit | Chrome、Safari | -webkit |
#
透明属性用来设定元素透明度的opacity
是CSS 3
里的一个属性,现代浏览器都已经支持,对于老版本浏览器可以通过加入私有前缀来支持,对于IE6-IE8
可以通过filter
属性来支持,IE4-IE9
都可以通过滤镜写法提供兼容支持。
#
媒体查询对于IE9
以下浏览器不支持CSS3
媒体查询的问题,通常使用respond.js
来作为兼容性解决方案。
#
HTML5标签对于IE9
以下浏览器不支持HTML5
新标签的问题,可以使用document.createElement
创建元素并设置其CSS
样式即可,通常使用html5shiv.js
来作为兼容性解决方案。
#
placeholder兼容性placeholder
是html5
新增的一个属性,当input
或者textarea
设置了该属性后,该值的内容将作为灰字提示显示在文本框中,当文本框获得焦点或输入内容时,提示文字消失。对于其兼容性首先需要判断input
是否支持placeholder
,然后在不支持的情况下可以通过input
的onfocus
与onblur
事件监听来实现placeholder
效果。
#
事件监听句柄在IE9
之前,必须使用attachEvent
而不是使用标准方法addEventListener
来注册元素的监听器,事件兼容的问题,通常需要会封装一个适配器的方法,过滤事件句柄绑定、移除。
#
阻止默认行为W3C
推荐的阻止默认行为的方式是event.preventDefault()
,此方法只会阻止默认行为而不会阻止事件的传播。IE9
之前的浏览器阻止默认行为需要使用window.event.returnValue = false
。直接在事件处理函数中return false
也能阻止默认行为,只在DOM0
级模型中有效。此外,在jQuery
中使用return false
会同时阻止默认行为与事件传播,通常也会封装一个方法来实现默认行为的阻止。
#
阻止事件冒泡W3C
推荐的阻止冒泡的方法是event.stopPropagation()
,IE9
之前则是使用window.event.cancelBubble = true;
,通常也会封装一个方法来实现阻止事件冒泡。
#
滚动高度获取窗口的滚动高度scrollTop
需要采用兼容性写法,即使声明<DOCTYPE>
浏览器对于文档的处理也会有所不同。
#
日期时间使用new Date()
构造函数生成日期时间对象,对于new Date("2020-06-29")
语法在一些早期的浏览器会输出invalid date
,这主要是因为早期浏览器不支持表达日期的-
,而/
才是被广泛支持的,所以在处理早期浏览器的兼容性时需要将-
替换为/
。
#
IE条件注释IE
专门提供的一种语法,只有IE能识别运行,其他浏览器只会作为注解。