如何處理CSS3屬性前綴(轉載)總結

今天閒來無聊,從新來講說CSS3前綴的問題。在春節前和@一絲姐姐提及Sass中有關於gradient的mixins。姐姐說:javascript

爲何還要用mixin呢?爲何不使用Autoprefixer?使用Autoprefixer,只須要輸入一行代碼,編譯器幫你作了一切,還糾結個毛mixin。php

姐姐的一句話讓我汗顏,我還在思考着如何讓Sass來寫Gradient,或者相似這樣須要帶前綴的CSS3屬性。也這樣讓我在思考,那麼有了Autoprefixer這樣的後處理,Sass中有關於CSS3的mixins是否是已失去了他存在的意義。帶着這樣的爲何?咱們一塊兒來開啓今天有關於CSS3前綴的探討。css

CSS3的屬性爲何要帶前綴

使用過CSS3屬性的同窗都知道,CSS3屬性都須要帶各瀏覽器的前綴,甚至到如今,依然還有不少屬性須要帶前綴。這是爲何呢?html

個人理解是,瀏覽器廠商之前就一直在實施CSS3,但它還未成爲真正的標準。爲此,當一些CSS3樣式語法還存在波動時,它們提供針對流星器的前綴。如今主要流行的瀏覽器內核主要有:前端

  • Trident內核:主要表明爲IE瀏覽器
  • Gecko內核:主要表明爲Firefox
  • Presto內核:主要表明爲Opera
  • Webkit內核:產要表明爲Chrome和Safari

而這些不一樣內核的瀏覽器,CSS3屬性(部分須要添加前綴的屬性)對應須要添加不一樣的前綴,也將其稱之爲瀏覽器的私有前綴,添加上私有前綴以後的CSS3屬性能夠說是對應瀏覽器的私有屬性:java

  • Trident內核:前綴爲-ms
  • Gecko內核:前綴爲-moz
  • Presto內核:前綴爲-o
  • Webkit內核:前綴爲-webkit

來看一個簡單的示例,早期寫一個圓角border-radius,須要這樣寫:node

.box { -moz-border-radius: 5px; -webkit-border-radius: 5px; -o-border-radius: 5px; border-radius: 5px; }

這樣編寫代碼,無形之中給前端人員增長了很多工做量,因而開始有人在討論這個問題「如何在編寫CSS時不須要添加瀏覽器的私有前綴,又能讓瀏覽器識別?」css3

-prefix-free

prefixfree

爲了解決手工書寫前綴的問題,最先的一個解決方案是由Lea Verou提供的一個-prefix-free腳本。你只須要在你的.html文件中插入一個prefixfree.js文件(能夠是文檔任何地方),建議把這個腳本文件放在樣式表以後。git

添加這個腳本以後,使用CSS3的屬性時,只需書寫標準樣式便可。可是這種作法將全部壓力交給了客戶端來處理。如此一來頁面解析壓力就大了,性能會打必定的折扣,而且一旦腳本加載失敗,那麼就會出現瀏覽器沒法正常渲染CSS3的樣式風格。github

prefixfree腳本僅在IE9+、Opera10+、Firefox3.5+、Safari4+獲得支持。

編輯器插件

除了prefixfree腳本以外,不少同窗依賴於文本編輯器的插件來處理。這裏來看看Sublime Text編輯器裏是如何實現Autoprefixer功能的。

要在編輯器中安裝Autoprefixer插件,首先須要你的環境中已經安裝好了Node.js。你能夠在命令終端執行:

node -v

來檢測是否已安裝,若是沒有安裝,請先安裝。在這裏假設你已具有Node.js環境。

如今開啓你的Sublime Text編輯器,你能夠同時按下command + Shift + p三個鍵,選擇"Install Package"。而後搜索Autoprefixer

Install Package

如今你在你的Sublime Text中使用Autoprefixer功能。假設你在樣式文件中輸入:

.box { transform: rotate(45deg); border-radius: 5px; box-shadow: 1px 1px 0 rgba(0,0,0,.25); transition: all .2s ease .1s; }

這個時候你只須要同時按下Command + Shift + P三個鍵,選擇「Autoprefix CSS」,而且回車,就能獲得下面這樣的代碼:

.box { -webkit-transform: rotate(45deg); transform: rotate(45deg); border-radius: 5px; box-shadow: 1px 1px 0 rgba(0,0,0,.25); transition: all .2s ease .1s; }

以下圖所示:

Autoprefixer

注:不一樣的配置,執行的效果不同。詳細能夠點擊這裏查閱。

預處理器中的混合宏

