Sass .scss:ネストと複数のクラス?


332

現在のプロジェクトではSass(.scss)を使用しています。

次の例:

HTML

<div class="container desc">
    <div class="hello">
        Hello World
    </div>
</div>

SCSS

.container {
    background:red;
    color:white;

    .hello {
        padding-left:50px;
    }
}

これはうまくいきます。

ネストされたスタイルを使用しながら、複数のクラスを処理できますか?

上記のサンプルでは、​​これについて話しています。

CSS

.container.desc {
    background:blue;
}

この場合、すべてがdiv.container正常になりredますがdiv.container.desc青になります。

これcontainerをSassで入れ子にするにはどうすればよいですか?


1
ダブルクラスセレクターを使用する必要があります。この問題は、Sassのネストオプションの完璧な例です。あなたはそれについてすべてここで読むことができますkolosek.com/nesting-in-less-and-sass
Zoric

回答:


570

親セレクター参照を 使用できます。&コンパイル後に親セレクターに置き換えられます。

あなたの例のために:

.container {
    background:red;
    &.desc{
       background:blue;
    }
}

/* compiles to: */
.container {
    background: red;
}
.container.desc {
    background: blue;
}

&完全ので、あなたの親セレクタ自体がネストされている場合、ネストは交換する前に解決され、解決されます&

この表記は、疑似要素とクラスを記述するために最もよく使用されます。

.element{
    &:hover{ ... }
    &:nth-child(1){ ... }
}

ただし、&実質的に任意の位置に*を配置できるため、次のことも可能です。

.container {
    background:red;
    #id &{
       background:blue;
    }
}

/* compiles to: */
.container {
    background: red;
}
#id .container {
    background: blue;
}

ただし、これによりネスト構造が壊れるので、スタイルシートで特定のルールを見つける作業が増える可能性があることに注意してください。

*:の前に空白以外の文字を使用することはできません&。したがって、selector+を直接連結することはできません&- #id&エラーがスローされます。


12
余談です&が、よく使用されるのは、疑似要素と疑似クラスを使用する場合です。例:&:hover
2014

1
@crush完全を期すために、これを私の回答に追加しました。コメントありがとうございます。
クリストフ

1
ありがとう。基本ガイドに記載されていないので、私は愚かだったと思いました!ところで、ドキュメントはURLをsass-lang.com/documentation/…に
scipilot

1
&が行の終わりで使用される場合、他のすべてのレベルの残りのクラスの最初にその行が配置されます。&.descunder を実行することで要素を組み合わせることができ、.containerそれに.descが追加されます。結果は.container.desc
Kate Miller

scss-lintは "&:: hover"(ダブルコロン)の使用を提案しています
Marcel Lange

18

その場合は、クラス名またはクラス名の規則を作成するより良い方法を使用する必要があると思います。たとえば、あなたが言ったように、あなたは.containerクラスに特定の用法や外観に応じて異なる色を持たせたいと思っています。あなたはこれを行うことができます:

SCSS

.container {
  background: red;

  &--desc {
    background: blue;
  }

  // or you can do a more specific name
  &--blue {
    background: blue;
  }

  &--red {
    background: red;
  }
}

CSS

.container {
  background: red;
}

.container--desc {
  background: blue;
}

.container--blue {
  background: blue;
}

.container--red {
  background: red;
}

上記のコードは、クラスの命名規則におけるBEM方法論に基づいています。このリンクを確認できます:BEM —ブロック要素修飾子の方法論


これは良さそうに聞こえますが、絶対に避けてください。将来プロジェクトを検索して.container--desc結果が得られない場合は、感謝します。
Stavm

2

クリストフの答えは完璧です。ただし、1つよりも多くのクラスに行きたい場合もあります。この場合、@at-rootおよび#{}を使用して、2つのルートクラスをを使用して互いに隣接させることができ&ます。

これは機能しません(nothing before &ルールにより):

container {
    background:red;
    color:white;
    
    .desc& {
      background: blue;
    }

    .hello {
        padding-left:50px;
    }
}

しかし、これは(を使用して@at-root plus #{&}):

container {
    background:red;
    color:white;
    
    @at-root .desc#{&} {
      background: blue;
    }

    .hello {
        padding-left:50px;
    }
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.