当前位置: 首页 > 面试题库 >

BEM块,命名和嵌套

阳兴朝
2023-03-14
问题内容

我正在努力围绕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样式,我将遇到一个问题,它们同时出现在我的两个导航中,并且不应具有相同的样式。我应该在这里做一些嵌套,还是将块和元素命名错误?

CSS中的嵌套示例:

.content__nav .nav__item { background: Red; }

还是我应该这样命名:

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

你能帮我吗?


问题答案:

关于如何编写BEM类的方法有很多变体,因此请注意,这是多个相互竞争的标准。它起初是一组宽松的准则。自发布此答案以来,Yandex大大改进了其官方标准(这是一个很大的进步)。。

在这一点上,我使用“ Atomic OOBEMITLESS”,它实际上只是表示类是模块化和命名空间的,选择器的特异性低,状态可以用允许CSS缩放的类来切换,从而可以在CSS预处理器之上使代码更简洁,更具表现力。

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

  • 连字符的类名作为块:
    foo-bar

  • 块名,__后跟元素的带连字符的类名:
    foo-bar__fizz-buzz

  • 块或元素名,接着--,接着为改性剂连字符的类名:
    foo-bar--bazfoo-bar--baz__fizz-buzzfoo-bar__fizz-buzz--qux

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

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

  1. sidebar,其中包含一个sidebar__nav元素
  2. content,其中包含一个content__nav元素
  3. nav,其中包含nav__itemnav__link元素

sidebarcontent块似乎是相同的块上的变化,并且可以被表示为.region.region-- sidebar.region.region--content

nav块在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块,就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类之后,对 所有 nav__item元素进行样式设置就很简单:

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

并为内容nav__item元素覆盖这些样式是:

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


 类似资料:
  • 关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变化。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”,这是为了与ECMAScript 2015里的术语保持一致,(也就是说 module X { 相当于现在推荐的写法 namespace X {)。 这篇文章将概括介绍在TypeScript里使用模块与命名空间来组织代码的方法。 我们也会谈及

  • 关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变化。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”,这是为了与ECMAScript 2015里的术语保持一致,(也就是说 module X { 相当于现在推荐的写法 namespace X {)。 介绍 这篇文章将概括介绍在TypeScript里使用模块与命名空间来组织代码的方法。 我们也

  • If you’re writing your HTML and CSS code in OOCSS-style, Yandex’s BEM style specifically, you will like this filter. It provides some aliases and automatic insertions of common block and element names

  • postcss-bem-linter 是一个用于 postcss 的 BEM linter 工具。 有了这个插件,你可以通过对照一组 BEM 风格的约定,来检查样式表的有效性;可以使用预设模式(目前是 SUIT 和 BEM),或插入你自己的;如果发现CSS不遵循规定的约定,该插件将有提示警告,  

  • 这是一个非常基本的问题,但实际上我从来没有自己定义过名称空间。我正在尝试将我的基于Qt的库中的类分组在各种名称空间中(并且还允许更容易的扩展而不发生名称冲突)。例如,主类(也表示库)属于顶级命名空间: 这个使用了一组其他名称空间和类,这些名称空间和类是在的头文件中定义的,这些头文件包含在的头文件中: 其中Manager.h包含 和configurator.h包含 类的内容在这里并不重要。 在编译时

  • 问题内容: 我知道这个问题已经被问过多次了。我已经阅读了所有内容,但无法解决问题。以下是我的目录结构。 在main.py中,我将导入以下内容。 当我在Windows中执行代码时,它工作得很好。但是在Linux中,出现以下错误。 我还阅读了有关模块和包的官方python文档。 问题答案: 您的包裹结构还可以。您的导入声明很好。唯一缺少的是该软件包在中是可见的,该位置是可以解析import语句的位置列