Zagnieżdżanie reguł stylów CSS może sprawić, że arkusze stylów będą bardziej uporządkowane, czytelne i łatwiejsze w utrzymaniu.
Przegląd
Skoro wiesz już, czym są selektory, pewnie zastanawiasz się, jak lepiej je uporządkować w arkuszach stylów. Załóżmy, że stosujesz style do elementów w sekcji „Funkcje” w swojej witrynie. Dzięki zagnieżdżaniu możesz zgrupować te style w regule .feature w ten sposób:
.feature {
button {
color: blue;
}
.link {
color: red;
}
.text {
font-size: 1.3em;
}
}
To tak, jakby każdy styl był zapisywany osobno:
.feature button {
color: blue;
}
.feature .link {
color: red;
}
.feature .text {
font-size: 1.3em;
}
Zagnieżdżanie może mieć dowolną liczbę poziomów.
.feature {
.heading {
color: blue;
a {
color: green;
}
}
}
Grupowanie i tworzenie relacji
Zagnieżdżanie umożliwia bardziej zwięzłe grupowanie reguł stylów i ustalanie między nimi relacji.
Domyślnie zagnieżdżona reguła będzie powiązana z regułą zewnętrzną za pomocą kombinatora potomka. Aby zmienić relacje, użyj selektorów w zagnieżdżonych regułach.
/* targets headings that are siblings of the .feature element and come immediately after it */
.feature {
+ .heading {
color: blue;
}
/* targets all paragraphs that are direct children of the .feature element */
> p {
font-size: 1.3em;
}
}
Definiowanie relacji bezpośrednich za pomocą selektora &
Możesz też użyć selektora &, aby bardziej precyzyjnie określić zagnieżdżanie reguł stylu. Symbol & reprezentuje selektor elementu nadrzędnego.
.feature {
& button {
color: blue;
}
}
Odpowiadałoby to zapisaniu stylów w ten sposób:
.feature button {
color: blue;
}
Kiedy wymagane jest &
Bez symbolu & zagnieżdżone selektory będą selektorami potomków selektora nadrzędnego. Aby utworzyć selektory złożone, & jest wymagany.
.feature {
&:last-child {
/* Selects the .feature element that is the :last-child, equivalent to .feature:last-child */
}
& :last-child {
/* Selects the :last-child inside of a .feature element, equivalent to .feature :last-child */
}
&.highlight {
/* Selects .feature elements that also have a .highlight class, equivalent to .feature.highlight */
}
& .highlight {
/* Selects elements inside of the .feature element with the class .highlight, equivalent to .feature .highlight */
}
}
Możesz też zmienić kontekst i umieścić selektor & na końcu selektora podrzędnego lub po obu jego stronach.
/* Targets buttons with an adjacent sibling button */
button {
& + & {
/* … */
}
}
img {
.my-component & {
/* styles for images inside of `.my-component` ... */
}
}
W ostatnim przykładzie dodajemy style do obrazów w elemencie z klasą .my-component. Może to być przydatne, jeśli pracujesz nad projektem, w którym nie możesz dodać elementu class ani id.
Zagnieżdżanie i specyficzność
Podobnie jak :is(), selektor zagnieżdżania przyjmuje szczegółowość selektora o najwyższej szczegółowości na liście selektorów elementu nadrzędnego.
#main-header,
.intro {
& a {
color: green;
}
}
.intro a {
color: blue;
}
Pierwsza reguła kieruje reklamy na wszystkie linki w elementach #main-header i .intro, nadając im zielony kolor.
Druga reguła próbuje to zastąpić, aby linki w elemencie .intro były niebieskie.
Jeśli przyjrzymy się szczegółowości każdej reguły, zobaczymy, dlaczego to nie działa.
/* equivalent to :is(#main-header, .intro) a with a specificity of (1, 0, 1) */
#main-header,
.intro {
& a {
color: green;
}
}
/* lower specificity of (0, 1, 1) */
.intro a {
color: blue;
}
Ponieważ pierwsza reguła ma w swojej liście selektorów symbol id, a reguły zagnieżdżone przyjmują specyficzność selektora o najwyższej specyficzności, ma ona wyższą specyficzność niż druga reguła. Linki są zielone nawet w przypadku elementów a, które nie znajdują się w elemencie z selektorem #main-header.
Nieprawidłowe zagnieżdżenie
Podobnie jak w przypadku selektora :is(), selektor zagnieżdżania nie może reprezentować pseudoelementów.
blockquote, blockquote::before, blockquote::after {
color: navy;
& {
border: 1px solid navy;
}
}
Można by oczekiwać, że element blockquote i jego pseudoelementy będą miały tekst i obramowania w kolorze navy, ale tak nie jest. Selektor & nie może reprezentować pseudoelementów, więc zagnieżdżone style obramowania będą stosowane tylko do elementu blockquote.
Podczas tworzenia selektorów złożonych za pomocą selektorów & i typu selektor typu musi być pierwszy i nie może być między nimi spacji.
/* valid css nesting */
.feature {
p& {
font-weight: bold;
}
}
/* invalid css nesting */
.feature {
&p {
font-weight: bold;
}
}
Ta reguła umożliwia zagnieżdżanie CSS w połączeniu z narzędziami do wstępnego przetwarzania, takimi jak Sass. W Sass zapisanie &p spowoduje dołączenie selektora nadrzędnego do zagnieżdżonego selektora typu, a wynikiem będzie .featurep.
Zagnieżdżanie reguł @
Reguły grup warunkowych CSS, takie jak @container, @media, @supports i @layer, mogą być też zagnieżdżone.
.feature {
@media (min-width: 40em) {
/* ... */
}
@container (inline-size > 900px) {
/* ... */
}
}
.feature {
@supports (display: grid) {
/* ... */
}
}
.feature {
@layer component {
h2 {
/* ... */
}
}
}
Sprawdź swoją wiedzę
Co oznacza selektor & w przypadku zagnieżdżania CSS?
Możesz zagnieżdżać tylko na 2 poziomach.
Które reguły @ można zagnieżdżać?
@media@container@import@supports@layer