目錄
初识PostCSS
快速使用PostCSS
环境准备
修改gulpfile.js
创建示例样式
运行实例
了解PostCSS
深入PostCSS
PostCSS性能
开始编写自己的PostCSS插件
创建插件文件夹
创建插件入口文件
再谈PostCSS
首頁 web前端 html教學 POSTCSS快速入门使用_html/css_WEB-ITnose

POSTCSS快速入门使用_html/css_WEB-ITnose

Jun 21, 2016 am 08:57 AM

| 原文链接: http://aotu.io/notes/2015/10/13/start-postcss/

初识PostCSS

如果你第一次听说 PostCSS这个东西,那么请看下面摘自官方 Github的介绍:

PostCSS is a tool for transforming CSS with JS Plugins. These plugins can support variables and mixins, transpile future CSS syntax, inline images, and more

翻译成中文的意思如下:

PostCSS 是一套利用JS插件实现的用来改变CSS的工具.这些插件能够支持变量和混合语法,转换未来CSS语法,内联图片,还有更多

我们用过 Less、 SASS等工具来对CSS做 预处理操作,按照它们约定的语法来书写并且最终转换成可用的样式,这付出的代价是 必须先熟悉这个工具的书写语法

随着近几年 Grunt、 Gulp、 Webpack等自动化工具的兴起, 组合式应用变得非常的热门,那 PostCSS存在的意义是什么呢?答案是: CSS生态系统

PostCSS拥有非常多的插件,诸如自动为CSS添加浏览器前缀的插件 autoprefixer、当前移动端最常用的 px转 rem插件 px2rem,还有支持尚未成为CSS标准但特定可用的插件 cssnext,还有很多很多。就连著名的 Bootstrap在下一个版本 Bootstrap 5也将使用 PostCSS作为样式的基础。

一句话来概括PostCSS: CSS编译器能够做到的事情,它也可以做到,而且能够做得更好

快速使用PostCSS

上面大致介绍了 PostCSS,也许我们并没有在头脑里形成对它的认知,那下面我们就通过一个简单地实例来看看如何使用 PostCSS。

PostCSS得益于插件,支持Grunt,Gulp,webpack,Broccoli,Brunch还有ENB,这里我们将以 Gulp作为实例来讲。

环境准备

创建并进入我们的实例目录

mkdir postcss-demo && cd postcss-demo
登入後複製

然后快速生成 package.json文件

# --yes 参数能够帮助我们快速生成默认的package.jsonnpm init --yes
登入後複製

将上面创建的 package.json文件的 main参数改为 gulpfile.js,然后安装我们所需的依赖

# gulp跟gulp-postcss是必须的,后面两个插件为了演示用途npm i gulp gulp-postcss autoprefixer autoprefixer-core cssnext --save-dev -d
登入後複製

创建 gulpfile.js

# 这里用命令行进行创建,你也可以手动新建touch gulpfile.js
登入後複製

修改gulpfile.js

将下面代码贴进 gulpfile.js

var gulp = require('gulp');var postcss = require('gulp-postcss');var autoprefixer = require('autoprefixer');var cssnext = require('cssnext');//定义css任务gulp.task('css', function(){  //定义postcss任务流数组  var processors = [    autoprefixer({      browsers:['last 3 version'],      cascade: false,      remove: false    }),    cssnext()  ];  return gulp.src('./src/css/*.css')             .pipe(postcss(processors))             .pipe(gulp.dest('./dist'));});
登入後複製

创建示例样式

在项目根目录下创建src目录,再在src目录下面创建css目录,然后创建style.css文件

# 这里用命令创建,你也可以手动创建mkdir -p src/css && touch style.css
登入後複製

编辑样式如下:

