CSS BEM - 常见的约定 class

CSS BEM - Convention for common class

我正在尝试使用 BEM 约定重构我们的样式。在我们的页面上,我们得到了一些写为 bold 的元素。

假设我们有一个 startpage 和一个 detailpage。两个页面都包含一些文本元素。通常这个元素有一个额外的 class,它只包含

.block__element {
  font-weight: bold;
}
.block__element--modifier {
  font-weight: bold;
}

为了避免不必要的代码重复,我在问自己如何最好地重构它。定义一个公共元素是不是一种好方法(也许在我的主要style.css

.text--bold {
  font-weight: bold;
}

我可以在所有需要将文本设置为粗体的地方使用它?或者有更好的解决方案吗?

编辑: 我认为 mixes 是要走的路。据我所知,我需要创建一个混合 text--bold 并将其应用于每个受影响的文本元素?

是的,这是个好主意。

BEM 风格中 wtite 的主要目标是:

所有 都是 class,没有任何东西是 嵌套

因此,根据需要定义尽可能多的有用 class 是合法的:

示例:

.bold { font-weight: bold}
.bolder { font-weight: bolder }
.red { color: red}
.redbg {background-color: red}
.nomargin { margin: 0}

等等,

当然,您也可以使用以下方式修改特定元素样式:

.component--blue {
   color: blue;
}

并将此 class 附加到抽象 component 块中的任何元素

编辑:

关于 DRY 的 BEM 指南:https://cssguidelin.es/#dry

基本上,您不应该强迫自己寻找重复的代码行。但是如果一个特定的案例不止一次发生,你可以使用 mixin。

@mixin my-web-font() {
  font-family: "My Web Font", sans-serif;
  font-weight: bold;
}

.btn {
  display: inline-block;
  padding: 1em 2em;
  @include my-web-font();
}

[...]

.page-title {
  font-size: 3rem;
  line-height: 1.4;
  @include my-web-font();
}

[...]

  .user-profile__title {
    font-size: 1.2rem;
    line-height: 1.5;
    @include my-web-font();
  }

这让您的代码编写起来更清晰,但实际上会编译为重复行。所以我下面的回答还是有道理的。


恕我直言,我不同意@Kareem Dabbeet 的回答。

我不是 BEM 专家,但是如果您想遵循确切的约定,您的粗体文本应该保留它所绑定的元素的修饰符。 所以你应该得到类似

的东西
.block__element--bold {
  font-weight: bold;
}

.otherBLock__element--bold {
  font-weight: bold;
}

尽管如此,我自己使用了很多可重用的 类,惯例是根据您的 blocks/elements 结构来组织您的代码。没有提到一些全局实用程序 类.

但是,您是对的,根据用例,它可能会导致代码重复。但是 BEM 完全是关于某种关注点的分离。 你应该阅读和写作你的 css 只关注它所绑定的 block/element 而不要看其他地方。 所以它是有道理的。

使用不与 BEM 一起绑定到任何块或元素的 类 可能会冒着在长 运行.[= 中产生冲突的风险13=]

按照我对 BEM 的理解,你将 stylessemantics 分开。 语义用css classes (.button--emphasized)表示,而样式用实际css (font-weight: bold)。这意味着你尽可能多地省略 css classes 中的实际样式(没有 class .bold),而是问问自己 为什么它是粗体? 并用 css:

表示

.button--emphasized,
.text--headline,
.input--required {
  font-weight: bold;
}

您仍然只写一次 font-weight: bold(不要重复自己)。但是,如果(无论出于何种原因)您决定强调的按钮不再是粗体,则您不必更改所有 html/component 文件中 .button 元素中出现的所有 .bold .然后,您只需从 font-weight: bold 列表中删除 .button--emphasized