Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

PostCSS学习笔记

22
Dec
2016

PostCSS学习笔记

By Alex
/ in CSS
/ tags 学习笔记
0 Comments
简介

由于CSS语言本身的表达能力较差,Web开发人员常常使用SASS、LESS之类的CSS预处理器语言来编写样式,然后再编译为普通的CSS代码。

PostCSS是一个类似的、较晚出现的CSS处理器,它基于JavaScript语言编写。PostCSS使用插件式的架构,而不是像以前的CSS预处理器那样内置所有特性。目前PostCSS的插件数量已经有数百个。

尽管名字中带有Post,PostCSS并不是所谓后处理器。它可以执行其它预处理器能够完成的任务。PostCSS本身只做两件事情:

  1. 将输入代码转换为抽象语法树(AST)
  2. 调用插件处理AST
插件机制

PostCSS依赖于插件完成实际的工作,例如Lint、变量和混入的支持、未来CSS特性支持(transpile)、内联图片,等等。本节列出常用的插件。

解决全局CSS问题
插件 说明
postcss-use

允许你在CSS中明确声明使用PostCSS特性,这样可以仅针对某些文件使用PostCSS

postcss-modules 可以让你在任何地方使用CSS Modules——自动进行CSS选择器的命名隔离,不仅仅限于客户端
react-css-modules 针对React扩展CSS Modules
postcss-autoreset 条件式的自动重置
postcss-initial 支持 all: initial 规则,以便重置所有继承得到的样式
cq-prolyfill 添加容器查询(container query)支持,允许根据父元素的宽度来决定样式
使用未来的CSS特性
插件 说明
autoprefixer 自动添加厂商相关的规则前缀
postcss-cssnext 支持未来的CSS特性
CSS可读性
插件 说明
precss

提供SASS风格的特性,例如变量、嵌套、混入

postcss-sorting 对规则的内容进行排序
postcss-utilities 包含很多常用的助手工具
short 支持某些属性简写
图像和字体
插件 说明
postcss-assets 管理资产,把样式表和环境改变隔离。可以自动寻找图片的URL、自动生成图片的尺寸
postcss-sprites 生成图片sprites,自动合并多张小图片
font-magician 生成CSS中所有需要的@font-face规则
postcss-inline-svg 支持内联SVG图片并设置样式
postcss-write-svg 支持在CSS中直接写入简单的SVG
语法相关

PostCSS可以转换基于任何语法的样式,不仅仅是CSS

插件 说明
sugarss 类似于SASS的基于缩进的语法
postcss-scss 与SCSS语言一起工作,但是不进行SCSS编译
postcss-less 与LESS语言一起工作,但是不进行LESS编译
postcss-less-engine 与LESS语言一起工作,并且把LESS编译为CSS
postcss-js

支持在JS中编写样式,或者把转换React内联样式、Radium、JSS

postcss-safe-parser 查找并修复CSS语法错误
其它
插件 说明
cssnano 模块化的CSS压缩器
lost 基于calc()的特性丰富的网格系统
使用PostCSS
Webpack

基于postcss-loader:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module.exports = {
    module: {
        loaders: [
            {
                test: /\.css$/,
                // 需要在style、css等加载器之前执行
                loader: "style-loader!css-loader!postcss-loader"
            }
        ]
    },
    postcss: function () {
        // 列出启用的PostCSS插件
        return [ require( 'autoprefixer' ), require( 'precss' ) ];
    }
}
命令行
Shell
1
postcss --use autoprefixer -c options.json -o main.css css/*.css
Webstorm

你需要安装PostCSS support插件,以获得以下特性:

  1. 自动识别.pcss文件
  2. 支持PostCSS语法高亮
  3. 智能的代码完成
  4. 可配置的代码样式和自动格式化
  5. 代码导航支持
  6. 对自定义选择器、自定义媒体查询的支持
设置

如果要对任意.css文件启用PostCSS支持,你可以在Preferences ⇨ Languages & Frameworks ⇨ Stylesheets ⇨ Dialects 把方言切换为PostCSS。

常用插件
Autoprefixer

这是一个必备的插件,可以让你脱离编写厂商特定的规则前缀的苦海。启用该插件后,如果需要编写弹性和子布局,你仅需要:

CSS
1
2
3
#content {
    display: flex;
}

该插件会将其转换为:

CSS
1
2
3
4
5
6
#content {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
}

你可以配置需要支持的浏览器:

JavaScript
1
2
3
4
5
6
require( 'autoprefixer' )( {
    // 仅仅支持支持主流浏览器的最近两个版本
    browsers: [ 'last 2 versions' ]
    // ie 6-8 表示支持IE6-8
    // > 1% 表示支持全球占用率超过1%的浏览器
} )
postcss-cssnext

该插件允许你使用未来版本CSS可能纳入标准的特性,它会将其编译为当前浏览器能够理解的CSS规则。

cssnext已经使用了Autoprefixer,因此不需要明确声明后者。

自定义属性和变量

CSS 的层叠变量的自定义属性规范(CSS Custom Properties for Cascading Variables)允许在CSS中定义属性,并在样式规则中将其作为变量引用。自定义属性以 -- 开头,你可以利用 var() 引用这些属性:

CSS
1
2
3
4
5
6
7
8
9
:root {
    /* 自定义属性 */
    --text-color: black;
}
 
