首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SASS BEM通配符

SASS BEM通配符
EN

Stack Overflow用户
提问于 2021-02-22 00:57:10
回答 3查看 140关注 0票数 0

我使用BEM (至少是它的一个修改版本)已经有一段时间了;最近我已经从编写CSS转向Sass --它似乎很好地帮助了BEM,但是我想不出如何简单地扩展它的特性。

例如,假设我有几个按钮:

代码语言:javascript
复制
<button
  class="BLOCK__ELEMENT BLOCK__ELEMENT--MODIFIER1"
>
  Click Me 1
</button>

<button
  class="BLOCK__ELEMENT BLOCK__ELEMENT--MODIFIER2"
>
  Click Me 2
</button>

<button
  class="BLOCK__ELEMENT BLOCK__ELEMENT--MODIFIER3"
>
  Click Me 3
</button>

在CSS文件中,我可以编写以下内容:

代码语言:javascript
复制
.BLOCK__ELEMENT {
  border-radius: 2rem
}

.BLOCK_ELEMENT--MODIFIER1 {
  background-color: red
}

.BLOCK_ELEMENT--MODIFIER2 {
  background-color: white
}

.BLOCK_ELEMENT--MODIFIER3 {
  background-color: blue
}

世界上所有的一切都是正确的

在Sass中,我可以将其简化如下:

代码语言:javascript
复制
.BLOCK__ELEMENT {
  border-radius: 2rem

  &--MODIFIER1 {
    background-color: red
  }

  &--MODIFIER2 {
    background-color: white
  }

  &--MODIFIER3 {
    background-color: blue
  }
}

这是一个很好的改进

,但我真正想做的是简化标记,如下所示:

代码语言:javascript
复制
<button
  class="BLOCK__ELEMENT--MODIFIER1"
>
  Click Me 1
</button>

<button
  class="BLOCK__ELEMENT--MODIFIER2"
>
  Click Me 2
</button>

<button
  class="BLOCK__ELEMENT--MODIFIER3"
>
  Click Me 3
</button>

让Sass看起来像这样:

代码语言:javascript
复制
.BLOCK__ELEMENT {

  &* {
    border-radius: 2rem
  }

  &--MODIFIER1 {
    background-color: red
  }

  &--MODIFIER2 {
    background-color: white
  }

  &--MODIFIER3 {
    background-color: blue
  }
}

在sass中有这样的通配符实现吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-10 23:07:31

我有另一个可能的解决方案

代码语言:javascript
复制
@use "sass:string"

@mixin self() {
  $self: string.slice(#{&}, 2);
  
  @at-root &, [class*="#{$self}"] {
    @content
  }
}
代码语言:javascript
复制
.Block {
  @include self() {
    border-radius: 2rem;
  }

  &--modifier1 {
    background-color: red;
  }
  &--modifier2 {
    background-color: blue;
  }
  &--modifier1 {
    background-color: salmon;
  }

  &__element {
    @include self() {
      width: 50px;
    }

    &--modifier {
      background-color: skyblue;
    }

  }
}

这是以这种方式编译的

代码语言:javascript
复制
.Block, [class*=Block] {
  border-radius: 2rem;
}

.Block--modifier1 {
  background-color: red;
}
.Block--modifier2 {
  background-color: blue;
}
.Block--modifier1 {
  background-color: salmon;
}

.Block__element, [class*=Block__element] {
  width: 50px;
}

.Block__element--modifier {
  background-color: skyblue;
}
票数 1
EN

Stack Overflow用户

发布于 2021-02-23 21:01:14

好的旧css怎么样?:)

代码语言:javascript
复制
[class*="BLOCK__ELEMENT-"]
票数 1
EN

Stack Overflow用户

发布于 2021-03-08 23:55:45

就像Sueno一样,您可以使用class*=“块__ELEMENT-”并执行以下操作:

代码语言:javascript
复制
.BLOCK_ELEMENT {

  @at-root &, [class*="BLOCK_ELEMENT"] { // or just @at-root [class*="BLOCK_ELEMENT"]
    border-radius: 2rem;
  }

  &--MODIFIER1 {
    background-color: red
  }

  &--MODIFIER2 {
    background-color: white
  }

  &--MODIFIER3 {
    background-color: blue
  }  
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66308788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档