BEM 中的继承

问题描述

我手头有几个滥用 BEM 的案例,其中块的层次结构从一开始就搞砸了,这导致 WET CSS 代码难以维护。

简单来说:

.about-us {
  &__title {
    font-size: ...; // Same
    font-weight: ...; // Same
  }
  &__content {
    font-size: ...; // Same
  }

  &__faces { ... } // Different;
}

.catalogue {
  &__title {
    font-size: ...; // Same
    font-weight: ...;  // Same
  }
  &__content {
    font-size: ...;  // Same

    &-features { ... } // Different
  }
  ...
}

.catalogue-item {
  &__title {
    font-size: ...; // Same
    font-weight: ...;  // Same
    text-align: ...; // Different
  }
  &__content {
    font-size: ...;  // Same
  }
  ...
}

假设不同页面的样式可能会有所不同,但几乎所有负责网站总体外观(排版等)的样式都有效地保持不变 - 或者至少应该如此。

是否应该从通用样式继承特定样式?例如

.catalogue {
  &__title {
    @extends .page__title;
    ...

它们应该共存吗?例如

<div class="page catalogue">
  <h1 class="page__title catalogue__title">...

实际示例要复杂得多,因此对代码的特定修复将不起作用。我想知道 BEM 方法一般如何解决此类情况,以及解决此问题的常用方法是什么。

解决方法

不,不在我的书中。这首先违背了 BEM 的目的。

你看,你应该坚持使用 BEM 之类的东西的主要原因是:关注点分离。你可以称之为封装。

如果您开始使用通用 CSS 类,您将打破封装,CSS 规则将无处不在。那不是你想要的。维护起来会更困难,因为它会使测试变得非常、非常、非常 aufwendig 并且很容易出错。

既然你在使用 SASS,你可能想要这样的东西。

$global-font-size-normal: X;
$global-font-weight-normal: Y;
$global-font-size-extra: A;
$global-font-weight-extra: B;

// ...

$about_us-font-size: $global-font-size-normal;
$about_us-font-weight: $global-font-weight-normal;
$about_us_faces-font-size: $global-font-size-extra;

.about-us {
  &__title {
    font-size: $about_us-font-size;
    font-weight: $about_us-font-weight;
  }
  &__content {
    font-size: $about_us-font-size;
  }

  &__faces { 
    font-size: $about_us_faces-font-size;
  };
}

// ... etc.

,

BEM 只描述你的类名应该是什么;你可以随意安排你的CSS。正如您所发现的,使用样式继承向特定类添加通用样式效果很好。

<div class="page catalogue">
  <h1 class="page__title catalogue__title">...

在本例中,您的 <h1> 应该只有 catalogue__title 类。如果您希望 catalogue__title 看起来像 page__title,请在 CSS 中进行描述 - 例如使用继承。