body {
    /* 引用自定义属性 */
    color: var(--text-color);
}

你还可以定义一个属性集,然后通过@apply来应用:

CSS
1
2
3
4
5
6
7
8
9
10
11
12
:root {
    /* 自定义属性集 */
    --danger-theme: {
        color: white;
        background-color: red;
    };
}
 
.danger {
    /* 应用属性集,新增两条样式规则 */
    @apply --danger-theme;
}

你可以在calc()函数中引用属性:

CSS
1
2
3
4
5
6
7
:root {
    --fontSize: 1rem;
}
 
h1 {
    font-size: calc(var(--fontSize) * 2);
}
自定义媒体查询 
CSS
1
2
3
4
5
@custom-media --small-viewport (max-width: 30em);
 
@media (--small-viewport) {
    /* 对于小的viewport应用样式 */
}
媒体查询范围

使用操作符代替min- / max-,让语法更易读:

CSS
1
2
3
4
5
6
7
8
9
@media (width >= 500px) and (width <= 1200px) {
    /* 样式规则 */
}
 
/* 也可以和自定义媒体查询联用 */
@custom-media --only-medium-screen (width >= 500px) and (width <= 1200px);
@media (--only-medium-screen) {
    /* 样式规则 */
}
自定义选择器

CSS 扩展规范(CSS Extensions)允许自定义选择器,你可以创建一个选择器来引用多个既有选择器:

CSS
1
2
3
4
5
@custom-selector :--heading h1, h2, h3, h4, h5, h6;
 
:--heading {
    font-weight: bold;
}

转换后的结果为:

CSS
1
2
3
h1, h2, h3, h4, h5, h6 {
font-weight: bold;
}
样式规则嵌套

样式规则嵌套是非常实用的特性,可以减少重复的选择器声明。它是SASS、LESS等CSS预处理器能够流行的重要原因。

CSS 嵌套模块规范(CSS Nesting Module)中定义了标准的样式规则嵌套方式,cssnext支持这些规范。

规范引入了一种新的嵌套选择器,使用 & 来表示。在嵌套样式规则(nested style rule)中使用该选择器时,它代表当前被匹配的父规则;在其它地方使用该选择器不代表任何东西。

嵌套样式规则具有两种语法:

  1. 直接嵌套,直接编写在其它样式的内部,且规则的组合选择器(compound selector)的第一个必须是嵌套选择器:
    CSS
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    .foo {
        color: blue;
        & > .bar { color: red; }
    }
    /* 转换后 */
    .foo { color: blue; }
    .foo > .bar { color: red; }
     
     
    .foo {
        color: blue;
        &.bar { color: red; }
    }
    /* 转换后 */
    .foo { color: blue; }
    .foo.bar { color: red; }
     
    .foo, .bar {
        color: blue;
        & + .baz, &.qux {
            color: red;
        }
    }
     
    /* 等价于 */
    .foo, .bar { color: blue; }
    :matches(.foo, .bar) + .baz, :matches(.foo, .bar).qux { color: red; }
  2. 嵌套@Rule:这种方式更加灵活,没有嵌套选择器的那些限制:
    CSS
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    .foo {
        color: red;
        @nest & > .bar { color: blue; }
    }
    /* 等价于 */
    .foo { color: red; }
    .foo > .bar { color: blue; }
     
     
    .foo {
        color: red;
        /* & 仍然表示父规则,但是位置随意了 */
        @nest .parent & { color: blue; }
    }
    /* 等价于 */
    .foo { color: red; }
    .parent .foo { color: blue; }
     
    .foo {
        color: red;
        @nest :not(&) { color: blue; }
    }
    /* 等价于 */
    .foo { color: red; }
    :not(.foo) { color: blue; }
