Autoprefixer,通过Can I Use数据库来确定哪些浏览器前缀是需要的,然后解析CSS文件,将前缀添加到CSS规则里。

你所要做的就是添加你的资源构建工具(比如:Grunt),然后你就可以忘记CSS前缀了,按照最新的W3C标准尽情书写无前缀的CSS,像这样:

  1. a {
  2. transition: transform 1s
  3. }

Autoprefixer使用一个浏览器流行度和属性支持度的数据库来给你的CSS添加前缀。

  1. a {
  2. -webkit-transition: -webkit-transform 1s;
  3. transition: -ms-transform 1s;
  4. transition: transform 1s
  5. }

问题

当然,我们可以手动编写带有浏览器前缀的CSS,但是冗长并且容易出错。

我们可以使用像Prefixr的服务和文本编辑器插件,但是处理大量重复的代码依然让人心累。

我们可以使用Sass的Compass或者Stylus的nib这些预处理器提供的mixin库,他们确实解决了许多问题,但也带来了许多问题:他让我们必须使用一种新的语法;他们的更迭速度慢于现代的浏览器。所以我们使用的稳定的发行版本可能带有许多不需要的前缀,并且有时候还需要自己编写mixin库。

同时,Compass并没有为你隐藏前缀,因为你依然要解决许多问题,比如:我需要为border-radius写一个mixin库吗?我需要用逗号分隔+transition的参数吗?

Lea Verou的-prefix-free几乎解决了这个问题,但是当你把最终的用户性能考虑进去的话,使用浏览器器端的库并不是一种好的方式。为了防止一遍遍的重复这样的事情,最好的方式就是在资源构建或者项目部署的一次性构建。

揭秘

Autoprefixer是一个CSS后处理器,而不是像Sass和Stylus一样的预处理器。他没有使用新的语法,并且由于他在CSS编译后执行的,所以可以和Sass和Stylus很好的集成。

Autoprefixer基于Rework,一个用于写你自己的CSS后处理器的框架,Rework将CSS解析为有用的JavaScript结构,然后在经过你的处理后再给你输出CSS。

每一版本的Autoprefixer都包含一份最新的Can I Use数据。

  • 浏览器以及流行度的清单
  • CSS新属性、值和选择器必要的前缀清单

Autoprefixer默认支持两个最新的主要浏览器,这点类似Google,但是你可以选择你的项目所支持的浏览器,通过名称(像 “ff 21”)或者以下规则:

  • 主流浏览器的最近两个版本使用 “last 2 versions”
  • 全球统计超过1%的使用率使用 “> 1%”
  • 只是最新版本使用 “ff>20” 或者 “ff>=20”

然后Autoprefixer计算出哪些前缀是必须的,哪些是过时的。

当Autoprefixer给CSS添加了前缀后,他不会忘记修正语法的差异,通过这样的方式,你的CSS符合最新的W3C标准:

  1. a {
  2. background: linear-gradient(to top, black, white);
  3. display: flex
  4. }
  5. ::placeholder {
  6. color: #ccc
  7. }

编译后:

  1. a {
  2. background: -webkit-linear-gradient(bottom, black, white);
  3. background: linear-gradient(to top, black, white);
  4. display: -webkit-box;
  5. display: -webkit-flex;
  6. display: -moz-box;
  7. display: -ms-flexbox;
  8. display: flex
  9. }
  10. :-ms-input-placeholder {
  11. color: #ccc
  12. }
  13. ::-moz-placeholder {
  14. color: #ccc
  15. }
  16. ::-webkit-input-placeholder {
  17. color: #ccc
  18. }
  19. ::placeholder {
  20. color: #ccc
  21. }

同时,Autoprefixer也会情理过时的前缀(从遗留代码或者像Bootstrap库),比如:

  1. a {
  2. -webkit-border-radius: 5px;
  3. border-radius: 5px
  4. }

编译为:

  1. a {
  2. border-radius: 5px
  3. }

所以,Autoprefixer处理后,CSS只会包含实际存在的浏览器前缀,Fotorama从Compass切换为Autoprefixe之后,CSS文件大小减小了将近20%。

Demo

