使用 BEM 时命名包装器元素类

Posted

技术标签:

【中文标题】使用 BEM 时命名包装器元素类【英文标题】:Naming A Wrapper Element Class When Using BEM 【发布时间】:2015-09-23 13:31:51 【问题描述】:

我知道在使用 BEM 时,类名不应该直接反映 html 结构,但是应该如何命名包装器元素? 请忽略我的特殊语法(接近SUIT);它仍然遵循 BEM,只是用不同的方式来区分元素。

例如:

<div class="?">
  <footer class="PageFooter">
    <h4 class="PageFooter-brand>…</h4>
    <ul class="PageFooter-contactDetails">…</ul>
  </footer>
<div>

我目前将这个实例中的包装器归类为PageFooterWrapper,但这感觉很笨拙,因为包装器不是独立的——它纯粹为PageFooter 而存在。显然,用PageFooter- 为所有内容添加前缀是荒谬的,因此只剩下将包装器视为PageFooter 的一部分:PageFooter-wrapper。这让我很恼火,因为这有一个隐含的建议。

那么包装器的类应该是什么?

【问题讨论】:

既然
本身就代表一个容器或包装器,为什么还需要围绕
的包装器?
@Rob 别那么迂腐。这是为问题制作的示例。 一点也不迂腐。这是一个明显比你更有经验的人的技术观察。它有什么用途? @Rob 下次我表现得像个笨蛋时,我会记得将其称为“技术观察”。 你的推理是不正确的,好像你的例子代表了一些典型的东西。不是,我试图指出这一点,但我会留给你。 【参考方案1】:

我一直对待它的方式是包装器应该始终是块,所以:

<div class="PageFooter">
  <footer class="PageFooter-inner">
    <h4 class="PageFooter-brand">...</h4>
    <ul class="PageFooter-contactDetails">...</ul>
  </footer>
</div>

B锁包含E元素,所以我的B锁周围没有任何东西,我只是跟着Ement 原则并开始使用inner's 而不是容器

【讨论】:

谢谢。这是有道理的,尽管我认为我不喜欢包装器现在是类的***元素这一事实。包装器是布局更改时很容易变得不需要/需要的东西的完美示例,因此像这样将它耦合到页脚对我来说是错误的。通过将其视为子元素,可以轻松将其删除而不会影响其他任何内容。简而言之,您使页脚的独立性和便携性大大降低。 如果是这种情况,那么您可能会争辩说包装器不是特定于PageFooter 它特定于它周围的内容,因为它基于它周围事物的布局。因此,将它们解耦并将包装器绑定到站点的布局而不是 PageFooter? 可能是有意义的 是的。这正是我要解决的问题。它应该是容器的子元素,而不是页脚的一部分。我经常将元素视为带有子元素插槽的布局容器,所以我认为这实际上只是它的一种变体。 对于像 Foundation/Bootstrap 附带的容器、行、列之类的东西,我倾向于将它们作为自己的实体,它们通常非常通用,所以我不需要 @987654325 @ 特定容器。如果您在 React 构建组件的所有方式中都玩过,那么它们似乎与我倾向于处理基于 BEM 的 CSS 的方式非常接近 刚开始玩 React,你是对的。两者相得益彰。【参考方案2】:

我实际上已经成功使用了两个类,我的模式如下:

<div class='page-section bem-block'>
    <div class='bem-block__element'>
        <!-- etc etc -->
    </div>
</div>

有效地使用utility class 来执行某些包装功能。 css 可能与此类似:

.page-section 
    width: 100%;

@media screen and (min-width: 1200px) 
    margin: 0 auto;
    width: 1200px;

我发现这在实践中效果很好。 .bem-block 也有可能继承自 .page-section

此解决方案补充了 Dan Gamble 的解决方案。

【讨论】:

以上是关于使用 BEM 时命名包装器元素类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 BEM 正确设置元素的范围?

命名 BEM 子块 [重复]

NamedPipeServerStream/NamedPipeClientStream 包装器

BEM命名规范

BEM---前端css命名规范

我使用的Bem的习惯