网上关于
postcss
是什么的介绍真的是太多了。。。
简单粗暴的说,postcss
就是一款相似babel
的样式转换器!
多说无益,下面就用一个demo来演示一下postcss
的用法。css
cd ~/workspace/postcss #进入你本身的工具目录 mkdir postcss cd postcss mkidr css npm init #初始化package.json,一路回车便可
进入到css目录,新建一个index.css
文件,键入以下内容:web
button { border-radius: 4px; transition: all 0.8s; color: $red; width: 100px; }
npm install gulp gulp-postcss --save #安装须要的包,这里使用gulp来构建、打包
postcss
文件夹根目录新建一个gulpfile.js
文件,键入以下内容:npm
var gulp = require('gulp'); var postcss = require('gulp-postcss'); gulp.task('css', function() { //postcss处理器列表,暂时为空 var processors = []; return gulp.src('./css/*.css') .pipe(postcss(processors)) .pipe(gulp.dest('./build/')); });
执行gulp css
,测试一下打包是否正常!json
查看生成的
build/index.css
文件,和原始文件同样。
由于目前processors
数组尚未加入任何插件!gulp
修改gulpfile.js
,完成后以下:数组
var gulp = require('gulp'); var postcss = require('gulp-postcss'); gulp.task('css', function() { var processors = [ autoprefixer ]; return gulp.src('./css/*.css') .pipe(postcss(processors)) .pipe(gulp.dest('./build/')); }); function autoprefixer(css) { css.walkDecls(function(decl) { if (decl.prop === 'border-radius' || decl.prop === 'transition') { decl.cloneBefore({prop: '-moz-' + decl.prop}); decl.cloneBefore({prop: '-o-' + decl.prop}); decl.cloneBefore({prop: '-webkit-' + decl.prop}); } return decl; }); }
从新执行gulp css
打包,完成后查看`build/index.css',以下:babel
button { -moz-border-radius: 4px; -o-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; -moz-transition: all 0.8s; -o-transition: all 0.8s; -webkit-transition: all 0.8s; transition: all 0.8s; color: $red; width: 100px; }
修改gulpfile.js
,完成后以下:工具
var gulp = require('gulp'); var postcss = require('gulp-postcss'); gulp.task('css', function() { var processors = [ autoprefixer, resoleVar ]; return gulp.src('./css/*.css') .pipe(postcss(processors)) .pipe(gulp.dest('./build/')); }); function autoprefixer(css) { css.walkDecls(function(decl) { if (decl.prop === 'border-radius' || decl.prop === 'transition') { decl.cloneBefore({prop: '-moz-' + decl.prop}); decl.cloneBefore({prop: '-o-' + decl.prop}); decl.cloneBefore({prop: '-webkit-' + decl.prop}); } return decl; }); } function resoleVar(css) { css.walkDecls(function(decl) { if (decl.prop === 'color' && decl.value.indexOf('$red') > -1) { decl.value = decl.value.replace('$red', '#f00'); } return decl; }); }
从新执行gulp css
打包,完成后查看`build/index.css',以下:post
button { -moz-border-radius: 4px; -o-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; -moz-transition: all 0.8s; -o-transition: all 0.8s; -webkit-transition: all 0.8s; transition: all 0.8s; color: #f00; width: 100px; }
修改gulpfile.js
,完成后以下:学习
var gulp = require('gulp'); var postcss = require('gulp-postcss'); gulp.task('css', function() { var processors = [ autoprefixer, resoleVar, px2rem ]; return gulp.src('./css/*.css') .pipe(postcss(processors)) .pipe(gulp.dest('./build/')); }); function autoprefixer(css) { css.walkDecls(function(decl) { if (decl.prop === 'border-radius' || decl.prop === 'transition') { decl.cloneBefore({prop: '-moz-' + decl.prop}); decl.cloneBefore({prop: '-o-' + decl.prop}); decl.cloneBefore({prop: '-webkit-' + decl.prop}); } return decl; }); } function resoleVar(css) { css.walkDecls(function(decl) { if (decl.prop === 'color' && decl.value.indexOf('$red') > -1) { decl.value = decl.value.replace('$red', '#f00'); } return decl; }); } function px2rem(css) { css.walkDecls(function(decl) { if(/\d+px/.test(decl.value)) { decl.value = decl.value.replace(/\d+px/, function(dest) { return parseInt(dest) / 20 + 'rem'; }) } return decl; }); }
从新执行gulp css
打包,完成后查看`build/index.css',以下:
button { -moz-border-radius: 0.2rem; -o-border-radius: 0.2rem; -webkit-border-radius: 0.2rem; border-radius: 0.2rem; -moz-transition: all 0.8s; -o-transition: all 0.8s; -webkit-transition: all 0.8s; transition: all 0.8s; color: #f00; width: 5rem; }
通过了上面这三个简单的
processor
以后,相信你们对postcss
的认识会更直白一点了吧。。。
npm install autoprefixer --save
和以前咱们本身实现
autoprefixer
的相似,只不过这个插件作的更好更全一点。
npm install precss --save
press语法和Sass极其类似,你能够绝不费力的使用它。
和上面的同样,加入到processors
便可,以下:
/** * 此处省略N行 */ var autoprefixer = require('autoprefixer'); var precss = require('precss'); /** * 此处省略N行 */ var processors = [ autoprefixer({browsers: ['last 10 version'], cascade: false, remove: false}), resoleVar, px2rem, precss ]; /** * 此处省略N行 */
为了验证插件确实生效了,修改一下css文件,以下:
button { border-radius: 4px; transition: all 0.8s; color: $red; width: 100px; box-sizing: border-box; } .menu { a { text-decoration: none; } }
执行gulp css
再次从新打包,结果以下:
button { -webkit-border-radius: 0.2rem; border-radius: 0.2rem; -webkit-transition: all 0.8s; transition: all 0.8s; color: #f00; width: 5rem; -webkit-box-sizing: border-box; box-sizing: border-box; } .menu a { text-decoration: none; }
这里就介绍这两个插件来抛砖引玉一下!其实大部分都会使用postcss已有的一些插件,而不多本身去造轮子。固然,若是你有这样的特殊需求或者想学习一下,但愿上面那三个例子能够帮到你,你们加油!