Üst işareti ve işareti (&) kullanarak tür seçicilerle birleştiren sass


101

Sass'ta yuva yapmakta sorun yaşıyorum. Aşağıdaki HTML'ye sahip olduğumu varsayalım:

<p href="#" class="item">Text</p>
<p href="#" class="item">Text</p>
<a href="#" class="item">Link</a>

Stillerimi aşağıdakilere yerleştirmeye çalıştığımda bir derleme hatası alıyorum:

.item {
    color: black;
    a& {
        color:blue;
   }
}

Aynı elemanın parçası olduğunda, üst seçiciden önce bir tür seçiciye nasıl başvurabilirim?

Yanıtlar:


159

Kumar'ın işaret ettiği gibi , bu Sass'tan beri mümkün 3.3.0.rc.1 (Maptastic Maple).

@ At-root yönergesi, bir veya daha fazla kuralın, üst seçicilerinin altına yerleştirilmek yerine, belgenin kökünde yayınlanmasına neden olur.

Biz birleştirebilirsiniz @at-rootyönergesi ile birlikte enterpolasyon#{} amaçlanan sonuca varmak.

SASS

.item {
    color: black;
    @at-root {
        a#{&} {
            color:blue;
        }
    }
}

// Can also be written like this.
.item {
    color: black;
    @at-root a#{&} {
        color:blue;
    }
}

CSS Çıktısı

.item {
    color: black;
}
a.item {
    color: blue;
}

3
Bu sorunun çözümü bu olmalı.
Kayhadrin

Bu benim için çalışmıyor ... .item a.itembir sebepten dolayı çıktı çıkıyor. Ben a#{&}de kendi başıma yapmayı denedim ve hala aynı sonuç.
jaminroe

@jaminroe Libsass kullanıyor musunuz? Bu edilecek 3.3'de sabit .
Blaine

1
@jaminroe, kaputun altında libsass (node-sass) kullanıyor gibi görünüyor. Bu durumda, 3.3'e kadar beklemeniz gerekir.
Blaine

1
Çözmem gereken biraz daha zor bir versiyonum var , benzer, ancak birden fazla sınıfta, bir etikete eklenmesi gereken - kimse?
Frank Nocke

30

@at-rootEğer zincirin yukarı yakın seçici uzatmak niyetinde olmadığını -sadece yöntem sorunu çözmez. Örnek olarak:

#id > .element {
    @at-root div#{&} {
        color: blue;
    }
}

Şu şekilde derlenecek:

div#id > .element {
    color: blue;
}

Bunun .elementyerine etiketinize katılmanız gerekirse ne olur #id?

Sass'ta selector-unify()bunu çözen bir işlev var . @at-rootBunu kullanarak hedeflemek mümkündür .element.

#id > .element {
    @at-root #{selector-unify(&, div)} {
        color: blue;
    }
}

Şu şekilde derlenecek:

#id > div.element {
    color: blue;
}

1
Bu bana istenen sonucu vermedi. Sass 3.4.11'de bu #id > .element #id > div.element { color: blue; },. Diğer bir yaklaşım kullanımına olacağını selector_replace, #id { > .element { @at-root #{selector-replace(&,'.element', 'div.element')} { color: blue;}}}. Daha iyi okunabilirlik için işte bir Özet .
Blaine

@Blaine Göze çarpan bir hata buldunuz, teşekkürler. Cevabımı çalışan bir çözümle düzenledim.
Ben Fleming

1
Bununla selector-replacebirlikte, bunu yapmanın başka bir yolu da, ancak seçicinin ne olduğunu bilmeyi gerektiriyor. selector-unifyYöntem Mixins kullanılan yararı vardır.
Ben Fleming

Harika cevap.
Senthe

8

Yeni başlayanlar için (bu cevabı yazarken) seçici & kullanan bir sass sözdizimi yoktur . Böyle bir şey yapacak olsaydın, seçici ile ve işareti arasında bir boşluk olması gerekirdi. Örneğin:

.item {
    .helper & {

    }
}

// compiles to:
.helper .item {

}

Ve işaretini kullanmanın diğer yolu, muhtemelen (yanlış) aradığınız şeydir:

.item {
    &.helper {

    }
}

// compiles to:
.item.helper {

}

