浏览器引擎前缀(Vendor Prefixes)简介

2,533 阅读5分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

浏览器引擎前缀

前言

之前笔试的时候有做到一题选择对应浏览器前缀的问题。虽然开发的时候有用到过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属性,经常会添加这样的带前缀的属性来做兼容性处理。 这个就是浏览器引擎前缀的一种。

MDN上关于浏览器引擎前缀的解释

浏览器厂商们有时会给实验性的或者非标准的 CSS 属性和 JavaScript API 添加前缀,这样开发者就可以用这些新的特性进行试验,同时(理论上)防止他们的试验代码被依赖,从而在标准化过程中破坏 web 开发者的代码。开发者应该等到浏览器行为标准化之后再使用未加前缀的属性。

浏览器厂商们正在努力停止使用前缀来表示实验性质的代码的行为。Web开发者一直在生产环境的网站上使用这些实验性代码,这使得浏览器厂商更难保证浏览器兼容性和处理新特性;这也伤害了更小众的浏览器,它们被迫添加其他浏览器前缀以加载热门网站。

现在的趋势是将实验性功能添加在需要用户自行设置偏好或标记(flag)的地方,同时编写一个更小规模的规范,以更快达到稳定状态。

二、为什么需要浏览器引擎前缀(Vendor Prefix)?

Vendor prefix—浏览器引擎前缀,是一些放在CSS属性前的小字符串,用来确保这种属性只在特定的浏览器渲染引擎下才能识别和生效。一种浏览器引擎里一般不实现其它引擎前缀标识的CSS属性,但由于以WebKit为引擎的移动浏览器相当流行,火狐等浏览器在其移动版里也实现了部分WebKit引擎前缀的CSS属性。

三、浏览器引擎前缀分类

  1. 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; 

特别注意:把不带前缀的版本放到最后一行:

  1. API 前缀
var requestAnimationFrame = window.requestAnimationFrame ||
                            window.mozRequestAnimationFrame ||
                            window.webkitRequestAnimationFrame ||
                            window.oRequestAnimationFrame ||
                            window.msRequestAnimationFrame;

四、浏览器引擎对应关系

CSS 前缀

浏览器引擎CSS 前缀浏览器
-webkit-谷歌,Safari,新版Opera浏览器,以及几乎所有iOS系统中的浏览器(包括 iOS 系统中的火狐浏览器);基本上所有基于WebKit 内核的浏览器
-moz-火狐浏览器
-o-旧版Opera浏览器
-ms-IE浏览器 和 Edge浏览器



API 前缀

  1. 接口前缀 | 接口前缀 | 浏览器 | | --- | --- | | WebKit | 谷歌,Safari,新版Opera浏览器,以及几乎所有iOS系统中的浏览器(包括 iOS 系统中的火狐浏览器);基本上所有基于WebKit 内核的浏览器 | | Moz | 火狐浏览器 | | O | 旧版Opera浏览器 | | MS | IE浏览器 和 Edge浏览器 |



  1. 属性和方法前缀 | 属性和方法前缀 | 浏览器 | | --- | --- | | webkit | 谷歌,Safari,新版Opera浏览器,以及几乎所有iOS系统中的浏览器(包括 iOS 系统中的火狐浏览器);基本上所有基于WebKit 内核的浏览器 | | moz | 火狐浏览器 | | o | 旧版Opera浏览器 | | ms | IE浏览器 和 Edge浏览器 |



可以发现:
前缀和浏览器的对应关系都是一样的。只是不同类型的前缀写法不一样。
需要使用 -x- 的前缀修饰CSS类名
需要使用大写的前缀修饰接口名
需要使用小写的前缀修饰属性或者方法

五、需要使用浏览器引擎前缀的CSS3属性

  1. @keyframes
  2. 移动和变换属性(transition-property, transition-duration, transition-timing-function, transition-delay)
  3. 动画属性 (animation-name, animation-duration, animation-timing-function, animation-delay)
  4. border-radius
  5. box-shadow
  6. backface-visibility
  7. column属性
  8. flex属性
  9. grid属性
  10. perspective属性
  11. ...(更多的)

完整的列表不只这些,而且还会增加。

这些属性不是一定的,随着属性的稳定性或者成熟度提高,也可能可以不用添加浏览器引擎前缀(比如 border-radius

六、浏览器-内核-前缀 速记

浏览器内核前缀
ChromeWebKit内核-webkit-
SafariWebKit内核-webkit-
FirefoxGecko内核-moz-
IETrident内核-ms-
旧版OperaPresto内核-o-
新版OperaWebkit内核,Blink内核-webkit-

网络上关于Opera的内核有比较多中说法,这个建议大家查证。




技术持续成长中,若文章中有错误欢迎交流指正!

参考文章:

浏览器引擎前缀
Vendor Prefix:为什么需要浏览器引擎前缀
各个浏览器内核和前缀