颜色操控

color函数可以让颜色操控更加方便,该函数会被编译为rgba:

CSS
1
2
3
4
5
6
7
a {
    color: color(red alpha(-10%));
}
 
a:hover {
    color: color(red blackness(80%));
}

更多的颜色修饰符参考官方。

hwb函数类似于hsl,但是更加易于人类理解,该函数会被编译为rgba:

CSS
1
2
3
body {
    color: hwb(90, 0%, 0%, 0.5);
}

gray函数用于指定灰度颜色 ,该函数会被编译为rgba:

CSS
1
2
3
4
5
6
7
.foo {
    color: gray(85);
}
 
.bar {
    color: gray(10%, 50%);
}

四位或者八位的 #rrggbbaa 格式的颜色代码被支持:

CSS
1
2
3
body {
    background: #9d9c;
}
initial值

cssnext允许任何样式属性取值initial,这个值不是浏览器默认值,而是规定的某个属性的默认值。例如display的默认值总是inline。

你可以使用

JavaScript
1
2
3
div {
    all: initial;
}

把所有属性设置为默认值。

:any-link伪类

该伪类匹配任何具有href属性的a/area/link元素:

CSS
1
2
3
nav :any-link {
    background-color: yellow;
}
:matches伪类

该伪类:

CSS
1
2
3
p:matches(:first-child, .special) {
    color: red;
}
:not伪类

允许该伪类指定多个选择器:

C++
1
2
3
p:not(:first-child, .special) {
  color: red;
}
::伪语法

对于不支持该语法的旧浏览器,自动转换为单个冒号:

CSS
1
a::before {  }
postcss-use

在某个样式类文件中启用PostCSS插件。例如清除CSS代码中的注释:

CSS
1
2
3
4
5
6
7
8
9
10
11
/* 标准语法 */
@use postcss-discard-comments(removeAll: true);
/* 备选语法 */
@use postcss-discard-comments {
    removeAll: true
}
 
/* 这里的注释会被清除 */
h1 {
    color: red
}
short

为某些样式属性提供简写:

CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/* 简写 */
.icon {
    size: 48px;
}
/* 等价于 */
.icon {
    width: 48px;
    height: 48px;
}
 
 
/* 简写 */
.frame {
    /* 第一个是下上,第二个是左右 */
    margin: * auto;
}
/* 等价于 */
.frame {
    margin-right: auto;
    margin-left: auto;
}
 
 
/* 简写 */
.banner {
    position: fixed 0 0 *;
}
/* 等价于 */
.banner {
    position: fixed;
    top: 0;
    right: 0;
    left: 0;
}
 
/* 简写 */
.canvas {
    color: #abccfc #212231;
}
/* 等价于 */
.canvas {
    color: #abccfc;
    background-color: #212231;
}

目前IDE对这些简写的支持不太好,可能误判为语法错误。

← CSS Modules学习笔记
Three.js学习笔记 →

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • CSS3学习笔记
  • Sass学习笔记
  • CSS知识集锦

Recent Posts

  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
  • A Comprehensive Study of Kotlin for Java Developers
  • 背诵营笔记
  • 利用LangChain和语言模型交互
  • 享学营笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
    In this blog post, I will walk ...
  • A Comprehensive Study of Kotlin for Java Developers
    Introduction Purpose of the Study Understanding the Mo ...
  • 背诵营笔记
    Day 1 Find Your Greatness 原文 Greatness. It’s just ...
  • 利用LangChain和语言模型交互
    LangChain是什么 从名字上可以看出来,LangChain可以用来构建自然语言处理能力的链条。它是一个库 ...
  • 享学营笔记
    Unit 1 At home Lesson 1 In the ...
  • K8S集群跨云迁移
    要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题: 各种K8S资源的迁移 工作负载所挂载的数 ...
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 90 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • Bazel学习笔记 37 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • Ceph学习笔记 27 people like this
  • 基于Calico的CNI 27 people like this
  • Three.js学习笔记 24 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • qg on Istio中的透明代理问题
  • heao on 基于本地gRPC的Go插件系统
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
©2005-2025 Gmem.cc | Powered by WordPress | 京ICP备18007345号-2