Elternselektor
Der Parent-Selektor, &, ist ein spezieller Selektor, der von Sass erfunden wurde und in verschachtelten Selektoren verwendet wird, um auf den äußeren Selektor zu verweisen. Er ermöglicht die Wiederverwendung des äußeren Selektors auf komplexere Weise, z. B. durch Hinzufügen einer Pseudo-Klasse oder durch Hinzufügen eines Selektors *vor* dem Parent.
Wenn ein Parent-Selektor in einem inneren Selektor verwendet wird, wird er durch den entsprechenden äußeren Selektor ersetzt. Dies geschieht anstelle des normalen Verschachtelungsverhaltens .
SCSS-Syntax
.alert {
// The parent selector can be used to add pseudo-classes to the outer
// selector.
&:hover {
font-weight: bold;
}
// It can also be used to style the outer selector in a certain context, such
// as a body set to use a right-to-left language.
[dir=rtl] & {
margin-left: 0;
margin-right: 10px;
}
// You can even use it as an argument to pseudo-class selectors.
:not(&) {
opacity: 0.8;
}
}
Sass-Syntax
.alert
// The parent selector can be used to add pseudo-classes to the outer
// selector.
&:hover
font-weight: bold
// It can also be used to style the outer selector in a certain context, such
// as a body set to use a right-to-left language.
[dir=rtl] &
margin-left: 0
margin-right: 10px
// You can even use it as an argument to pseudo-class selectors.
:not(&)
opacity: 0.8
CSS-Ausgabe
.alert:hover {
font-weight: bold;
}
[dir=rtl] .alert {
margin-left: 0;
margin-right: 10px;
}
:not(.alert) {
opacity: 0.8;
}
⚠️ Vorsicht!
Da der Parent-Selektor durch einen Typselektor wie h1 ersetzt werden könnte, ist er nur am Anfang von zusammengesetzten Selektoren erlaubt, wo auch ein Typselektor erlaubt wäre. Zum Beispiel ist span& nicht erlaubt.
Wir erwägen jedoch, diese Einschränkung zu lockern. Wenn Sie dazu beitragen möchten, werfen Sie einen Blick auf dieses GitHub Issue.
Hinzufügen von SuffixenHinzufügen von Suffixen Permalink
Sie können den Parent-Selektor auch verwenden, um dem äußeren Selektor zusätzliche Suffixe hinzuzufügen. Dies ist besonders nützlich, wenn Sie eine Methodik wie BEM verwenden, die stark strukturierte Klassennamen verwendet. Solange der äußere Selektor mit einem alphanumerischen Namen endet (wie bei Klassen-, ID- und Elementselektoren), können Sie den Parent-Selektor verwenden, um zusätzlichen Text anzuhängen.
SCSS-Syntax
.accordion {
max-width: 600px;
margin: 4rem auto;
width: 90%;
font-family: "Raleway", sans-serif;
background: #f4f4f4;
&__copy {
display: none;
padding: 1rem 1.5rem 2rem 1.5rem;
color: gray;
line-height: 1.6;
font-size: 14px;
font-weight: 500;
&--open {
display: block;
}
}
}
Sass-Syntax
.accordion
max-width: 600px
margin: 4rem auto
width: 90%
font-family: "Raleway", sans-serif
background: #f4f4f4
&__copy
display: none
padding: 1rem 1.5rem 2rem 1.5rem
color: gray
line-height: 1.6
font-size: 14px
font-weight: 500
&--open
display: block
CSS-Ausgabe
.accordion {
max-width: 600px;
margin: 4rem auto;
width: 90%;
font-family: "Raleway", sans-serif;
background: #f4f4f4;
}
.accordion__copy {
display: none;
padding: 1rem 1.5rem 2rem 1.5rem;
color: gray;
line-height: 1.6;
font-size: 14px;
font-weight: 500;
}
.accordion__copy--open {
display: block;
}
In SassScriptIn SassScript Permalink
Der Parent-Selektor kann auch innerhalb von SassScript verwendet werden. Es ist ein spezieller Ausdruck, der den aktuellen Parent-Selektor im gleichen Format zurückgibt, wie es von Selektorfunktionen verwendet wird: eine durch Kommas getrennte Liste (die Selektorliste), die durch Leerzeichen getrennte Listen (die komplexen Selektoren) enthält, die ungequotete Zeichenketten (die zusammengesetzten Selektoren) enthalten.
SCSS-Syntax
.main aside:hover,
.sidebar p {
parent-selector: &;
// => ((unquote(".main") unquote("aside:hover")),
// (unquote(".sidebar") unquote("p")))
}
Sass-Syntax
.main aside:hover,
.sidebar p
parent-selector: &
// => ((unquote(".main") unquote("aside:hover")),
// (unquote(".sidebar") unquote("p")))
CSS-Ausgabe
.main aside:hover,
.sidebar p {
parent-selector: .main aside:hover, .sidebar p;
}
Wenn der &-Ausdruck außerhalb von Stilregeln verwendet wird, gibt er null zurück. Da null falsey ist, können Sie ihn leicht verwenden, um festzustellen, ob ein Mixin in einer Stilregel aufgerufen wird oder nicht.
SCSS-Syntax
@mixin app-background($color) {
#{if(&, '&.app-background', '.app-background')} {
background-color: $color;
color: rgba(#fff, 0.75);
}
}
@include app-background(#036);
.sidebar {
@include app-background(#c6538c);
}
Sass-Syntax
@mixin app-background($color)
#{if(&, '&.app-background', '.app-background')}
background-color: $color
color: rgba(#fff, 0.75)
@include app-background(#036)
.sidebar
@include app-background(#c6538c)
CSS-Ausgabe
.app-background {
background-color: #036;
color: rgba(255, 255, 255, 0.75);
}
.sidebar.app-background {
background-color: #c6538c;
color: rgba(255, 255, 255, 0.75);
}
Erweiterte VerschachtelungErweiterte Verschachtelung Permalink
Sie können & als normalen SassScript-Ausdruck verwenden, was bedeutet, dass Sie ihn an Funktionen übergeben oder in Interpolation einbeziehen können – sogar in anderen Selektoren! Die Verwendung in Kombination mit Selektorfunktionen und der @at-root-Regel ermöglicht es Ihnen, Selektoren auf sehr leistungsfähige Weise zu verschachteln.
Angenommen, Sie möchten zum Beispiel einen Selektor schreiben, der mit dem äußeren Selektor *und* einem Elementselektor übereinstimmt. Sie könnten einen Mixin wie diesen schreiben, der die selector.unify()-Funktion verwendet, um & mit einem vom Benutzer bereitgestellten Selektor zu kombinieren.
SCSS-Syntax
@use "sass:selector";
@mixin unify-parent($child) {
@at-root #{selector.unify(&, $child)} {
@content;
}
}
.wrapper .field {
@include unify-parent("input") {
/* ... */
}
@include unify-parent("select") {
/* ... */
}
}
Sass-Syntax
@use "sass:selector"
@mixin unify-parent($child)
@at-root #{selector.unify(&, $child)}
@content
.wrapper .field
@include unify-parent("input")
/* ... */
@include unify-parent("select")
/* ... */
CSS-Ausgabe
.wrapper input.field {
/* ... */
}
.wrapper select.field {
/* ... */
}
⚠️ Vorsicht!
Wenn Sass Selektoren verschachtelt, weiß es nicht, welche Interpolation zur Generierung dieser Selektoren verwendet wurde. Das bedeutet, dass es automatisch den äußeren Selektor zum inneren Selektor hinzufügt, *auch wenn* Sie & als SassScript-Ausdruck verwendet haben. Deshalb müssen Sie explizit die @at-root-Regel verwenden, um Sass anzuweisen, den äußeren Selektor nicht einzuschließen.