隨着CSS預處理器愈來愈普及,部分同窗開始採用預處理器中的混合宏來處理CSS3前綴的事項。好比說Compass,裏面就是使用Sass的mixin爲CSS3須要帶前綴的屬性定製了一些mixin。還有相似於Stylus中的nib等。預處理器中的混合宏確實能夠解決不少問題,但也產生了新的問題,就是它所使用的語法是全新的,若是要使用就必須從新學習,另外這類工具的演進速度一般都會跟不上瀏覽器的發展速度,這樣也會形成其產生的CSS有過期的問題,有時候爲了解決一些問題,還須要本身去寫mixins。好比:

CSS3 mixins

正如前面所說的,若是要跟上瀏覽器的演進,就須要不斷的更新你的CSS3 mixins,否則就會形成你的代碼不是最新的。其中Compass就存在這樣的問題:

@import "compass"; .box { @include border-radius(5px); } 

編譯出來的CSS:

.box { -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }

而現實卻不盡人意,由於到寫這篇文章爲止,咱們寫圓角屬性只須要:

.box { border-radius: 5px; }

各主流瀏覽器就能正常的解析。形成這個緣由的時,Compass中的CSS3的mixin沒有跟上步子去更新定義好的mixins。

使用Autoprefixer

使用Sass、LESS、Stylus或者其餘相似的工具都是屬於CSS的前處理器(Preprocessor),而Autoprefixer則是一種後處理器(Postprocessor)。它是直接針對CSS自己來進行處理,不須要任何額外的語法。由於它是在CSS代碼產生以後才進行後續處理。

Autoprefixer是以Rework這種架構所發展的CSS後處理器,他是將CSS代碼解析後轉成JavaScript的資料結構,進行處理後再產生新的CSS代碼。

Autoprefixer會分析CSS代碼,而且根據Can I Use所提供的資料來決定要加上哪些瀏覽器前綴,而你要作的事情就是把他加入本身的自動化開發工具中(好比Grunt或者Gulp),而後就能夠直接使用W3C的標準來寫CSS,不須要加上任何瀏覽器的私有前綴。

接下來看看如何使用自動化工具實現Autoprefixer功能。

Grunt中配置Autoprefixer

假設你的環境中已具有了Grunt的運行環境,若是沒有請先移步Grunt官網瞭解,這裏不作過多闡述。

在Github中有一個grunt-autoprefixer的插件,按照其官方提示,我在命令行中執行了下面的語句:

npm install grunt-autoprefixer --save-dev 

命令終端提示:

grunt autoprefixer

彷佛沒有成功(其實我也不太懂Grunt,只是臨陣磨槍)。因而我改投@一絲姐姐說的postcss。在命令終端從新輸入:

npm install grunt-postcss --save-dev 

這下彷佛有戲了:

postcss autoprefixer

不過我還跟着官網所說的執行了另一個命令:

npm install grunt-postcss autoprefixer-core csswring

運行命令後能夠看到下圖的提示信息:

postcss autoprefixer

接下來須要在你項目的根目錄中配置Gruntfile.js文件:

