发布于 2026-01-06 4 阅读
0

拥有 BEM 收益的朋友

拥有 BEM 收益的朋友

边界元法简介

什么是BEM?

Block ElementModifier (BEM) 方法论是由Yandex开发一种常见的 CSS 类命名约定。BEM 的核心思想是提供一种严格的方式来将 CSS 类组织成模块。BEM 通过其 CSS 类名语法来体现其目的和含义:

  • :表示元素所在的模块或上下文。(“这是什么?”
    • 导航
    • 页脚
    • 商品评论
  • 元素:描述代码块内执行特定功能的组件。(“它做什么/显示什么?”
    • 物品
    • 关联
    • 按钮
  • 修饰符:定义块或元素的外观、状态或行为。( “它处于什么状态?” )
    • 积极的
    • 红色的
    • 大的

我们用两个下划线表示元素,用两个短横线表示修饰语来表示这种语法:

.navigation__item--active
.footer__link--red
.item-review__button--large
Enter fullscreen mode Exit fullscreen mode

类比

为了更深入地了解它们之间的联系,可以把它们想象成一个类比。

等级制度

Car
|-- Transmission
|   -- Automatic
|   -- Manual

Person
|-- Female
|   -- Lips
|-- Male
|   -- Beard
Enter fullscreen mode Exit fullscreen mode

CSS

.car {}
.car__transmission {}
.car__transmission--automatic {}
.car__transmission--manual {}

.person {}
.person--male__beard {}
.person--female__lips {}
Enter fullscreen mode Exit fullscreen mode

假设我们要显示不同的类别来描述汽车的变速器。模块或块就是 `<transform>` Car我们显示的元素Transmission是 `<transform> `,它由 `<variable>` 和`<variable>`修改或描述AutomaticManual

在第二个例子中,我们看到修饰符位于元素之前!

如果你看一下我们的树状层级结构,这种方法就更合理了。在这个例子中,aPerson被拆分为 aFemaleMaleclass。每个修饰符都有自己的元素,例如Lipsa 或 class Beard

创建命名层级时,务必考虑周全,注意措辞。没人愿意阅读.person--female__arm__hand--left__finger--pinky冗长的标记,否则很容易造成代码混乱。如果确实需要如此精细的命名,不妨将其拆分成子模块,以提高代码的可读性和组织性。

Sass + BEM = <3

在 Sass 文件中,组织类的一种方法是使用嵌套。

.block {
    &__element {
        &--modifier { 
        }
    }
    &--modifier {
    }
}
Enter fullscreen mode Exit fullscreen mode

打印结果将为:

.block__element {}
.block__element--modifier {}
.block--modifier[]
Enter fullscreen mode Exit fullscreen mode

这种架构的优点在于其可扩展性。代码以模块化方式分组,并详细描述其用途和状态。我们来看一个例子:

HTML

<ul class="tabs">
    <li class="tabs__header--active">
        <img class="tabs__content__image" src="">
    </li>
    <li class="tabs__header">
        <img class="tabs__image" src="#">
        <img class="tabs__image--inverse" src="#">
    </li>
</ul>
Enter fullscreen mode Exit fullscreen mode

萨斯

.tabs {
    &__header {
        &--active {
        }    
    }
    &__image {
        &--inverse {
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

输出的 CSS

.tabs {

}
.tabs__header {

}
.tabs__header--active {

}
.tabs {

}
.tabs__image {

}
.tabs__image--inverse {

}
Enter fullscreen mode Exit fullscreen mode

太棒了!随着应用程序的增长,这种嵌套结构使类名更易于阅读,并消除其他开发人员阅读您的代码时的猜测。

记住:Sass 代码嵌套层数不要超过三层!!

那么……为什么是BEM?

  • 自文档化 CSS!它能显示 DOM 中不同节点之间的关系层次结构。
  • 严格的类命名有助于实现封装,减少命名冲突或在给定上下文之外使用类的情况。
  • 性能提升!
  • 仅凭名称就能让其他开发者更清楚地了解一段标记代码的功能。
  • 无需使用后代选择器
  • 组件样式相互解耦,并且在不同项目之间具有很高的可移植性。实际上,这意味着代码质量的提升和开发速度的加快!

简而言之,BEM 会让你更加注重细节,深思熟虑,从而提高代码质量 :)

文章来源:https://dev.to/adamaso/friends-with-bem-efits-4ehp