【问题标题】:How to specify state with BEM?如何用 BEM 指定状态?
【发布时间】:2016-08-21 04:22:42
【问题描述】:

使用 BEM CSS 类语法,假设我有一个具有以下类的元素:

...
<div class="purchase__module2__heading__tooltip">...</div>
...

现在假设有一个事件或某事使这个“工具提示”变得活跃或可见。用 BEM 表达这一点的正确方法是什么?我是否替换了当前类,所以现在它变成了:

...
<div class="purchase__module2__heading__tooltip--active">...</div>
...

或者我添加它

...
<div class="purchase__module2__heading__tooltip purchase__module2__heading__tooltip--active">...</div>
...

或者我可以做一些简单的事情吗:

...
<div class="purchase__module2__heading__tooltip active">...</div>
...

我认为答案是 #2,但似乎很冗长。 #3 很好很简单,但我不知道这是否遵循正确的 BEM 准则。

【问题讨论】:

  • BEM 中的深度嵌套表明您没有正确减少块。

标签: html css bem


【解决方案1】:
【解决方案2】:

如果您要修改块或元素,则还必须包含基类。

例如

<div class="block">
  <div class="block__element">...</div>
</div>

可以将块修改为:

<div class="block block--modifier">
  <div class="block__element block--modifier__element">...</div>
</div>

或将元素修改为:

<div class="block">
  <div class="block__element block__element--modifier">...</div>
</div>

在任何一种情况下,您都开始需要使用多个类。


查看您的示例:

<div class="purchase__module2__heading__tooltip">

很明显,您嵌套得太深,使您无法重用大部分代码。

鉴于您使用的名称,我猜您实际拥有的是:

  • 购买模块(.purchase-module)
    • 带有标题 (.purchase-module__heading)
  • 工具提示 (.tooltip)

标记可能类似于:

<article class="purchase-module">
  <h1 class="purchase-module__heading">
    ...heading text...
    <span class="tooltip">...</span>
  </h1>
</article>

注意现在激活工具提示只需要更改一个简短的类:

<span class="tooltip tooltip--active">...</span>

这就是 BEM 的理想选择。

【讨论】:

  • 谢谢。这似乎太笼统了......我担心我可能在其他地方有一个.tooltip,它需要与此工具提示完全不同的样式,所以我必须覆盖.tooltip 的样式。或者我会为样式使用经过测试的选择器吗?前任。 .purchase-module .tooltip ?
  • 如果你害怕重复使用样式,那你就错了。如果他们需要不同的风格,他们就是不同的东西,需要不同的名字。如果您使用 BEM,则不应使用 .purchase-module .tooltip 之类的选择器。
  • @JakeWilson,这样想吧。想象一下,你创建了一个car,然后你需要另一个,但它必须携带一堆东西,其中一半需要平放才能携带东西。您无需更改car,而是创建了truck。对于共享的内容,您可以重构cartruck 扩展vehicle。所有这些都可以使用 CSS 预处理器来完成。
  • 好的,我试着理解你所说的话。因此,对于 BEM,您应该针对某事使用单个选择器,对吗?没有像.purchase-module .tooltip 这样的嵌套选择器。好吧,回到我原来的观点,如果我在页面上有多个.tooltip,如果我不使用嵌套选择器怎么办?将.tooltip 类名更改为更具体的名称?感谢您的帮助
  • @JakeWilson,鉴于我在维护继承项目方面的经验,我只能告诉你什么对我最有效。在某些时候,您将不得不自己决定,但请记住,当您需要进行更改或修复错误时,您希望在六个月内让您的生活更轻松。我建议仅对状态使用修饰符,并且通过扩展块更好地服务于主题。你不必相信我,事实上我会鼓励你自己尝试一下。归根结底,这是您的选择。
猜你喜欢
  • 2019-02-28
  • 2020-11-23
  • 2010-11-09
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多