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