Sass .scss: Yuvalama ve çoklu sınıflar?


332

Mevcut projem için Sass (.scss) kullanıyorum.

Aşağıdaki örnek:

HTML

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

SCSS

.container {
    background:red;
    color:white;

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

Harika çalışıyor.

İç içe stilleri kullanırken birden fazla sınıfı işleyebilir miyim.

Yukarıdaki örnekte bunun hakkında konuşuyorum:

CSS

.container.desc {
    background:blue;
}

Bu durumda div.container, normal olarak her şey mavi olur redama div.container.descmavi olur.

Bunu containerSass ile nasıl iç içe yerleştirebilirim ?


1
Çift sınıf seçici kullanmalısınız. Bu sorun, Sass'ta yuvalama seçeneğinin mükemmel bir örneğidir. Bununla
Nesha Zoric

Yanıtlar:


570

Üst seçici referansını kullanabilirsiniz, &derlemeden sonra üst seçici ile değiştirilecektir:

Örneğiniz için:

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

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

&Tamamen böylece üst seçici kendisini iç içe edilirse, yuvalama değiştirmeden önce çözülecektir, çözecektir &.

Bu gösterim çoğunlukla sahte öğeler ve -sınıflar yazmak için kullanılır :

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

Ancak, &neredeyse istediğiniz herhangi bir konuma * yerleştirebilirsiniz , böylece aşağıdakiler de mümkündür:

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

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

Ancak, bunun bir şekilde yuvalama yapınızı bozduğunu ve böylece stil sayfanızda belirli bir kural bulma çabasını artırabileceğini unutmayın.

*: Beyaz karakterlerin önünde beyaz karakterden başka karakter kullanılmasına izin verilmez &. Böylece doğrudan bir selector+& - #id&bir hata atmak olacaktır.


12
Sadece bir yan not, &sözde elemanlar ve sözde sınıflar kullanılırken yaygın bir kullanımıdır . Örneğin: &:hover.
ezmek

1
@crush Bütünlük uğruna bunu cevabıma ekledim. Yorum için teşekkürler.
Christoph

1
Teşekkürler. Ben temel kılavuzda bahsedilmeyen gibi aptal olduğunu düşündüm! BTW dokümanların URL'si şu adrese
scipilot

1
Eğer &bir satırın sonunda kullanılır, diğer bütün düzeylerde sınıfların kalanı başında o çizgiyi koyar. Elemanları birleştirerek &.descaltında .container.desc ekleyerek sonuçlandırabilirsiniz.container.desc
Kate Miller

scss-lint "& :: hover" (çift kolon) kullanmayı önerir
Marcel Lange

18

Bu durumda, bir sınıf adı veya bir sınıf adı kuralı oluşturmak için daha iyi bir yol kullanmanız gerektiğini düşünüyorum. Örneğin, dediğin gibi, .containersınıfın belirli bir kullanıma veya görünüme göre farklı renklere sahip olmasını istersiniz . Bunu yapabilirsiniz:

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;
}

Yukarıdaki kod, sınıf adlandırma kurallarında BEM Metodolojisine dayanmaktadır. Bu bağlantıyı kontrol edebilirsiniz: BEM - Blok Elemanı Değiştirici Metodolojisi


bu kulağa hoş geliyor, ama her ne pahasına olursa olsun kaçınılmalıdır. gelecekte projenizde arama yapmaya çalışacağınız .container--descve sonuç vermeyeceğiniz zaman bana teşekkür edeceksiniz .
Stavm

2

Christoph'un yanıtı mükemmel. Ancak bazen birden fazla sınıfa gitmek isteyebilirsiniz. Bu durumda, kullanarak iki kök sınıfın yan yana oturmasını sağlayan @at-rootve #{}css özelliklerini deneyebilirsiniz &.

Bu işe yaramaz ( nothing before &kural nedeniyle ):

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

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

Ama bu (kullanarak @at-root plus #{&}):

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.