2
2

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 1 year has passed since last update.

[SCSS] selectorのinner ruleは1階層までが良い(親要素参照の `&`)

Last updated at Posted at 2022-01-06

概要

すごいざっくりですが、下記のようなHTMLがあったとします(タグは全てdivに統一しました)。

<div class="root">
  <div class="icon">icon</div>
  <div class="caption">caption</div>
</div>

ここにCSS(今回はSCSS)でスタイルをつけたいとします。

component.png

  • 作成したいcomponentは上記の画像のような感じ。
  • hover時にrootはyellowに、iconはredに、captionはblueにしたい(実際にはそんなことはないが、、、)。

改善前

まずは、今まで自分がやっていた感じに記載します。

.root {
  background-color: gray;
  height: 100%;
  width: 100%;

  &:hover {
    background-color: yellow;

    .icon {
      color: red;
    }

    .caption {
      color: blue;
    }
  }
}

.icon {
  height: 48px;
  width: 48px;
}

.caption {
  font-size: 18px;
}

実際にはこれでも十分動きますが、上記の何がいけないのかというと、

  • 階層が深くなってしまうことで、componentが増えた場合にstyleが当たる優先順位や記載箇所がわかりづらくなってしまう。
  • .rootのhoverにまとめてiconとcaptionの挙動も書いているが、まだこのclassは記載箇所より上には出ておらず、コードとしてはこれもわかりづらい要因となってしまう。

改善後

.root {
  background-color: gray;
  height: 100%;
  width: 100%;

  &:hover {
    background-color: yellow;
  }
}

.icon {
  height: 48px;
  width: 48px;

  .root:hover & {
    color: red;
  }
}

.caption {
  font-size: 18px;

  .root:hover & {
    color: blue;
  }
}

実際にpropertiesが当たるのはどのclassなのかということが、これで明確になる。scssにおいて、親要素を参照したい場合は、

.親要素 {}

.子要素 {
  .親要素 & {
    // 親要素と連動して当てたい子要素のproperties
  }
}

と記載すれば、割とスッキリする。

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?