我正在试图理解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__项的样式,我会遇到一个问题,它们出现在我的两个导航中,不应该有相同的样式.我应该在这里做一些嵌套,还是我给我的块和元素命名错了?

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",这实际上只是说明类是模块化的和命名空间的, Select 器的专用性很低,状态可能与允许CSSzoom 的类一起切换,在CSS预处理器的顶部,以使代码更简洁和更具表现力.

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

  • hyphenated class names as blocks:
    foo-bar
  • block name followed by __ followed by hyphenated class names for elements:
    foo-bar__fizz-buzz
  • block or element names followed by -- followed by hyphenated class names for modifiers:
    foo-bar--baz, foo-bar--baz__fizz-buzz, foo-bar__fizz-buzz--qux

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


在您的示例中有三个不同的块:

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

sidebar块和第content块似乎是同一挡路的变体,可以表示为第.region.region--sidebar块和第.region.region--content块.

ul元素中的nav挡路是隐含的,您应该将其显式地表示出来:

<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挡路,那么修改nav挡路就很有意义了:

<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类后,设置all nav__item元素的样式非常简单:

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

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

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

Css相关问答推荐

Tailwind CSS group-hover不适用于自定义前置码

主dart 文件未加载Flutter Web

下一个js app样式刷新页面后不工作页面

如何使用css::Part()定位Web组件shadowDOM中的第N个元素

在ReactJS中使用动画在栅格上添加柱

如何在CSS中创建水平/垂直对称的虚线边框?

如何使用Bootstrap将图像水平对齐,使其顶部和底部位于同一水平线上?

如何使TWebPanel具有圆角?

如何使用混合混合模式更改动画背景上的文本 colored颜色

如何使用 Ant Design 为不同的屏幕尺寸制作自定义组件样式

为什么 CSS Calc() 函数只需要+或-运算符前后有空格

如何使用来自单独模块的代码将自定义标头插入到使用 DT Shiny 呈现的表中?

没有 colored颜色 Select 器的 JavaFX colored颜色 Select 器

父母是内联块,子元素有%填充=奇怪的行为

有条件地覆盖 CSS 中的 AntD Select 样式

如何倾斜元素但保持文本正常(未倾斜)

绝对位置和溢出:隐藏

Flexbox 列自底对齐

Bootstrap 4:导航内的多级下拉菜单

CSS 中的星号属性是什么意思?