我的一位同事在他主持的项目中大力推动CSS的BEM(块元素修改器)方法,而我只是无法理解是什么使它比我们多年来编写的LESS CSS更好。
BEM是一种CSS方法。其他包括OOCSS和SMACSS。这些方法用于编写模块化,可扩展,可重用的代码,这些代码可以很好地执行。
LESS是CSS预处理程序。其他包括Sass和Stylus。这些预处理器用于将其各自的源转换为扩展的CSS。
BEM和LESS彼此之间没有“更好”的可比性,它们是服务于不同目的的工具。您不会说螺丝刀比锤子要好,除非考虑使用实用程序来解决特定问题。
他声称“性能更高”。
需要在以下经典CSS样式之间衡量性能:
.widget .header
和BEM风格:
.widget__header
但是一般来说,CSS选择器的性能并不是瓶颈,并且不需要进行优化。
BEM的“性能”通常与开发人员的性能编写代码有关。如果始终如一地正确使用BEM方法,则对于开发人员来说,很容易同时编写不同的模块而不会发生样式冲突。
他声称具有“可读性”和“重用性”。
我不知道我会告诉新开发人员BEM更具可读性。我可以说它为类的含义和结构提供了一些定义明确的指南。
看到像
.foo--bar__baz
告诉我,状态中存在一个foo
块,bar
其中包含一个baz
元素。
我绝对会说BEM比经典模型更可重用。
如果两个开发人员创建了块(foo
和bar
),并且两个块都具有标题,则他们可以在不同的上下文中安全地重用其块,而不必担心命名冲突。
这是因为,在经典情况下,这可能会发生冲突,.foo .heading
并.bar .heading
可能会根据具体情况引入需要解决的特异性冲突。
在BEM站点中,这些类将是.foo__heading
和.bar__heading
,它们永远不会冲突。
他声称“嵌套CSS是一种反模式”。“反模式”到底是什么意思,为什么嵌套CSS不好?
“反模式”是一种编码模式,对于没有经验的开发人员而言,它比更合适的替代方法更容易学习和使用。
至于嵌套CSS不好的原因:嵌套可以提高选择器的特异性。特异性越高,花费的精力越多。没有经验的开发人员经常担心他们的CSS可能会影响多个页面,因此他们使用如下选择器:
#something .lorem .ipsum .dolor ul.sit li.amet a.more
当有经验的开发人员担心他们的CSS 可能不会影响多个页面时,他们使用如下选择器:
.more
他声称“每个人都在使用BEM,因此我们也应该这样做。”
那是一个流行的谬误,因此请忽略它作为一个不好的论点。不要陷入谬论谬误的陷阱,因为支持BEM的错误论据并不能成为认为BEM不好的理由。
有人可以详细解释什么使BEM优于LESS吗?
我之前已经讲过,BEM和LESS不可比。苹果和橘子等
我的同事完全无法说服我,但是我不知道我是否只能选择跟随。
我建议看一下OOCSS,SMACSS和BEM,并权衡每种方法的优缺点... 作为一个团队。我之所以使用BEM,是因为我喜欢BEM格式上的严格性,并且不介意丑陋的选择器,但是我无法告诉您什么适合您或您的团队。不要让一个直率的人来主持这个节目。如果您对BEM不满意,请注意,还有其他替代方案可能会更容易为您的团队提供支持。您可能需要与同事捍卫自己的职位,但长期而言,这可能会对您的项目成果产生积极影响。
我真的很希望能够欣赏BEM,而不是勉强地接受它。
我在StackOverflow上写了一个答案,描述了BEM的工作方式。要了解的重要一点是,理想的选择器应具有的特殊性,0-0-1-0
以便易于覆盖和扩展。
选择使用BEM并不意味着您需要放弃LESS!您仍然可以使用变量,仍可以使用@imports,当然可以继续使用嵌套。不同之处在于您希望呈现的输出成为单个类,而不是后代链。
你可能曾经在哪里
.widget {
.heading {
...
}
}
使用BEM,您可以使用:
.widget {
&__heading {
...
}
}
此外,由于BEM围绕各个块进行,因此您可以轻松地将代码分成单独的文件。widget.less
将包含该.widget
块的样式,而component.less
将包含该.component
块的样式。尽管您可能仍希望使用源映射,这使查找任何特定类的源变得更加容易。