1.全局命名空间
所有与设计系统相关的classes都添加一个全局命名空间,这个空间名一般是公司名(company name):
.cn-
2.class前缀
除了添加全局命名空间,给类添加前缀用于表明这个类主要职责是什么,有以下几种常用前缀:
-
c
: 表示UI components,例如.cn-c-card
或者.cn-c-header
-
l
: 表示layout相关的样式, 例如cn-l-grid__item
orcn-l--two-column
-
u
: 表示utilities, 工具, 例如.cn-u-margin-bottom-double
or.cn-u-padding-right
-
is- , has-
: 表示特定的状态, 例如.cn-is-active
or.cn-is-disabled
-
js-
: 表示js特定的功能, 例如.js-modal-trigger
,这种类不能绑定样式,只负责行为方面
3.BEM 语法
BEM 表示 Block-Element-Modifier:
-
Block: 是基本的组件块(component block), 例如
.cn-c-card
or.cn-c-btn
-
Element: 是基本组件块下的子元素, 例如
.cn-c-card__title
-
Modifier: 是组件样式的变种, 例如
.cn-c-alert--error
这种比喻方式很流行,结合命名空间,类前缀,允许我们创建更加显示的,封装性良好的class names.
4.把所有的结合起来: 一个class的解剖
结合全局命名空间,类前缀和BEM语法导致一个显式的(没错,同时也很冗长)类字符串,这能够推断出UI的作用是什么。
看下示例1:
.cn-c-btn--secondary
// 分析
cn-: 设计系统中所有样式的全局命名空间
c-: class的分类, 'c-' 表示 组件
btn: block name(Block)
--secondary: 修饰符,表示样式的变种(Modifier)
示例2:
.cn-l-grid__item
// 分析
cn-: 命名空间
l-: class的分类, 'l-' 表示布局相关
grid: block name(Block)
__item: 元素(Element)
示例3:
.cn-c-primary-nav__submenu
// 分析
cn-: 命名空间
c-: class的分类, 表示组件
primary-nav: block name
__submenu: 元素
5.其他技巧
1.SASS 父选择器
在哪里放置给定的CSS规则是一个问题,假如一个我们想给一个primary navigation组件调节对齐问题,这个primary navigation位于一个header组件中,我们可以使用sass 父选择器:
.cn-c-primary-nav {
/*
* Nav出现在Header,右对齐
*/
.cn-c-header & {
margin-left: auto
}
}
这意味着primary navigation的样式能放在 primary navigation Sass partial中,而不是把它们拆分成对各文件
2.SASS嵌套显式规则
SASS的嵌套十分的方便,但是可能会导致特别长的选择器,有个原则就是:嵌套永远不要超过3层, 保持CSS设计扁平的原则,我们可以通过下面4中途径减少嵌套:
- 给block添加Modifiers(Modifiers of a style block)
- 媒体查询(Media queries)
- 父选择器(parent selectors)
- 状态(states)
组件块修饰符
对于修饰符,如果规则只有几行,修饰符可以嵌套在符元素中:
.cn-c-alert {
border: 1px solid #ccc;
color: gray;
// 错误警告
&--error {
border-color: red;
color: red
}
}
媒体查询
组件特定的媒体查询能够嵌套在组件块里面:
.cn-c-primary-nav {
// 基本样式
@meida all and (min-width: 40em) {
display: flex;
}
}
状态
状态包括 hover, focus, active, 还有工具类 is-, has-
.cn-c-accordion__panel {
overflow: hidden;
max-height: 0;
&.cn-is-active {
max-height: 40em;
}
}
总结
- 原文链接 CSS设计架构
- SASS嵌套选择的规则
- 很详细的一份指导:CSS指南 BEM
- CSS 架构探讨及BEM
- CSS轻设计指导(书)
- BEM命名规范探讨
- 维护设计系统