前端兼容性

306 阅读3分钟

事件兼容性(event 对象)

// 获取event
var e = event || window.event
// 获取target
var target = e.target || e.srcElement
// 阻止浏览器默认行为
e.preventDefault ? e.preventDefault() : (e.returnValue = false)
// 阻止冒泡
e.stopPropagation ? e.stopPropagation() : (e.cancelBubble = true)
// 事件绑定
element.addEventListener ? element.addEventListener(type, fn, false) : element.attachEvent('on'+ type, fn)
// 事件解绑
element.removeEventListener ? element.removeEventListener(type, fn, false) : element.detachEvent('on'+ type, fn)

CSS兼容性

1.浏览器CSS样式初始化(推荐一个库,Normalize.css)

*{ margin: 0; padding: 0;}

html {
    line-height: 1.15; /* Correct the line height in all browsers */
    -webkit-text-size-adjust: 100%; /* Prevent adjustments of font size after orientation changes in iOS. */
}

body { margin: 0;}

2.浏览器私有属性

  • -moz代表firefox浏览器私有属性
  • -ms代表IE浏览器私有属性
  • -webkit代表chrome、safari私有属性
  • -o代表opera私有属性
-webkit-transform:rotate(-3deg); /*为Chrome/Safari*/
-moz-transform:rotate(-3deg); /*为Firefox*/
-ms-transform:rotate(-3deg); /*为IE*/
-o-transform:rotate(-3deg); /*为Opera*/
transform:rotate(-3deg);。

注意:私有属性的顺序,把标准写法放到最后,兼容性写法放到前面,可以通过自动化插件来处理这块

3.CSS hack语法

有时我们需要针对不同的浏览器或不同版本写特定的CSS样式,这种针对不同的浏览器/不同版本写相应的CSS code的过程,叫做CSS hack, hack的写法大致归纳为3种:

  • 条件hack
// 语法
<!--[if <keywords>? IE <version>?]>
    代码块,可以是html,css,js
<![endif]-->
// 示例
<!--[if lt IE 9]>
    <p>你在IE版本小于9中将看不到我的身影</p>
<![endif]-->
  • 属性级hack 在CSS样式属性名前加上一些只有特定浏览器才能识别的hack前缀
// 语法
selector{<hack>?property:value<hack>?;}
// 示例
.test {
  color: #090\9; /* For IE8+ */
  *color: #f00;  /* For IE7 and earlier */
  _color: #ff0;  /* For IE6 and earlier */
}
  • 选择符级hack
    针对一些页面表现不一致或者需要特殊对待的浏览器,在CSS选择器前加上一些只有某些特定浏览器才能识别的前缀进行hack
* html .test { color: #090; }       /* For IE6 and earlier */
* + html .test { color: #ff0; }     /* For IE7 */

4.自动化插件

注意:花大力气解决这些兼容性问题,并不能给我们技术上带来什么大的提升,无非是给各个浏览器厂商填坑罢了,随着时间的流逝,这些技术的价值也会越来越小,so,推荐使用自动化插件!!!自动化插件!!! 自动化插件!!!

  • Autoprefixer是一款自动管理浏览器前缀的插件,它可以解析CSS文件并且添加浏览器前缀到CSS内容里,使用Can I Use(caniuse网站)的数据来决定哪些前缀是需要的。
  • respond.js 解决 ie9 以下浏览器不支持 CSS3 Media Query 的问题

HTML兼容性

html5shiv.js 主要解决HTML5提出的新的元素不被IE6-8识别。
picturefill.js 解决 IE 9 10 11 等浏览器不支持 <picture> 标签的问题

窗口大小兼容性

// 浏览器窗口可视区域大小(不包括工具栏和滚动条等边线)
// 1600 * 525
var client_w = document.documentElement.clientWidth || document.body.clientWidth;
var client_h = document.documentElement.clientHeight || document.body.clientHeight;

// 网页内容实际宽高(包括工具栏和滚动条等边线)
// 1600 * 8
var scroll_w = document.documentElement.scrollWidth || document.body.scrollWidth;
var scroll_h = document.documentElement.scrollHeight || document.body.scrollHeight;

// 网页内容实际宽高 (不包括工具栏和滚动条等边线)
// 1600 * 8
var offset_w = document.documentElement.offsetWidth || document.body.offsetWidth;
var offset_h = document.documentElement.offsetHeight || document.body.offsetHeight;

// 滚动的高度
var scroll_Top = document.documentElement.scrollTop||document.body.scrollTop;