목차
初识PostCSS
快速使用PostCSS
环境准备
修改gulpfile.js
创建示例样式
运行实例
了解PostCSS
深入PostCSS
PostCSS性能
开始编写自己的PostCSS插件
创建插件文件夹
创建插件入口文件
再谈PostCSS
웹 프론트엔드 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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

& lt; Progress & Gt의 목적은 무엇입니까? 요소? & lt; Progress & Gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:34 PM

이 기사는 HTML & lt; Progress & Gt에 대해 설명합니다. 요소, 그 목적, 스타일 및 & lt; meter & gt의 차이; 요소. 주요 초점은 & lt; progress & gt; 작업 완료 및 & lt; meter & gt; Stati의 경우

& lt; datalist & gt의 목적은 무엇입니까? 요소? & lt; datalist & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:33 PM

이 기사는 HTML & LT; Datalist & GT에 대해 논의합니다. 자동 완성 제안을 제공하고, 사용자 경험을 향상시키고, 오류를 줄임으로써 양식을 향상시키는 요소. 문자 수 : 159

HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? Mar 17, 2025 pm 12:20 PM

기사는 HTML5 크로스 브라우저 호환성을 보장하기위한 모범 사례에 대해 논의하고 기능 감지, 점진적 향상 및 테스트 방법에 중점을 둡니다.

& lt; meter & gt의 목적은 무엇입니까? 요소? & lt; meter & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:35 PM

이 기사는 HTML & lt; meter & gt에 대해 설명합니다. 범위 내에 스칼라 또는 분수 값을 표시하는 데 사용되는 요소 및 웹 개발의 일반적인 응용 프로그램. & lt; meter & gt; & lt; Progress & Gt; 그리고 Ex

HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? Mar 17, 2025 pm 12:27 PM

이 기사에서는 브라우저에서 직접 사용자 입력을 검증하기 위해 필요한, Pattern, Min, Max 및 Length 한계와 같은 HTML5 양식 검증 속성을 사용하는 것에 대해 설명합니다.

뷰포트 메타 태그는 무엇입니까? 반응 형 디자인에 중요한 이유는 무엇입니까? 뷰포트 메타 태그는 무엇입니까? 반응 형 디자인에 중요한 이유는 무엇입니까? Mar 20, 2025 pm 05:56 PM

이 기사는 모바일 장치의 반응 형 웹 디자인에 필수적인 Viewport Meta Tag에 대해 설명합니다. 적절한 사용이 최적의 컨텐츠 스케일링 및 사용자 상호 작용을 보장하는 방법을 설명하는 반면, 오용은 설계 및 접근성 문제로 이어질 수 있습니다.

& lt; iframe & gt; 꼬리표? 보안을 사용할 때 보안 고려 사항은 무엇입니까? & lt; iframe & gt; 꼬리표? 보안을 사용할 때 보안 고려 사항은 무엇입니까? Mar 20, 2025 pm 06:05 PM

이 기사는 & lt; iframe & gt; 외부 컨텐츠를 웹 페이지, 공통 용도, 보안 위험 및 객체 태그 및 API와 같은 대안을 포함시키는 태그의 목적.

Gitee Pages 정적 웹 사이트 배포 실패 : 단일 파일 문제를 해결하고 해결하는 방법 404 오류? Gitee Pages 정적 웹 사이트 배포 실패 : 단일 파일 문제를 해결하고 해결하는 방법 404 오류? Apr 04, 2025 pm 11:54 PM

GiteEpages 정적 웹 사이트 배포 실패 : 404 오류 문제 해결 및 해결시 Gitee ...

See all articles