CSS中class的命名规范

避免以视觉效果来命名类

尽量避免以类的视觉效果来命名:如.half。因为如果使用响应式布局,你的页面会有多种布局来适应多种显示设备的需求。一个元素可能要在台式电脑上占据一半的宽度,但在移动设备上你可能需要它占据全部的宽度.half的语义却把这个元素的宽度定死了:

<div class="row">
  <div class="column half">
    <!-- Your Content -->
  </div>
  <div class="column half">
    <!-- Your Content -->
  </div>
</div>

如果这样命名,那么在移动设备上你就需要用js删除.half类然后增加.full类!

更好的方式是:类名仅描述类的功能,对于那些需要响应式变化的类,我们使用媒体查询,让这个类在不同的环境中做出不同的布局表现。

@media (min-width: 500px) {
    类名 {
        // 窄显示设备下的样式
    }
}
@media (max-width: 500px) {
    类名 {
        // 宽显示设备下的样式
    }
}

以类的功能来命名

类名应该反映这个类的目的类之间的层次结构,而不是布局表现。

BEM 命名方式

BEM 是Block Element Modifier的缩写,它将一个类名分成这三个部分:模块、模块元素、描述符。模块规定整个组件的样式;模块元素规定这个组件中子元素的样式;描述符描述一种特殊的种类,给模块或模块元素增加特别的样式,以表示这个元素处于某种特别的状态(比如说被选中的状态)。

使用BEM的类名清楚地展示了这个类的作用和层次结构关系,并且有效避免了类名重复导致样式覆盖。

BEM的写法

使用__连接模块与模块元素,使用--来连接描述符,如果一个名字由多个单词组成,用单词分隔符-来分割。

// Block (Highest level)
.block {...}

// Element (Descendent of block)
.block__element {...}

// Modifier (Different state or version)
.block--modifier {...}
.block__element--modifier {...}

BEM例子

.person {}
.person__hand {}
.person--female {}
.person--female__hand {}
.person__hand--left {}

看到这个样式表,我们马上可以知道

  • person就是整个部件;
  • person__hand描述person的手(元素);
  • person--female描述person中的女性(一个种类);
  • person--female__hand描述person--female的手(元素);
  • person__hand--left描述person__hand的一个种类:左手。

如果我们不使用BEM:

.person {}
.hand {}
.female {}
.female-hand {}
.left-hand {}
  • 类与类之间的结构不清晰(比如,female到底是放在person的子标签中,还是放在同一个标签中?如果使用BEM,带描述符的类与不带描述符的类就一定放在同一个标签中,见下面的例子)
  • 类名容易重复(比如female可以指不同的动物,如果出现了重名、样式覆盖,会导致动物的样式应用到人身上!)

另一个例子:

<div class="shopping-cart">
  <div class="shopping-cart__item">
    <!-- Your Content -->
  </div>
  <div class="shopping-cart__item shopping-cart__item--selected">
    <!-- Your Content -->
  </div>
</div>

以上例子描述了一个购物车组件的组成:
shopping-cart规定了购物车组件的总体样式;组件中有元素shopping-cart__item,规定了购物车中的商品条目的样式shopping-cart__item--selected表示这是一个特别的商品条目(被用户选中的条目),我们可以给它添加特别的样式,比如红色的边框。

用了这种方式,我们看到类名就可以知道它规定了谁的样式,并且类与类之间的关系也清晰了。


再看一个例子:搜索栏组件
反例:

<form class="site-search  full">
    <input type="text" class="field">
    <input type="Submit" value ="Search" class="button">
</form>

使用BEM以后:

<form class="site-search  site-search--full">
    <input type="text" class="site-search__field">
    <input type="Submit" value ="Search" class="site-search__button">
</form>

这里的site-search--full其实犯了我们开始说的错误:用视觉效果来给类命名,这里应该使用媒体查询而不是用一个类来让搜索栏占满宽度。这个例子仅用来学习使用BEM。

什么时候不必使用BEM

  • 有一些样式是在任何组件中都通用的:
.caps { text-transform: uppercase; }  // 字母大写显示
  • 有一些元素只是碰巧在这个组件中,与这个组件没有什么必然的联系,这个元素可以出现在很多其他的组件,比如:
    我们只需要定义一次网站logo的样式:
.site-logo {}

网站logo可以放在网站的header,footer,任何地方,他不应该作为某一个组件的子元素:

.header {}
.header__logo {}

logo和header没有必然联系,他只是恰好出现在了header中,我们完全可以使用之前定义的.site-logo。假如我们还要在footer中假如logo,难道我们还要定义一个footer__logo吗?这太多余了!

因此我们在使用BEM的时候要考虑清楚:这个元素是这个模块的组成部分吗?还是说这个元素只是恰好出现在这个模块中?如果是后者,不必使用BEM。


参考文章:
http://adamkaplan.me/blog/grid-retrospective
https://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/


补充:对照真实的项目来理解

如果没有项目的体验,确实很难理解BEM的意义。BEM其实就是将类名分成三个部分来描述这个类的作用。微信的样式库也是这么做的,可以对照看看:https://github.com/weui/weui/blob/master/dist/style/weui.css

只用看其中和weui-cell有关的类名就可以了。注意微信的样式库对连接符的使用和我这篇文章讲的有点不一样,一个下划线_后面是描述符,两个下划线__后面的是元素。

感兴趣的话还可以看看他们的DEMO,是如何使用的。


后续我会写更多关于响应式布局的内容。

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

推荐阅读更多精彩内容