'use strict'; module.exports = function(grunt) { // Dynamically loads all required grunt tasks require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks); var autoprefixer = require('autoprefixer-core'); // Configures the tasks that can be run grunt.initConfig({ postcss: { options: { processors: [ autoprefixer({ browsers: ['last 2 version'] }).postcss ] }, // dist: { // src: 'src/css/*.css', // dest:'dest/css/*.css' // } multiple_files: { expand: true, flatten: true, src: 'src/css/*.css', // -> src/css/file1.css, src/css/file2.css dest: 'dest/css/' // -> dest/css/file1.css, dest/css/file2.css }, }, }); grunt.loadNpmTasks('grunt-postcss'); grunt.registerTask('default', ['postcss']); }; 

爲了驗證這樣作是否正確,我在項目中的src/css/中建立了一個main.css文件,而後輸入代碼:

a { transition: all .2s ease .1s; transform: rotate(45deg) translateY(200px); }

在命令終端執行:

grunt

終端將運行:

Running "postcss:multiple_files" (postcss) task
File dest/css/main.css created.

Done, without errors.

查看項目中自動建立了一個dest/css/main.css文件,而裏面的代碼:

a { transition: all .2s ease .1s; -webkit-transform: rotate(45deg) translateY(200px); transform: rotate(45deg) translateY(200px); }

正是我須要的樣式代碼。這樣嘗試一回,以爲比使用Sass中的mixin爽多了。

Gulp中配置Autoprefixer

除了Grunt能夠配置Autoprefixer以外,還可使用Gulp來配置。這裏也假設你的項目中已具有了Gulp的運行環境,若是沒有,能夠查閱Gulp官網相關資料。

根據gulp-autoprefixer官網提示,我在命令終端輸入了:

npm install gulp-autoprefixer --save-dev 

在終端中能夠看到這樣的提示信息:

gulp autoprefixer

在Grunt中須要在Gruntfile.js進行配置,而在Gulp中也有點相似,須要在gulpfile.js中進行配置:

// include gulp var gulp = require('gulp'); // include plug-ins var autoprefix = require('gulp-autoprefixer'); // JS hint task gulp.task('styles', function() { gulp.src(['./src/styles/*.css']) .pipe(autoprefix('last 2 versions')) .pipe(gulp.dest('./build/styles')); }); 

看上去要比Gruntfile.js配置簡單一些。爲了驗證操做是否正確,我在項目中建立了src/styles/style.css,而且在style.css文件中輸入了:

a { transform: translateY(20px) rotate(45deg); }

接下來在命令終端執行:

gulp styles

看到以下提示信息:

[12:53:26] Using gulpfile ~/Sites/test/gulp-autoprefixer/gulpfile.js [12:53:26] Starting 'styles'... [12:53:26] Finished 'styles' after 7.26 ms 

此時,在項目中會自動建立一個build/styles/style.css文件,打開這個文件查看代碼:

a { -webkit-transform: translateY(20px) rotate(45deg); -ms-transform: translateY(20px) rotate(45deg); transform: translateY(20px) rotate(45deg); }

正是咱們須要的。

其實在PostCSS也提供了有關於如何在Gulp中配置Autoprefixer的說明。感興趣的同窗能夠看看

有了Autoprefixer這樣的工具對於處理CSS3屬性前綴來講就再也不是頭痛的事情了。固然,若是你正在使用CSS預處理器編寫代碼,那麼也能夠很完美的結合Autoprefixer去處理。

總結

通過幾年的技術演進,CSS3屬性前綴的問題已再也不是一個問題。現在天你徹底能夠忽略我要不要加前綴,要加哪些前綴,而只須要專心去碼你的代碼。把這些煩人的事情交給Autoprefixer去處理。固然,越到後面,或許咱們都不須要使用任何前綴。

如需轉載,煩請註明出處:http://www.w3cplus.com/css3/autoprefixer-css-vender-prefixes.html

 

Autoprefixer:一個以最好的方式處理瀏覽器前綴的後處理程序

Autoprefixer解析CSS文件而且添加瀏覽器前綴到CSS規則裏,使用Can I Use的數據來決定哪些前綴是須要的。

全部你須要作的就是把它添加到你的資源構建工具(例如 Grunt)而且能夠徹底忘記有CSS前綴這東西。儘管按照最新的W3C規範來正常書寫你的CSS而不須要瀏覽器前綴。像這樣:

1
2
3
a{
      transition :transform 1 s
}

Autoprefixer使用一個數據庫根據當前瀏覽器的普及度以及屬性支持提供給你前綴:

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

問題

 
固然咱們能夠手寫瀏覽器前綴,可是這顯得乏味以及易錯。
 
咱們也可使用相似 Prefixr這樣的服務以及編輯器插件,但這仍然乏於跟一堆重複的代碼打交道。
 
咱們可使用象 Compass之於Sass以及 nib之於Stylus之類的預處理器提供的mixin庫。它們能夠解決絕大部分問題,但同時又引入了其餘問題。
它們強制咱們使用新的語法。它們迭代慢於現代瀏覽器,因此當穩定版發佈時會產生不少沒必要要的前綴,有時咱們須要建立本身的mixins。
 
Compass實際上並無爲你屏蔽前綴,由於你依然須要決定許多問題,例如:我須要爲 border-radius 寫一個mixin嗎?我須要用逗號分割 +transition 的參數嗎?
 
Lea Verou的 -prefix-free幾乎解決了這個問題,可是使用客戶端庫並非個好注意,當你把最終用戶性能考慮進去的話。爲了防止反覆作一樣的事情,最好是在資源構建或者項目發佈時再構建一次CSS。
 
 
揭祕
 
Autoprefixer是一個後處理程序,不象Sass以及Stylus之類的預處理器。它適用於普通的CSS而不使用特定的語法。能夠輕鬆跟Sass以及Stylus集成,因爲它在CSS編譯後運行。
 
Autoprefixer基於 Rework,一個能夠用來編寫你本身的CSS後處理程序的框架。Rework解析CSS成有用Javascript結構通過你的處理後導回給CSS。
 
Autoprefixer的每一個版本都包含一份最新的 Can I Use 數據:
  • 當前瀏覽器列表以及它們的普及度。
  • 新CSS屬性,值和選擇器前綴列表。
Autoprefixer默認將支持主流瀏覽器最近2個版本,這點 相似Google。不過你能夠在本身的項目中經過名稱或者模式進行選擇:
  • 主流瀏覽器最近2個版本用「last 2 versions」;
  • 全球統計有超過1%的使用率使用「>1%」;
  • 僅新版本用「ff>20」或」ff>=20″.
而後Autoprefixer計算哪些前綴是須要的,哪些是已通過期的。
 
當Autoprefixer添加前綴到你的CSS,還不會忘記修復語法差別。這種方式,CSS是基於最新W3C規範產生:
1
2
3
4
5
6
7
a {
      background : linear-gradient(to top , black , white );
      display : flex
}
::placeholder {
      color : #ccc
}
編譯成:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
a {
     background : -webkit-linear-gradient( bottom , black , white );
     background : linear-gradient(to top , black , white );
     display : -webkit-box;
     display : -webkit-flex;
     display : -moz-box;
     display : -ms-flexbox;
     display : flex
}
:-ms-input-placeholder {
     color : #ccc
}
::-moz-placeholder {
     color : #ccc
}
::-webkit-input-placeholder {
     color : #ccc
}
::placeholder {
     color : #ccc
}
Autoprefixer 一樣會清理過時的前綴(來自遺留的代碼或相似 Bootstrap CSS庫),所以下面的代碼:
1
2
3
4
a {
     -webkit-border-radius : 5px ;
     border-radius : 5px
}
編譯成:
1
2
3
a {
     border-radius : 5px
}
由於通過Autoprefixer處理,CSS將僅包含實際的瀏覽器前綴。 Fotorama從Compass切換到Autoprefixer以後,CSS大小 減小了將近20%。

 

 
 
演示
 
若是你還沒用過任何工具來自動化構建你的靜態資源,必定要嘗試下 Grunt,我強烈推薦你開始使用構建工具。這將開啓你整個語法糖世界,高效的mixin庫以及實用的圖片處理工具。全部開發者的高效方法用來節約大量精力以及時間(自由選擇語言,代碼服用,使用第三方庫的能力)現將都適用於前端開發人員。
 
讓咱們建立一個項目目錄以及在style.css中寫些簡單的CSS:
 
style.css
{  }
 
在這個例子中,咱們將使用Grunt。首先須要使用npm安裝 grunt-autoprefixer :
npm  install grunt-cli grunt-contrib-watch grunt-autoprefixer
 
而後咱們須要建立 Gruntfile.js 文件以及啓用Autoprefixer:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Gruntfile.js
module.exports = function (grunt) {
      grunt .initConfig ({
           autoprefixer : {
                dist : {
                     files : { 'build/style.css' : 'style.css' } } },
                     watch : {
                          styles : {
                               files : [ 'style.css' ],
                               tasks : [ 'autoprefixer' ]
                          }
                     }
                });
  
grunt.loadNpmTasks( 'grunt-autoprefixer' );
grunt.loadNpmTasks( 'grunt-contrib-watch' );};
此配置文件可讓Autoprefixer編譯  style.css 到  build/style.css. 一樣咱們將用  grunt-contrib-watch 監聽 style.css文件變化從新編譯 build/style.css。

 

 
啓用Grunt的Watch功能:
./node_modules/.bin/grunt watch
 
如今咱們添加一個CSS3表達式到style.css並保存:
style.css
1
2
3
a {
      width : calc(50% - 2em)
}
接下來是見證奇蹟的時刻,如今我有了build/style.css文件,Grunt監測到style.css文件發生變化並啓用Autoprefixer任務。

 

Autoprefixer發現了 calc() 值單元須要Safari 6的 瀏覽器前綴
build/style.css
1
2
3
4
a {
      width : -webkit-calc( 50% - 2em );
      width : calc( 50% - 2em )
}
咱們再添加多一點點複雜的CSS3到style.css並保存:

 

style.css
1
2
3
4
a {
      width : calc( 50% - 2em );
      transition : transform 1 s
}
Autoprefixer已知Chrome,Safari 6以及Opera 15 須要transitiontransform  添加前綴。但IE9也須要爲transform添加前綴,做爲transition的值。

 

 
build/style.css
1
2
3
4
5
6
7
a {
      width : -webkit-calc( 1% + 1em );
      width : calc( 1% + 1em );
      -webkit-transition : -webkit-transform 1 s;
      transition : -ms-transform 1 s;
      transition : transform 1 s
}
Autoprefixer爲完成你全部髒活而設計。它會根據Can I Use數據庫,寫入全部須要的前綴而且一樣理解規範之間的區別,歡迎來到將來的CSS3 – 再也不有瀏覽器前綴!

 

 
下一步?
 
一、Autoprefixer支持Ruby on Rails, MiddlemanMincer,Grunt,Sublime Text。瞭解更多關於如何在你的環境中使用的 文檔
二、若是你的環境還不支持Autoprefixer, 請報告給我
三、關注 @autoprefixer得到更新以及新特性信息。
相關文章
相關標籤/搜索