在BEM中附加CSS的所有内容都需要一个类名吗?

时间:2018-01-22 15:13:18

标签: css less bem

由于人们仍然建议将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>

也许someine可以帮助我理解,如何在BEM方面正确解决这个问题。

1 个答案:

答案 0 :(得分:3)

是的,你应该为你需要在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