CSS设计 命名规范 BEM

1.全局命名空间

所有与设计系统相关的classes都添加一个全局命名空间,这个空间名一般是公司名(company name):

.cn-

2.class前缀

除了添加全局命名空间,给类添加前缀用于表明这个类主要职责是什么,有以下几种常用前缀:

  1. c: 表示UI components,例如 .cn-c-card 或者 .cn-c-header
  2. l: 表示layout相关的样式, 例如 cn-l-grid__item or cn-l--two-column
  3. u: 表示utilities, 工具, 例如 .cn-u-margin-bottom-double or .cn-u-padding-right
  4. is- , has-: 表示特定的状态, 例如 .cn-is-active or .cn-is-disabled
  5. 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中途径减少嵌套:

  1. 给block添加Modifiers(Modifiers of a style block)
  2. 媒体查询(Media queries)
  3. 父选择器(parent selectors)
  4. 状态(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;
  }
}

总结

  1. 原文链接 CSS设计架构
  2. SASS嵌套选择的规则
  3. 很详细的一份指导:CSS指南 BEM
  4. CSS 架构探讨及BEM
  5. CSS轻设计指导(书)
  6. BEM命名规范探讨
  7. 维护设计系统
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容