28
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

BEMのmodifierのきれいな書き方

Last updated at Posted at 2016-08-07

日本で一番Qiitaが好き!tattです。
日々、ワンチャン狙いながらホームページ手作りおじさんやってます!

さっそくですが、「BEMの一番きれいな書き方 -2016 summer-」、tatt開催しまーす!!!

これまでのBEM

これまで最適解が出ず(ググり方が悪かった)、BEM用のmixinを作り、さらにplaceholder selectorを作って@extendさせてました。
今思えば、正気の沙汰とは思えません。
(ちなみにscssよりsass派、ElementごとにModifier作りたい派、トランクスよりボクサーパンツ派、茶髪より黒髪派です)

_bem.sass
// Element用のミックスイン(__でつなぐ)
=e($name)
  @at-root #{&}__#{$name}
    @content

// Modifier用のミックスイン(--でつなぐ)
=m($name)
  @at-root #{&}--#{$name}
    @content
sample.sass
@import "bem"

%sampleElement
  font-size: 10px
  line-height: 1
  color: black

.sample
  // .sampleブロックのスタイル

  +e(element)
    // .sample__elementのスタイル
    @extend %sampleElement

    +m(red)
      // .sample__element--redのスタイル
      @extend %sampleElement
      color: red
    +m(blue)
      // .sample__element--blueのスタイル
      @extend %sampleElement
      color: blue

コンパイル後、

sample.css
.sample__element, .sample__element--red {
  font-size: 10px;
  line-height: 1;
  color: black;
}
.sample__element--red {
  color: red;
}
.sample__element--blue {
  color: blue;
}

一時期はこれで良しとしてました。
一応、Elementのスタイルを一元管理できているので。
ただ、こんなコードを書いてたのではワンチャン狙うどころか、LINEの交換さえ危ういですね。
もしも、LINE交換できても既読スルー→(5日後に)ごめん、寝てた:cry:の流れです。

これからのBEM

まずBEM用のmixinは必要ありません(※sass 3.3.0.rc.3以降)
以前のver.でもありましたが、擬似クラス、擬似要素、セレクタの連結などに使用していた&を、親のクラス名を子のクラス名の一部にすることがインターポレーション(#{})なしで可能になっているのです。
これを用いてスマートなLINEの交換方ほ… いえ、BEMを書くことができます。

sample.sass
.sample
  // .sampleブロックのスタイル

  &__element
    // &を変数に格納
    $this: &
    // .sample__elementのスタイル
    font-size: 10px
    line-height: 1
    color: black

    &--red
      // .sample__element--redのスタイル
      @extend #{$this}
      color: red
    &--blue
      // .sample__element--blueのスタイル
      @extend #{$this}
      color: blue

コンパイル後、

sample.css
.sample2__element, .sample2__element--red {
  font-size: 10px;
  line-height: 1;
  color: black;
}
.sample2__element--red {
  color: red;
}
.sample2__element--blue {
  color: blue;
}

スマートすぎるー!たぎるー:joy:!!
&がブロックスコープなので各Elementで$this: &できます。

sample.sass
.sample
  // .sampleブロックのスタイル

  &__element
    // &を変数に格納
    $this: &
    // .sample__elementのスタイル
    font-size: 10px
    line-height: 1
    color: black

    &--red
      // .sample__element--redのスタイル
      @extend #{$this}
      color: red

  &__element2
    // &を変数に格納
    $this: &
    // .sample__elementのスタイル
    font-size: 20px
    line-height: 1
    color: black

    &--red
      // .sample__element2--redのスタイル
      @extend #{$this}
      color: red


よかったら、「BEMの一番きれいな書き方 -2016 summer-」で皆様もワンチャン狙ってください!

THANX & BIG UP‼︎‼︎

28
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?