BEM - 如何处理网格和内容的块交集

时间:2014-10-23 08:09:29

标签: css bem

我考虑用这样的BEM树构建一个网格:

  • grid__row
  • grid__column基
  • grid__column

还有像这个预告块

这样的内容
  • 挑逗
  • teaser__thumbnail
  • teaser__headline
  • teaser__body
  • teaser__link

如果我想在网格的不同列中显示预告元素,则会引导我进入以下标记:

    <div class="grid__column-group teaser">
      <div class="grid__column">
        <img class="teaser__thumbnail"/>
      </div>
      <div class="grid__column">
        <h3 class="teaser__headline">...</h3>
        <p class="teaser__body">..</p>
      </div>
    </div>

我刚刚从BEM开始,这只是感觉有缺陷,因为不同块的样式会相互影响。

这是正确的处理方式吗? 有什么建议可以提供更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

  

这是正确的处理方式吗?

是。这是一个混合。官方教程uses this technique

在CSS代码中,首先设置所有“可视”块(如grid)的样式,然后设置语义块(如teaser)。因为语义块更具体,可以从可重用的视觉模式中覆盖一些默认规则。

答案 1 :(得分:1)

您所做的事情并不正确,但我会将每个组件的职责分开。在我看来,页面网格的职责是将组件放在页面上,但不需要在组件中定位元素。

分离

重要的是始终以完全隔离的方式构建组件。组件不应该了解其容器或依赖它。您应该能够将组件放在任何页面上,任何位置,并且可以正确呈现。这是这项技术的重点之一。

单一责任

通过查看您的标记,您的teaser组件似乎需要了解grid才能正确呈现。我会尽量避免这种情况,并在组件本身中包含组件所需的布局。它实际上看起来像Nicole Sullivan的经典media object,所以值得一看。这符合组件应该承担单一责任的原则。 grid定位页面上的组件以及组件的位置和样式。

通过这样做,teaser组件现在可以在任何地方使用,无论是否有grid