Bu, seçicileri diğer sınıflarla, kimliklerle, sözde seçicilerle vb. Genişletmenize izin verir. Ne yazık ki sizin durumunuz için, bu teorik olarak .itema gibi bir şeye derlenir ve bu açıkça işe yaramaz.

CSS'nizi nasıl yazdığınızı yeniden düşünmek isteyebilirsiniz. Kullanabileceğiniz bir ana öğe var mı?

<div class="item">
    <p>text</p>
    <p>text</p>
    <a href="#">a link</a>
</div>

Bu şekilde, SASS'nizi aşağıdaki şekilde kolayca yazabilirsiniz:

.item {
    p {
        // paragraph styles here
    }
    a {
        // anchor styles here
    }
}

(Yan not: html'nize bir göz atmalısınız. Tek ve çift tırnakları karıştırıyorsunuz VE href niteliklerini p etiketlerine koyuyorsunuz.)


@ Lübnah Kabul ediyorum ancak mikro performans kazanımları için en iyi uygulamaları tanımlamaya çalışmıyorum. Çalışan CSS yazmak için bir hrefetiket koyan birini bulmaya çalışıyorum p.
imjared

& .Selector'ın kötü bir uygulama olduğunu söylemek için kesinlikle hiçbir destek yok, tam olarak OP'nin yayınladığı gibi tonlarca kullanım durumu var.
Mike Mellor

@MikeMellor OP yazdı .item { a& }ve bunun için hiçbir sass sözdizimi yok ( bildiğim kadarıyla, muhtemelen Sass'ta oldukça düzenli kullanılan ve tarif ettiğiniz ve sözdizimi gibi bir şey aradığını önerdim. Ancak, OP'nin örneğine dayanarak .item { &a }, geçerli değil ve derleme.itema . Aynen
cevabımda

.item { a& { ... } }@Blaine'in belirttiği gibi artık yapılabilecek olan OP aranıyor .item { @at-root a#{&} { ... } }. Mesele şu ki, eleman üzerinde bir sınıfınız varsa, yapması kolaydır, .item { &.class { ... } }öyleyse neden aynı şeyi ham bir html elemanıyla yapamayasınız? OP'nin yayınlandığı zaman itibariyle bunu yapmanın bir yolu olmadığı için, işlevselliğin bunu gerçekten yapmasını istemekte hatalı olduğu anlamına gelmez.
Mike Mellor

4

AFAIK Sınıf ve etiketler için ve işaretlerini aynı anda birleştirmek isterseniz, bu sözdizimini kullanmanız gerekir:

.c1 {
  @at-root h1#{&},
    h2#{&}
    &.c2, {
    color: #aaa;
  }
}

derlenecek

h1.c1,
h2.c1,
.c1.c2 {
  color: #aaa;
}

Diğer kullanımlar ( @at-rootbirden fazla sınıftaki sınıfın kullanılması gibi @at-root) hatalara yol açacaktır.

Umarım faydalı olur


1
Bunu az önce kullandım, örneğin span veya div öğeleri için davranışı değiştirmek istediğiniz
mixinler

vay - çok havalı :-) Yani #{&}temelde derleyiciyi kandırıyor - yoksa bu gelecekte her zaman işe yarayacak mı?
Simon_Weaver

@Simon_Weaver, içindeki her şey #{}değerlendirilir. Ayrıca &mevcut seçici anlamına gelir. Yani #{&}değerlendirilir .c1.
Vahid

Ama tek başına işe yaramadığı anlamında kandırıyorsun ;-)
Simon_Weaver

1
@Simon_Weaver daha fazla örnek için bu bağlantıya bakın&
Vahid

3

Bu özellik, Sass'ın en yeni sürümüne indi, 3.3.0.rc.1(Maptastic Maple)

Kullanmanız gereken birbiriyle yakından ilişkili iki özellik &, üst öğelere başvurmak için yuvalanmış stiller içinde enterpolasyon yapabileceğiniz komut dosyası yazılabilir @at-rootve hemen ardından gelen css seçicisini veya bloğunu köke yerleştiren direktiftir ( çıkarılan css'de herhangi bir ebeveyn var)

Daha fazla ayrıntı için bu Github sorununa bakın

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.