ui-foundation 是整个 choice-ui 套件的根本基础组成,它为其他 ui 组件以及最终的应用程序提供最不可缺少的基本样式系统和编写样式需要用到的工具集合、变量、可重用模块定义等等;同时它也提供了诸如 normalize.css 之类的基础第三方资源(可选)。
-
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;
}