CSS 架构之 BEM

CSS 架构之 BEM

系列文章

目录

  • 遇到的问题
  • 解决的办法
  • Block, element, modifier
  • Sass 和 BEM
  • 总结

遇到的问题

我们知道 CSS 只有一个作用域,无论你通过什么选择器去操作样式,一旦你声明一个选择器,它就是全局的,如果项目复杂,维护人必须小心意义,因为你一不小心可能就会影响到其他元素,代码的维护性很差,而且 CSS 代码的可读性也不行。

浏览器曾短暂通过 scope 字段支持 CSS 作用域,:scope 伪类就是曾经遗留的证据。

但是项目中我们总是希望编写可读性强且易于维护的 CSS 代码,我们应该寻找一种方法来解决它。

PS:上面这个讨论前置条件是传统网页开发,因为现在的 CSS 模块方案,通过将样式范围限定到组件模板作为标准,在很大程度上解决了这个问题。这意味着您无需担心一个组件中的类会影响另一个组件的样式——即使您使用相同的类名。

解决的办法

首先我们要意识到无论多复杂的网站,它都是有结构的,我们都可以对他进行分解,比如:

小爱同学

我们把网站分为 head、body、foot 三部分,同时在 head 里面继续划分 logo、menu。

其实这种分解很像语义化的 HTML 标签。

好了,我们借助网站的结构,进行分解,找到了避免样式代码混乱的方法。

现在只要耐心的细分就能理清网站的结构,那我们怎么让它体现在代码上呢——BEM。

Block, element, modifier

根据上面的思想,由 Yandex 团队提出的一种 CSS 命名方法论 BEM

首先 BEM 是一个分层系统,它把我们的网站分为三层,这三层正好对应着 BEM 三个英文单词的简写 block, element, modifier,分为为 块层、元素层、修饰符层

让我们来看看 BEM 构建的网页样式

Block:您希望将样式范围限定到的 HTML 块

.block {
}

Element:该块内的任何元素,名称与您的块名称隔开

.block__elementOne {
}

.block__elementTwo {
}

Modifier:用于修改现有元素样式的标志,无需创建单独的 CSS 类

.block__elementOne--modifier {
}

下面是 HTML 结构:

<section class="block">
  <p class="block__elementOne">This is an element inside a block.</p>
  <p class="block__elementOne block__elementOne--modifier">This is an element inside a block, with a modifier.</p>
</section>

你会发现我们的类名不知不觉暗合了 OOCSS 的思想。

BEM 体现到代码上,我们需要遵循三个原则:

  • 使用__两个下划线将块名称与元素名称分开
  • 使用--两个破折号分隔元素名称及其修饰符
  • 一切样式都是一个类,不能嵌套

根据这个原则,它的经典写法就是这样的:

block-name__element-name--modifier-name--modifier-value

我们可以翻译上面的案例,得出以下实战代码:

<section class="container">
  <p class="container__paragraph">This is a paragraph inside a container.</p>
  <p class="container__paragraph container__paragraph--bold">
    This is a paragraph inside a container, with a modifier that adds bold styling.
  </p>
</section>

Sass 和 BEM

使用 CSS 预处理器,我们都喜欢将嵌套作为范围定义样式,如果你想严格遵守 BEM 不准嵌套的原则,您可以以嵌套格式进行创作,使用@at-root 获得非嵌套的 CSS,:

.block {
  @at-root #{&}__element { }
  @at-root #{&}--modifier { }
}

得到:

.block {}
.block__element {}
.block--modifier {}

总结

我们回顾了传统网站,因为 CSS 只有一个作用域导致样式代码维护性和可读性极差,然后我们借助网站的结构对其分层,抽象总结出来了 BEM 这个方法论。

我想大多数人都觉得 BEM 的破折号和下划线看起来很奇怪,所以真是项目中很少有严格遵守 BEM 规范的 CSS 代码出现,往往大家都是接受 BEM 的核心思想然后通过短横线来连接这种命名规范,比如:head-input-search

参考

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

推荐阅读更多精彩内容

  • [规范]css BEM书写规范 BEM是基于组件的web开发方法。其思想是将用户界面分隔为独立的块,从而使开发复杂...
    Maco_wang阅读 973评论 0 1
  • BEM 基于组件方式的web开发方法,基本思想是将用户界面分成独立的模块。 Block(块) (通常指模块,组件)...
    mocobk阅读 3,872评论 0 1
  • 什么是BEM BEM是Block(块)、Element(元素)、Modifier(修饰符)的简写,是一种组件化的 ...
    前白阅读 513评论 0 1
  • BEM 基于组件方式的web开发方法,基本思想是将用户界面分成独立的模块。 Block(块) 通常指模块,组件 B...
    xwwawj阅读 936评论 0 2
  • BEM是块(block)、元素(element)、修饰符(modifier)的简写,由 Yandex 团队提出的一...
    一代码农1970阅读 2,385评论 0 1