如果你还没有使用过任何自动化的资源构建工具,强烈推荐Grunt。他给你打开一片心的世界,美妙的语法糖、高效的mixin库以及实用的图像处理工具。让开发者效率大大提高,节省了大量时间和精力(自由选择语言、代码复用、使用第三方库能力),这些现在都唾手可得。

下面让我们创建一个项目目录并且创建一个名为style.css的CSS文件。

  1. a { }

在这个例子里,我们使用Grunt,首先我们需要使用npm安装grunt-autoprefixer

  1. npm install grunt-cli grunt-contrib-watch grunt-autoprefixer

然后我们需要创建Gruntfile.js并且开启Autoprefixer。

  1. module.exports = function (grunt) {
  2. grunt.initConfig({
  3. autoprefixer: {
  4. dist: {
  5. files: {
  6. 'build/style.css': 'style.css'
  7. }
  8. }
  9. },
  10. watch: {
  11. styles: {
  12. files: ['style.css'],
  13. tasks: ['autoprefixer']
  14. }
  15. }
  16. });
  17. grunt.loadNpmTasks('grunt-autoprefixer');
  18. grunt.loadNpmTasks('grunt-contrib-watch');
  19. };

这个配置文件,使用Autoprefixer将style.css编译到build/style.css,同时我们使用grunt-contrib-watch监控style.css文件的改变来重新编译。

让我们开启Grunt的Watch操作

  1. ./node_modules/.bin/grunt watch

现在,我们加入CSS3的语法,保存。

  1. a {
  2. width: calc(50% - 2em)
  3. }

见证奇迹的时刻到了。我们得到build/style.css,Grunt检测到style.css的变化然后启动Autoprefixer任务,Autoprefixer发现了calc()值,需要带上Safari6的浏览器前缀。

  1. a {
  2. width: -webkit-calc(50% - 2em);
  3. width: calc(50% - 2em)
  4. }

现在我们向style.css添加一些更加复杂的CSS3语法。

  1. a {
  2. width: calc(50% - 2em);
  3. transition: transform 1s
  4. }

Autoprefixer已经知道Chrome,Safari6和Opera 15 需要为transitiontransform添加浏览器前缀,但IE 9需要为transform添加前缀,作为transition的值。

  1. a {
  2. width: -webkit-calc(1% + 1em);
  3. width: calc(1% + 1em);
  4. -webkit-transition: -webkit-transform 1s;
  5. transition: -ms-transform 1s;
  6. transition: transform 1s
  7. }

Autoprefixer为你解决那些脏累的活,他会检查Can I Use数据库,添加所需要的浏览器前缀,并且他懂得规范之间的区别。欢迎来到CSS3的未来——再也没有前缀!

接下来呢?

  1. Autoprefixer支持Ruby on Rails,MiddlemanMincer,Grunt,Sublime Text。从这份文档中学习如何在你的环境中使用Autoprefixer。

  2. 如果你的环境不支持Autoprefixer,提交给我我会尝试提供帮助。

  3. 关注@autoprefixer,获取最新特性和更新信息。

