我正在使用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中,真的不应该有像"大模块"这样的东西。你应该把你的模块分成更小的部分,这样它们就可以在其他地方重复使用。您分别使用article
和timeline
的示例很好。
BEM的难点实际上是命名事物。虽然article
是通用的,但timeline-article
可能更好,但它很长。你要么想出更好的办法,要么就选择长的。
或者,您可以尝试使用修饰符。如果timeline
中的article
与内部的article
略有不同,比如blogpost
,他们会尝试:http://getbem.com/faq/#block-修改器影响元素
我在学习BEM时也遇到了同样的问题。不幸的是,大多数示例都有简单的块,如page-header
或block
。
如果您觉得处理模块太麻烦,可以使用@import
将模块分解成更小的部分。例如,为了获得良好的参考,请查看Chris Coyier的Codepen的CSS帖子。
至于你选择的首选命名约定,我会选择第二种(即timeline__
和article__
),但你只需要随机应变。
为了解决效率问题,您是否将BEM与SASS伪嵌套一起使用?这将使BEM命名法的编写变得更加容易。
说到结构化CSS,我还建议查看Harry Robert的ITCSS。
吸收了上面的几个链接让我爱上了写CSS。。。