Das Zeichen & in Sass ist einzigartig, da es den aktuellen Selektor darstellt. Es ändert sich, wenn Sie verschachteln. Nehmen wir an, Sie sind verschachtelt, möchten aber auf einen Selektor etwas weiter oben im Verschachtelungsgrad zugreifen. Der Trick besteht darin, & zu cachen und tiefer in der Verschachtelung zu verwenden. So
.parent {
$this: &;
&--elem {
display: inline-block;
&:hover,
#{$this}__variation--active & {
background: red;
}
}
}
Was kompiliert zu
.parent--elem {
display: inline-block;
}
.parent--elem:hover, .parent__variation--active .parent--elem {
background: red;
}
(Danke an Sergey Kovalenko für diesen Trick!)
Das bedeutet, dass Sie .parent und .parent--elem gleichzeitig innerhalb eines Selektors verwenden konnten. Ein wenig esoterisch, aber manchmal nützlich. Es vermeidet Situationen, in denen Sie @at-root verwenden müssten, um ganz nach oben zu gehen und Selektoren neu zu erstellen.
Sergeys Gist enthält Beispiele, die BEM-basiert sind.
<ul class="pagination">
<li class="pagination__item">
<a class="pagination__link" href="#">
Page 1
</a>
</li>
<li class="pagination__item pagination__item--active">
<a class="pagination__link" href="#">
Page 2
</a>
</li>
</ul>
$gray-very-light: #ccc;
.pagination {
display: flex;
padding: 0;
list-style: none;
$this: &;
&__item {
border: 1px solid $gray-very-light;
& + & {
margin-left: .5rem;
}
}
&__link {
display: block;
padding: .25rem .5rem;
text-decoration: none;
&:hover,
#{$this}__item--active & { // Here we get .pagination from $this variable
background-color: $gray-very-light;
}
}
}
Ausgabe
.pagination {
display: flex;
padding: 0;
list-style: none;
}
.pagination__item {
border: 1px solid #ccc;
}
.pagination__item + .pagination__item {
margin-left: .5rem;
}
.pagination__link {
display: block;
padding: .25rem .5rem;
text-decoration: none;
}
.pagination__link:hover,
.pagination__item--active .pagination__link {
background-color: #ccc;
}
Einfach und effektiv, toller Fund Sergey!
Das ist ziemlich süß!
Netter Trick. Ich würde den Selektor allerdings wahrscheinlich eher
$parentSelectornennen als$this, was nicht viel Information vermittelt.Das ist wirklich nett. Ich habe kürzlich an einem LESS-Projekt gearbeitet und es scheint, dass das dort nicht möglich ist. Leider.
Das kann man mit LESS absolut machen, es ist nur ein bisschen anders.
Am Root Ihrer Klasse deklarieren Sie eine Variable unter Ihrem Root-Selektor, z.B.
Ich glaube, es ist so etwas.
Welchen Mehrwert bietet das gegenüber der Wiederholung des Basisklassennamens, z.B. „.parent__variation–active &“?
Dieser Trick funktioniert nicht mehr. Ich habe ihn ausprobiert und die Meldung
Invalid CSS after "&": expected selectorerhalten. Sie müssen also einen Klassennamen in eine Variable setzen.Aber ich habe keine Dokumentation gefunden, die über diese Änderung informiert.