[译]Autoprefixer:用最可行的方式处理浏览器前缀的CSS后处理器的更多相关文章

  1. 转:[译]Autoprefixer:一个以最好的方式处理浏览器前缀的后处理程序

    原文来自于:http://www.cnblogs.com/aNd1coder/archive/2013/08/12/3252690.html Autoprefixer解析CSS文件并且添加浏览器前缀到 ...

  2. [译]Autoprefixer:一个以最好的方式处理浏览器前缀的后处理程序

    Autoprefixer解析CSS文件并且添加浏览器前缀到CSS规则里,使用Can I Use的数据来决定哪些前缀是需要的.   所有你需要做的就是把它添加到你的资源构建工具(例如 Grunt)并且可 ...

  3. 浏览器前缀-----[译]Autoprefixer:一个以最好的方式处理浏览器前缀的后处理程序

    Autoprefixer解析CSS文件并且添加浏览器前缀到CSS规则里,使用Can I Use的数据来决定哪些前缀是需要的.   所有你需要做的就是把它添加到你的资源构建工具(例如 Grunt)并且可 ...

  4. Autoprefixer:一个以最好的方式处理浏览器前缀的后处理程序

    Autoprefixer解析CSS文件并且添加浏览器前缀到CSS规则里,使用Can I Use的数据来决定哪些前缀是需要的.   所有你需要做的就是把它添加到你的资源构建工具(例如 Grunt)并且可 ...

  5. Autoprefixer:一个以最好的方式处理浏览器前缀的后处理程序

    Autoprefixer解析CSS文件并且添加浏览器前缀到CSS规则里,使用Can I Use的数据来决定哪些前缀是需要的. 所有你需要做的就是把它添加到你的资源构建工具(例如 Grunt)并且可以完 ...

  6. autoprefixer安装或者里sass的$mixin处理浏览器前缀

    Autoprefixer是一个后处理程序,不象Sass以及Stylus之类的预处理器.它适用于普通的CSS,可以实现css3代码自动补全.也可以轻松跟Sass,LESS及Stylus集成,在CSS编译 ...

  7. 使用selenium时,使用从系统启动浏览器与通过自动化驱动方式启动浏览器控件ID不一样解决方法

    最近遇到一个怪事,通过正常打开浏览器,按照正常的web登录然后点击进入系统流程,将各控件的ID识别成功,然后使用 python3+selenium写好脚本,高高兴兴的用脚本跑时老是提示找不到控件,然后 ...

  8. hbuilder和sublime的autoprefixer安装或者里sass的$mixin处理浏览器前缀

    Autoprefixer是一个后处理程序,不象Sass以及Stylus之类的预处理器.它适用于普通的CSS,可以实现css3代码自动补全.也可以轻松跟Sass,LESS及Stylus集成,在CSS编译 ...

  9. Cocos2dx项目在各种IDE中新建类之后的可行编译方式

    注:这里说可行,但是并不是最好的,只是可以完成编译. 1.linux+code::blocks下的cocos2dx项目新建一个类TestScene.h 新建的TestScene.h和TestScene ...

随机推荐

  1. input输入密码变黑点密文

    input输入密码加密 html代码 <form id="login-form" method="post" onsubmit="return ...

  2. 【Stage3D学习笔记续】山寨Starling(一):从事件说起

    我在GitHub上新开了一个项目:https://github.com/hammerc/hammerc-study-Stage3D 山寨的Starling版本我取名叫做Scorpio2D,以后的笔记中 ...

  3. 利用Microsoft Azure Machine Learning Studio创建机器学习实例

    Microsoft Azure云服务推出机器学习的模块,用户只需上传数据,利用机器学习模块提供的一些算法接口和R语言或别的语言接口,就能利用Microsoft Azure强大的云计算能力来实现自己的机 ...

  4. linux系统基础(二)

    磁盘管理(一) Linux设备认识 /dev/cdrom /dev/sr0 /dev/mouse /dev/sda /dev/hda IDE硬盘(支持4块):hd(a-d) [非IDE硬盘]SCSI硬 ...

  5. java System 常用方法

    一.System.currentTimeMillis() 获取系统当前时间,毫秒 二.System.getProperty Java.version Java 运行时环境版本 java.vendor ...

  6. JNI总结(一)

    JNI 是 Java平台中的一个强大特性.应用程序能够通过 JNI把 C/C++代码集成进 Java程序中.通过 JNI.开发人员在利用 Java平台强大功能的同一时候,又不必放弃对原有代码的投资.由 ...

  7. [React Fundamentals] Component Lifecycle - Updating

    The React component lifecycle will allow you to update your components at runtime. This lesson will ...

  8. android126 zhihuibeijing 极光推送

    https://www.jpush.cn/ 张三把消息发送给自己的服务器,自己的服务器将消息发送给极光推送,然后极光推送将消息发送给妹子. 清单文件: <?xml version="1 ...

  9. careercup-C和C++ 13.4

    13.4 深拷贝和浅拷贝有什么区别,如何使用? 解答 浅拷贝并不复制数据,只复制指向数据的指针,因此是多个指针指向同一份数据. 深拷贝会复制原始数据,每个指针指向一份独立的数据.通过下面的代码, 可以 ...

  10. Locally Weighted Regression

    简单回顾一下线性回归.我们使用了如下变量:\(x\)—输入变量/特征:\(y\)—目标变量:\((x,y)\)—单个训练样本:\(m\)—训练集中的样本数目:\(n\)—特征维度:\((x^{(i)} ...