h1{  display:flex;}:root {--fontSize: 1rem;--mainColor: #12345678;--highlightColor: hwb(190, 35%, 20%);}body {color: var(--mainColor);font-size: var(--fontSize);line-height: calc(var(--fontSize) * 1.5);padding: calc((var(--fontSize) / 2) + 1px);}
登入後複製

运行实例

一切准备就绪之后可以在项目根目录下执行刚才我们定义的任务

gulp css
登入後複製
登入後複製

如果不出什么意外的话就会在根目录下面生成一个 dist文件夹,里面有一个样式文件,内容如下:

body{  display:-webkit-flex;  display:-ms-flexbox;  display:-webkit-box;  display:flex;}body {color:#123456;color:rgba(18, 52, 86, 0.47059);font-size:16px;font-size:1rem;line-height:24px;line-height:1.5rem;padding:calc(0.5rem + 1px);}
登入後複製

我们可以看到我们写的样式自动添加了浏览器前缀,并且一些未来CSS语法也被转换了。

了解PostCSS

通过上面的实例我们应该知道 PostCSS的使用方法,此时让我们先回想一下 CSS预处理器的使用历程:

  1. 学习该CSS预处理器的语法特性,诸如:变量定义、嵌套、继承
  2. 在特定后缀名(.less/.scss等)的文件按照上面的语法进行编写
  3. 通过Gulp/Grunt/Webpack等自动化工具或者手动编译成CSS样式

而 PostCSS的使用历程:

  1. 直接按照CSS标准语法来书写CSS样式文件
  2. 通过Gulp/Grunt/Webpack等自动化工具加载PostCSS插件转换输出

通过对比我们类比一个结论: CSS预处理器好比给你一个工具箱,工具箱里面有什么东西该怎么拿已经跟你约定好,你必须按照这个规则来拿;而PostCSS好比给你一个盒子,你可以从旁边选择自己需要的工具放进盒子打包拿走,如果还不够用你可以自己造一个工具

深入PostCSS

PostCSS自身只包括了 CSS分析器, CSS节点树API, source map生成器, CSS节点拼接器,而基于 PostCSS的插件都是使用了 CSS节点树API来实现的。

我们都知道CSS的组成如下:

element {  prop1 : rule1 rule2 ...;  prop2 : rule1 rule2 ...;  prop2 : rule1 rule2 ...;  ...}
登入後複製

也就是一条一条的样式规则组成,每一条样式规则包含一个或多个属性跟值。所以 PostCSS的执行过程大致如下:

  1. Parser

    利用 CSS分析器读取CSS字符内容,得到一个完整的 节点树

  2. Plugin

    对上面拿到的 节点树利用 CSS节点树API进行一系列的转换操作

  3. Plugin

    利用 CSS节点拼接器将上面转换之后的节点树重新组成CSS字符

  4. Stringifier

    在上面转换期间可利用 source map生成器表明转换前后字符的对应关系

PostCSS性能

在PostCSS官方推特上看到,由JavaScript编写的PostCSS比C++编写的libsass还要快3倍。

如果你对上面的性能截图有疑问,可以亲自来 这里测试看看。

开始编写自己的PostCSS插件

PostCSS在自己的 Github上放了一些常用的插件,更多的插件可以在 postcss.parts进行搜索。

但有时候已有的插件不满足我们的需求,这个时候需要编写自己的PostCSS插件,下面我们将一步步创建一个简单的插件,这个插件功能非常简单,如下:

/*   文件位置:src/css/style.css */h1 {  font-family: "\5FAE\8F6F\96C5\9ED1",fontstack('Arial');}
登入後複製

当输入上面的样式时,会生成下面的样式:

/*  文件位置:dist/style.css */h1 {  font-family: "\5FAE\8F6F\96C5\9ED1",tahoma,arial;}
登入後複製

环境准备

我们将以 Gulp作为基础来实现我们的插件,首先创建项目文件夹

mkdir postcss-plugin && cd postcss-plugin
登入後複製

然后快速创建 package.json文件:

npm init --yes
登入後複製

紧接着先安装必备的包

npm i gulp postcss gulp-postcss --save-dev -d
登入後複製

再创建 gulpfile.js并且输入下面内容:

var gulp = require('gulp');var postcss = require('gulp-postcss');gulp.task('css', function(){  var processors = [  ];  return gulp.src('./src/css/*.css')             .pipe(postcss(processors))             .pipe(gulp.dest('./dist'));});
登入後複製
登入後複製

创建插件文件夹

我们在执行 npm install安装的包都放置在 node_modules文件夹下面,这里我们创建PostCSS的插件文件夹,注意: PostCSS的插件命名格式为:postcss-插件名字

# 这里采用命令新建文件夹,你也可以手动创建mkdir node_modules/postcss-fontstack
登入後複製

创建插件入口文件

现在我们可以在 postcss-fontstack文件夹创建入口文件 index.js, PostCSS创建插件的方式如下:

var postcss = require('postcss');module.exports = postcss.plugin('插件名字', function 插件名字(选项){  //这里写插件代码})
登入後複製

那我们可以在 index.js里面贴入下面代码:

var postcss = require('postcss');modules.exports = postcss.plugin('fontstack', function fontstack( options ){  return function( css ){    options = options || {};    var fontstack_config = {      'Arial': 'tahoma,arial',      'Times New Roman': 'TimesNewRoman, "Times New Roman", Times, Baskerville, Georgia, serif'    };    function toTitleCase( str ){      return str.replace(/\w\S*/g,function( txt ){          return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();      });    }    // css.walkRules方法用来遍历每一条css规则    css.walkRules( function( rule ){        // walkDecls方法用来解析属性跟值        rule.walkDecls( function( decl, i ){            var value = decl.value;            if( value.indexOf( 'fontstack(' ) !== -1 ){                var fontstack_requested = value.match(/\(([^)]+)\)/)[1].replace(/["']/g,"");                fontstack_requested = toTitleCase( fontstack_requested );                var fontstack = fontstack_config[ fontstack_requested ];                var firstFont = value.substr( 0, value.indexOf('fontstack(') );                var newValue = firstFont + fontstack;                decl.value = newValue;            }        });    });  }});
登入後複製

在 gulpfile.js引入上面的插件,代码如下:

var gulp = require('gulp');var postcss = require('gulp-postcss');gulp.task('css', function(){  var processors = [  ];  return gulp.src('./src/css/*.css')             .pipe(postcss(processors))             .pipe(gulp.dest('./dist'));});
登入後複製
登入後複製

运行实例

在项目根目录下运行实例,最终实现我们的效果

gulp css
登入後複製
登入後複製

再谈PostCSS

基于 PostCSS能够做到很多 CSS预处理器做不到的事情,未来发展前景还是挺不错的,而且最新的 Atom编辑器也可以下载插件来支持 PostCSS这种语法。

但这就意味着 CSS预处理器过时了么?不会。 PostCSS的出现并不是为了替换掉之前的技术,只是提供多一种思路让我们去考虑,就比如Sass编译后再加 autoprefixer自动补齐浏览器前缀这种做法当前还是比较流行的。

再回到文章最开始说的, PostCSS其实是在打造一个改变CSS开发方式的生态系统。也许暂时我们还是保持传统的开发方式,但未来对于 PostCSS我还是保持关注,它是值得期待的。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

> gt;的目的是什麼 元素? > gt;的目的是什麼 元素? Mar 21, 2025 pm 12:34 PM

本文討論了HTML< Progress>元素,其目的,樣式和與< meter>元素。主要重點是使用< progress>為了完成任務和LT;儀表>對於stati

< datalist>的目的是什麼。 元素? < datalist>的目的是什麼。 元素? Mar 21, 2025 pm 12:33 PM

本文討論了html< datalist>元素,通過提供自動完整建議,改善用戶體驗並減少錯誤來增強表格。Character計數:159

HTML5中跨瀏覽器兼容性的最佳實踐是什麼? HTML5中跨瀏覽器兼容性的最佳實踐是什麼? Mar 17, 2025 pm 12:20 PM

文章討論了確保HTML5跨瀏覽器兼容性的最佳實踐,重點是特徵檢測,進行性增強和測試方法。

< meter>的目的是什麼。 元素? < meter>的目的是什麼。 元素? Mar 21, 2025 pm 12:35 PM

本文討論了HTML< meter>元素,用於在一個範圍內顯示標量或分數值及其在Web開發中的常見應用。它區分了< meter>從< progress>和前

如何使用HTML5表單驗證屬性來驗證用戶輸入? 如何使用HTML5表單驗證屬性來驗證用戶輸入? Mar 17, 2025 pm 12:27 PM

本文討論了使用HTML5表單驗證屬性,例如必需的,圖案,最小,最大和長度限制,以直接在瀏覽器中驗證用戶輸入。

視口元標籤是什麼?為什麼對響應式設計很重要? 視口元標籤是什麼?為什麼對響應式設計很重要? Mar 20, 2025 pm 05:56 PM

本文討論了視口元標籤,這對於移動設備上的響應式Web設計至關重要。它解釋瞭如何正確使用確保最佳的內容縮放和用戶交互,而濫用可能會導致設計和可訪問性問題。

< iframe>的目的是什麼。 標籤?使用時的安全考慮是什麼? < iframe>的目的是什麼。 標籤?使用時的安全考慮是什麼? Mar 20, 2025 pm 06:05 PM

本文討論了< iframe>將外部內容嵌入網頁,其常見用途,安全風險以及諸如對象標籤和API等替代方案的目的。

Gitee Pages靜態網站部署失敗:單個文件404錯誤如何排查和解決? Gitee Pages靜態網站部署失敗:單個文件404錯誤如何排查和解決? Apr 04, 2025 pm 11:54 PM

GiteePages靜態網站部署失敗:404錯誤排查與解決在使用Gitee...

See all articles