html - BEM block 、命名和嵌套

标签 html css bem

我正在尝试围绕 BEM 命名约定进行思考。我被困在这个。我可能误解了什么,让我们看看。

我有一个侧边栏导航和一个内容导航。

我的侧边栏导航看起来像这样

<div class="sidebar">
    <ul class="sidebar__nav">
        <li class="nav__item"><a href="#" class="nav__link">LINK</a></li>
        <li class="nav__item"><a href="#" class="nav__link">LINK</a></li>
    </ul>
</div>

我的内容导航看起来像这样

<div class="content">
    <ul class="content__nav">
        <li class="nav__item"><a href="#" class="nav__link">LINK</a></li>
        <li class="nav__item"><a href="#" class="nav__link">LINK</a></li>
    </ul>
</div>

现在,如果我为 .nav__item 设置样式,我将遇到一个问题,它们出现在我的两个导航中,并且不应具有相同的样式。我应该在这里做一些嵌套,还是我命名我的 block 和元素有误?

CSS 嵌套示例:

.content__nav .nav__item { background: Red; }

或者我应该这样命名:

<li class="content__nav__item"><a href="#" class="content__nav__link">LINK</a></li>

你能帮忙吗?

最佳答案

关于如何编写 BEM 类有许多变体,因此请注意存在多个相互竞争的标准。它最初是一套宽松的指导方针。自发布此答案以来,Yandex has significantly overhauled their official standard (这是一个很大的进步)。我使用的 BEM 版本很大程度上基于 an article by Nicolas Gallagher .

此时我使用"Atomic OOBEMITLESS" ,这实际上只是一种说法,类是模块化的和命名空间的,选择器具有低特异性,并且可以在 CSS 预处理器之上使用允许缩放 CSS 的类来切换状态,以使代码更简洁和更具表现力。

综上所述,我将使用以下 BEM 标准:

  • 用连字符连接的类名作为 block :
    foo-bar
  • block 名称后跟 __ 后跟元素的带连字符的类名:
    foo-bar__fizz-buzz
  • block 或元素名称后跟 -- 后跟修饰符的带连字符的类名:
    foo-bar--baz, foo-bar--baz__fizz-buzz, foo-bar__fizz-buzz--qux

BEM 缩写形式:block-name__element-name--modifier-name


您的示例中包含三个不同的 block :

  1. sidebar,它有一个 sidebar__nav 元素
  2. content,它有一个 content__nav 元素
  3. nav,它有 nav__itemnav__link 元素

sidebarcontent block 似乎是同一 block 的变体,可以表示为 .region.region--sidebar.region.region--content

nav block 隐含在 ul 元素中,您应该将其显式化:

<ul class="nav"><!-- could be content__nav or sidebar__nav as well if you choose -->
    <li class="nav__item"><a href="#" class="nav__link">LINK</a></li>
    <li class="nav__item"><a href="#" class="nav__link">LINK</a></li>
</ul>

一旦您指定 ul 元素是一个 nav block ,就可以修改 nav block :

<ul class="nav nav--content">
    <li class="nav__item nav--content__item"><a href="#" class="nav__link nav--content__link">LINK</a></li>
    <li class="nav__item nav--content__item"><a href="#" class="nav__link nav--content__link">LINK</a></li>
</ul>

设置 CSS 类后,所有 nav__item 元素的样式很简单:

.nav__item {
    ...styles here...
}

并覆盖内容 nav__item 元素的那些样式是:

.nav--content__item {
    ...styles here...
}

关于html - BEM block 、命名和嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22566179/

相关文章:

html - 加载大数据时垫子自动完成太慢

javascript - 如何使用模板和 BEM 方法来组织 javascript 表单生成器的架构?

html - 作用域样式对 BEM 中的 block 和元素的影响

css - BEM 生成器 mixin 想要匹配 MDL 结构

html - 在按钮 div 之后获取随机链接

html - 为什么容器与我的侧边栏 <nav> 重叠?

javascript - JQuery Mobile 单击时将所选选项复制到其他下拉列表

CSS3 建议,没有图像只是 css

javascript - 使用 Bootstrap 在移动 View 中隐藏/显示 div

c# - 获取c#函数值并在html表中显示