如何更好的使用BEM

BEM是由Yandex团队提出的一种CSS Class 命名方法,旨在更好的创建CSS/Sass模块。他需要遵循一些特殊规定,有些人认为这些规定很冗余,但是我发现他们对于理解DOM有着很大的帮助。你可以去查看我之前的文章去了解为什么BEM如此伟大。或者你可以去查看这几篇中文文章来了解BEM(《BEM的定义》《为什么我们需要BEM》)。今天这篇文章,是我在假设你对BEM和Sass已经有所了解甚至熟悉的基础上完成的。
BEM又丑又傻?
许多人认为BEM是一种多余的,丑陋的长命名。我完全能够理解当你在使用一种臃肿的和过度描述的命名方式时会发出这样的抱怨。这种情况下你会发现Sass编译后的CSS会非常的冗余和丑陋,尤其是当你在很长的BEM命名内又嵌套了更长的BEM命名时。这简直是非常糟糕和令人沮丧的一件事。

.aboutSection { background-color: tomato;}
.aboutSection__wrapper { 
  max-width: 108rem; padding: 3rem 0;
}
.aboutSection__headingContainer { 
  background-color steelblue; 
  .aboutSection__header { font-size: 2.4rem; font-weight: 700; }       
  .aboutSection__subHeader { font-size: 1.8rem; color: green; }
}

可能很多刚开始使用BEM的程序员会写出像上面一样的CSS/Scss代码。虽然手指已经很酸痛了但是还是每次都兢兢业业地输入完整的类名。我完全能够理解这时你会感觉BEM是一种很傻很多余的命名规则。我们在不断的重复自己来为不同的类名设置不同的样式,而且不具有可重复性。
在Sass中使用BEM
灵活的&__

通过使用一组便利的选择器和运算符,我们可以使得BEM出类拔萃。其中最重要的是新加入Sass中的&
选择器
.在声明内&
选择器会直接引用他的父选择器。当嵌套使用'&'时,它会直接抓取父选择器的类名。因为我们的类名遵循真正可靠的模式,所以我们可以把它作为我们的优势来打造真正可读的代码。

.aboutSection { 
  &__wrapper { max-width 108rem; padding: 3rem 0; } 
  &__headingContainer { background-color: steelblue; } 
  &__header { font-size: 2.4rem; font-weight: 700; } 
  &__subHeader { font-size: 1.8rem; color: green; }
}

以上这段代码就是一个利用&
选择器的BEM创建的Sass模块,这个模块看上去像是嵌套但并不会带来嵌套所造成的权重差异等问题。这将有效帮助你避免CSS文件中组件样式的冲突。同时采用Sass的嵌套选择器也使我们的代码更加直观可读。
强大的@extend

我们可以进一步使用@extend
来改进我们的BEM。BEM允许我们在类的最后添加一个修饰符,当以纯CSS编写样式时,就需要你给同一个元素两个类的标记,比如:

<nav class="nav"> 
  <ul class="nav__container"> 
    <li class="nav__item"></li> 
    <li class="nav__item"></li> 
    <li class="nav__item"></li> 
    <li class="nav__item nav__item--active"></li> 
  </ul>
</nav>

以上这种情况是令人很沮丧的,为什么我们需要添加一个又长又绕的类来说明这个元素是active
的?为什么我们不能仅仅增加一个名为active
的类?通过使用@extend
指令,我们就可以很好地消除这种冗余。

.nav { 
  background-color: steelblue; 
  &__container { display: flex; justify-content: space-between; } 
  &__item { 
    color: white; 
    &--active { @extend .nav__item; border-bottom: 1px solid red; } 
  }
}

@extend
指令能让我们确保所选择的项目也具有nav_item
类中的所有样式,从而清除HTML中的nav_item
标记。使用这种方法,我们能够随心所欲地改变活动状态的颜色,而无需重写我们之前创建的样式。在我看来,一个元素应该只有一个类,我们应该活用Sass来达到我们想要的结果。
结束语
我希望这篇文章能够使你相信尽管BEM的好处远远超过它的那点瑕疵。也许有人会告诉你相反的结果,也许在一开始你会觉得它很冗余,但是通过BEM,我们CSS文件中所有选择器都保持相似的特异性水平。当我们使用'&'选择器时我们可以在保持有很好的组织性和可读性的同时避免嵌套带来的样式冲突。通过使用@extend
指令,我们不仅可以消除BEM命名的冗余,而且可以修剪下来你的标记。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。原文: http://www.w3cplus.com/preprocessor/getting-sass-y-with-bem.html © w3cplus.com

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

推荐阅读更多精彩内容