如何在大型模块中处理BEM



我正在使用BEM进行我的第一个项目。我很喜欢它,但有一件事我无法想象:更大模块的嵌套解决方案。我搜索了很多关于这方面的内容,在stackoverflow上有很多主题,但这些例子都很明显。在"现实"世界中,并不是所有的东西都可以看作是独立的模块。

例如:我正在构建一个大的时间线模块。它由一个时间线栏组成,其中包含项目符号和标签。每个项目符号都有一个文章块,它本身由一个图像、一个标题、一个副标题和一个链接组成。

BEM代码对我来说效率很低:

timeline
timeline__bar
timeline__bullet
timeline__label-year
timeline__label-month
timeline__article
timeline__article-image
timeline__article-title
timeline__article-subtitle
timeline__article-link

现在我明白了,我可以将其分为不同的子模块。如下所示:

timeline
timeline__bar
timeline__bullet
timeline__label-year
timeline__label-month
timeline__article  article
article__image
article__title
article__subtitle
article__link

但只有当文章是自己的"东西"时,这才是相关的。但在我的情况下,这是一篇只针对具体时间线的文章。"article"这个名字太通用了。

我也可以这样做:

timeline
timeline__bar
timeline__bullet
timeline__label-year
timeline__label-month
timeline__article  timeline-article
timeline-article__image
timeline-article__title
timeline-article__subtitle
timeline-article__link

但这感觉也不对,因为命名接缝太混乱了。这种情况下的最佳做法是什么?

非常感谢。

在BEM中,真的不应该有像"大模块"这样的东西。你应该把你的模块分成更小的部分,这样它们就可以在其他地方重复使用。您分别使用articletimeline的示例很好。

BEM的难点实际上是命名事物。虽然article是通用的,但timeline-article可能更好,但它很长。你要么想出更好的办法,要么就选择长的。

或者,您可以尝试使用修饰符。如果timeline中的article与内部的article略有不同,比如blogpost,他们会尝试:http://getbem.com/faq/#block-修改器影响元素

我在学习BEM时也遇到了同样的问题。不幸的是,大多数示例都有简单的块,如page-headerblock

如果您觉得处理模块太麻烦,可以使用@import将模块分解成更小的部分。例如,为了获得良好的参考,请查看Chris Coyier的Codepen的CSS帖子。

至于你选择的首选命名约定,我会选择第二种(即timeline__article__),但你只需要随机应变。

为了解决效率问题,您是否将BEM与SASS伪嵌套一起使用?这将使BEM命名法的编写变得更加容易。

说到结构化CSS,我还建议查看Harry Robert的ITCSS。

吸收了上面的几个链接让我爱上了写CSS。。。

最新更新