【问题标题】:Does everything that has CSS attached in BEM need a class name?在 BEM 中附加了 CSS 的所有东西都需要类名吗?
【发布时间】:2018-07-01 06:27:50
【问题描述】:

由于人们仍然建议将 BEM 用于大型项目,我想我可以试一试。但是我已经通过设置页面的header-元素遇到了问题。


这是页面标题现在的样子:

<header class="header">
    <img class="header__logo" src="logo.png" alt="alt">

    <button class="header__button-toggle" type="button">Open menu</button>

    <nav class="header__nav" role="navigation">
        <ul>
            <li><a href="">Nav item A</a></li>
            <li><a href="">Nav item B</a></li>
            <li><a href="">Nav item C</a></li>
        </ul>
    </nav>
</header>

我了解如何定义简单元素,例如 header__logoheader__button-toggle


但是,当涉及到nav-元素时,我不确定该怎么做。 HTML 不会改变,因为这是一种常见且得到广泛认可的模式,我猜 5 年后会保持不变。

现在我不仅需要将样式应用于nav 元素,还需要将样式应用于ullia 元素。我该怎么做?

我会在 Less 中这样做:

.header {
    &__nav {
        property: value;

        ul { property: value; }
        li { property: value; }
        a { property: value; }
    }
}

但这在 BEM 中有效还是 BEM 想要消除的?


我必须以这样的方式结束吗?

.header {
    &__nav {
        property: value;

        &__list { property: value; }
        &__item { property: value; }
        &__anchor { property: value; }
    }
}

这让 HTML 非常混乱:

<nav class="header__nav" role="navigation">
    <ul class="header__nav__list">
        <li class="header__nav__item">
            <a class="header__nav__anchor" href="">Nav item A</a>
        </li>
        <li class="header__nav__item">
            <a class="header__nav__anchor" href="">Nav item B</a>
        </li>
        <li class="header__nav__item">
            <a class="header__nav__anchor" href="">Nav item C</a>
        </li>
    </ul>
</nav>

也许有人可以帮助我理解,如何根据 BEM 正确解决这个问题。

【问题讨论】:

标签: css less bem


【解决方案1】:

是的,您应该为需要在 CSS 中处理的每个元素分配一个类(请参阅:https://en.bem.info/methodology/html/#binding-blocks-to-a-dom-node)。而且你不应该害怕标记中的额外字节,因为 gzip 会很好地压缩它。

但你应该避免元素的元素(请参考:https://en.bem.info/methodology/faq/#can-i-create-elements-of-elements-block__elem1__elem2进行推理)。

所以正确的标记应该是这样的:

<nav class="header__nav nav" role="navigation">
    <ul class="nav__list">
        <li class="nav__item">
            <a class="nav__anchor" href="">Nav item A</a>
        </li>
        <li class="nav__item">
            <a class="nav__anchor" href="">Nav item B</a>
        </li>
        <li class="nav__item">
            <a class="nav__anchor" href="">Nav item C</a>
        </li>
    </ul>
</nav>

您可能还注意到nav 元素上有两个不同的类。这在 BEM 方法中称为 mixhttps://en.bem.info/methodology/css/#mixes

【讨论】:

  • 非常感谢。这非常有帮助,并且使其他一些要点变得清晰,尤其是如何处理嵌套元素和这些 mixes。尽管现在每个元素都有一个类,但它看起来比我使用header_nav_list 的第一种方法更具可读性。我认为有时官方 BEM 文档过于简化了“教科书示例”。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 2018-01-08
  • 2021-04-06
相关资源
最近更新 更多