浏览器引擎前缀
浏览器厂商有时会给实验性的或者非标准的 CSS 属性和 JavaScript API 添加前缀,这样开发者就可以用这些新的特性进行试验,同时(理论上)防止他们的试验代码被依赖,从而在标准化过程中破坏 Web 开发者的代码。开发者应该等到浏览器行为标准化之后再使用未加前缀的属性。
Web 开发者一直在生产环境的网站上使用这些实验性代码,这使得浏览器厂商更难保证浏览器兼容性和处理新特性;这也伤害了更小众的浏览器,它们被迫添加其他浏览器前缀以渲染热门网站。
现在,浏览器引擎的实验性特性被“放在一个标志(flag)后面”。这使得开发者可以更改浏览器配置来测试即将到来的特性。浏览器现在通过用户控制的标志(flag)或首选项添加实验性特性。标志会被用于较小的规范,以更快达到稳定状态。
CSS 前缀
你在旧代码中可能会看到的最常见的浏览器 CSS 前缀包括:
-webkit-
(Chrome、Safari、新版 Opera 浏览器以及几乎所有 iOS 系统中的浏览器(包括 iOS 系统中的火狐浏览器);简单的说,所有基于 WebKit 内核的浏览器)-moz-
(火狐浏览器)-o-
(旧版、WebKit 之前的 Opera 浏览器)-ms-
(IE 浏览器和 Chromium 之前的 Edge 浏览器)
示例:
css
-webkit-transition: all 4s ease;
-moz-transition: all 4s ease;
-ms-transition: all 4s ease;
-o-transition: all 4s ease;
transition: all 4s ease;
如果你在代码库中遇到上面的代码,你可以安全地删除除最后一行之外的所有内容。所有浏览器都已支持不带浏览器引擎前缀的过渡:
css
transition: all 4s ease;
API 前缀
过去,浏览器引擎也使用前缀修饰实验性质的 API。如果整个接口都是实验性的,前缀修饰的就是接口名(但不包括其中的属性或者方法)。如果将一个实验性的接口或者方法添加到一个标准化的接口中,这个新增的接口或者方法被前缀修饰。
接口前缀
需要使用大写的前缀修饰接口名:
WebKit
(Chrome、Safari、新版 Opera 浏览器以及几乎所有 iOS 系统中的浏览器(包括 iOS 系统中的火狐浏览器);简单的说,所有基于 WebKit 内核的浏览器)Moz
(火狐浏览器)O
(旧版、WebKit 之前的 Opera 浏览器)MS
(IE 浏览器和 Chromium 之前的 Edge 浏览器)
属性和方法前缀
需要使用小写的前缀修饰属性或者方法
webkit
(Chrome、Safari、新版 Opera 浏览器以及几乎所有 iOS 系统中的浏览器(包括 iOS 系统中的火狐浏览器);简单的说,所有基于 WebKit 内核的浏览器)moz
(火狐浏览器)o
(旧版、WebKit 之前的 Opera 浏览器)ms
(IE 浏览器和 Chromium 之前的 Edge 浏览器)
示例:
js
window.requestAnimationFrame =
window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame;