-
postcss-import:用于导入其他 CSS 可重用模块。注意:虽然用法和看起来都和传统 CSS 的 @import 非常接近,但它们不是一样的东西。最大的差别在于 postcss-import 可以直接引用到位于 node_modules 下的 npm package,这是我们得以在 addon 之间共享资源的基础所在。
因为 addon 和 dummy 是不同的目录结构,因此解析可以 import 的样式规则也略有区别,ui-foundation 保持了绝大多数的引用规则一致,下面这张表格解释了在各种情况下如何引用来自 ui-foundation 提供的样式组件:
项目 | 针对自身 | 针对 dummy 项目 |
---|
ui-foundation | @import "./extends"; | @import "extends"; |
其他 addon | @import "extends"; | @import "extends"; |
其他 app | @import "extends"; | 没有 dummy |
此外,尽管 postcss-import 也能像普通的 @import 一样导入各种样式文件,但是 ui-foundation 不推荐这么做。原因是所有的 postcss 插件其实都是 CSS Modules 技术栈的组成部分,往往引用的第三方样式并不希望把类名本地化,因此会出现出乎意料的副作用。对于第三方样式,比如 normalize.css 等,ui-foundation 都是使用 ember-cli-node-assets 导入的,不和 CSS Modules 技术栈牵扯。
简言之,postcss-import 在 ui-foundation 中的作用主要是引用可复用的 extends(下面介绍),尽可能不要用于其他场合。
-
postcss-nesting:用于实现兼容 CSS 标准的嵌套样式解析。
-
postcss-extend:用于实现类似于 sass 的 placeholder 功能。**注意:placeholder 和 mixin 开起来很像,但它们有本质的不同。mixin 是扩展目标选择符的内容,而 placeholder 则是定义了可共享的内容,扩展 placeholder 的选择符会合并在一起,而不是各自分开。**在实践中,placeholder 适用于固定规则的可重用样式片段,由于它不会复制自身所以非常节省最终样式的尺寸;而 mixin 最大的优点是可以传递变量动态生成不同的内容,但并不适合共享固定规则的样式片段,因为它会不断复制自己。
@import "extends";
.alpha {
color: seagreen;
@extend abs-center;
}
._alpha_15x03s {
display: flex;
justify-content: center;
align-items: center;
}
.alpha {
color: seagreen;
@extend abs-center;
}
.beta {
@extend abs-center;
color: skyblue;
}
._alpha_15x03s, ._beta_15x03s {
display: flex;
justify-content: center;
align-items: center;
}
._alpha_15x03s {
color: seagreen;
}
._beta_15x03s {
color: skyblue;
}
.alpha {
color: seagreen;
@extend abs-center;
}
.beta {
@extend .alpha;
color: skyblue;
}
._alpha_15x03s, ._beta_15x03s {
display: flex;
justify-content: center;
align-items: center;
}
._alpha_15x03s, ._beta_15x03s {
color: seagreen;
}
._beta_15x03s {
color: skyblue;
}
.alpha {
@extend abs-center;
}
.alpha:first-child {
color: seagreen;
}
.alpha a:active {
color: skyblue;
}
.beta {
@extend .alpha;
}
._alpha_15x03s, ._beta_15x03s {
display: flex;
justify-content: center;
align-items: center;
}
._alpha_15x03s:first-child, ._beta_15x03s:first-child {
color: seagreen;
}
._alpha_15x03s a:active, ._beta_15x03s a:active {
color: skyblue;
}
ui-foundation 包含的 extends.css 是一个定义 placeholder 的例子,有两种定义方法:
@define-extend placeholder {
}
.alpha {
@extend placeholder;
}
%placeholder {
}
.alpha {
@extend %placeholder;
}
它们的区别主要是:后者拥有前者所有的特性,同时,后者可以1)定义可以晚于使用;2)后者可以重复扩展,也就是用 placeholder 去扩展 placeholder,从而构造组合片段;3)定义和引用的时候名字前面必须有 %
符号;4)可以在嵌套规则内定义和使用,比如 @media
内等等。因此,ui-foundation 推荐一般使用第二种定义方法。
-
post-css-variables:用于定义 CSS 变量。注意:因为我们需要跨项目的共享/覆盖变量设置,因此 ui-foundation 的 CSS 变量不是写在 .css 文件里,而是写在构建脚本的配置项里。defaults.js 提供的是这些变量的默认值,在其他 addon/app 里增加/覆盖它们的方法在安装说明部分有更具体的描述。
.alpha {
color: var(--primary);
}
.alpha {
color: seagreen;
}
.alpha {
--primary: skyblue;
color: var(--primary);
--secondary: lightgray;
background-color: var(--secondary);
}
.alpha {
color: skyblue;
background-color: lightgray;
}
-
postcss-custom-media:用于自定义媒体查询规则。ui-foundation 预置了一些常用的媒体查询规则,你可以选择覆盖或是添加新的规则(参见后面的自定义配置部分)。下面是一些示例:
@media (--mobile) {
}
@media (--over-mobile) {
}
@media (--tablet) {
}
@media (max-width: 425px) {
}
@media (min-width: 426px) {
}
@media (max-width: 768px) and (min-width: 426px) {
}
-
postcss-media-minmax:用于支持 CSS Media Queries Level 4 的新语法,例如:
@media screen and (width >= 500px) and (width <= 1200px) {
}
@media screen and (min-width: 500px) and (max-width: 1200px) {
}
ui-foundation 预置的媒体查询规则是由此插件和 postcss-custom-media 配合定义的。
-
postcss-calc:用于对 calc()
函数进行预求值,例如(更多例子):
body {
font-size: var(--main-font-size);
}
h1 {
font-size: calc(var(--main-font-size) * 2);
height: calc(100px - 2em);
margin-bottom: calc(var(--main-font-size) * 1.5);
}
body {
font-size: 16px
}
h1 {
font-size: 32px;
height: calc(100px - 2em);
margin-bottom: 24px
}
-
postcss-short:用于转换一些常用的缩写形式,具体用法可以参见插件文档。
-
postcss-clearfix:用于将 clear: fix;
规则转换为清除浮动的最佳实践规则。
-
postcss-fallback:提供 fallback 函数,用于优雅降级,例如:
.foo {
display: fallback(flex, inline-block);
width: fallback(45vh, 450px);
background-color: fallback(rgba(0, 0, 0, 0.5), #555555);
foo: fallback(bar, baz, qux, corge);
}
.foo {
display: inline-block;
display: flex;
width: 450px;
width: 45vh;
background-color: #555555;
background-color: rgba(0, 0, 0, 0.5);
foo: corge;
foo: qux;
foo: baz;
foo: bar;
}
-
postcss-color-function:用于支持 CSS 颜色转换函数,例如:
body {
background: color(red a(90%))
}
body {
background: rgba(255, 0, 0, 0.9)
}
该插件支持很多种颜色相关的转换函数,具体用法可以参见插件文档。
-
postcss-merge-rules:很多 PostCSS 插件会生成分散的样式规则,比如说:
.alpha {
color: seagreen;
@extend %abs-center;
}
._alpha_15x03s {
display: flex;
justify-content: center;
align-items: center;
}
._alpha_15x03s {
color: seagreen;
}
这个插件的作用就是将这样的结果合并起来,提高可阅读性并减少文件体积。其最终结果是:
._alpha_15x03s {
display: flex;
justify-content: center;
align-items: center;
color: seagreen;
}
-
postcss-discard-empty:用于剔除空的样式声明。空声明主要来自于嵌套语法,比如说:
.parent {
&-alt { }
& .child { }
}
.parent {}
.parent-alt { }
.parent .child { }
-
postcss-discard-comments:用于剔除 CSS 注释。如果有想要在最终结果中保留的注释,可以这样写:
-
postcss-discard-duplicates:用于合并重复的样式声明,比如:
h1 {
margin: 0 auto;
margin: 0 auto
}
h1 {
margin: 0 auto
}
h1 {
margin: 0 auto;
}