Selektor CSSSelektory

&

Pozwala pisać reguły wewnątrz innych reguł, jak w Sass. Znak & oznacza w nich selektor reguły nadrzędnej.

Na tej stronie

Przykład

#
CSS
.btn {
  padding: 8px 14px;
  border: 0;
  border-radius: 8px;
  background: #7c3aed;
  color: #fff;

  &:hover {
    background: #6d28d9;
  }

  &.ghost {
    background: transparent;
    outline: 1px solid #7c3aed;
  }

  .icon {
    margin-right: 6px;
  }
}
Podgląd

Definicja i zastosowanie

#

Natywne zagnieżdżanie CSS pozwala umieścić jedną regułę w środku drugiej. Zagnieżdżona reguła dotyczy elementów wewnątrz rodzica, więc .card { p { … } } działa jak .card p { … }. Kod komponentu trzymasz w jednym bloku i nie powtarzasz wielokrotnie nazwy klasy.

Znak & oznacza selektor reguły nadrzędnej. Jest potrzebny, gdy selektor ma przykleić się do rodzica bez spacji: &:hover to najechanie na sam element, &.active to element z dodatkową klasą, a &::before jego pseudoelement. Bez & przeglądarka potraktuje zagnieżdżony selektor jak potomka. & może też stać na końcu: .dark & { … } zmienia styl elementu, gdy leży wewnątrz .dark.

W środku reguły możesz umieszczać także @media i @supports, a zapisane w nich deklaracje trafiają wprost do bieżącego selektora. To wygodne przy stylach responsywnych: wszystko, co dotyczy przycisku, jest w jednym miejscu.

Od Sass różni się w szczegółach. Przeglądarka nie skleja fragmentów nazw, więc &__title nie zbuduje klasy .card__title. Selektor & działa też jak :is(): gdy rodzicem jest lista #logo, .brand, zagnieżdżona reguła dostaje wagę najmocniejszego selektora z tej listy.

Składnia

#
Składnia
rodzic {
  właściwość: wartość;
  potomek { … }
  &:hover { … }
  &.klasa { … }
  .kontekst & { … }
}

Warianty zapisu

#
  • span

    bez &

    Zagnieżdżony selektor bez & oznacza potomka, tak jak .demo span. Etykiety we wszystkich kartach zmieniają kolor.
  • &:hover

    Najedź kursorem na dowolną kartę. & dokleja pseudoklasę do samej karty, bez spacji.
  • &.active

    Karta, która ma dodatkowo klasę active. Samo .active w środku reguły szukałoby potomka z tą klasą.
  • .promo &

    & na końcu odwraca kierunek: karta dostaje styl, gdy leży wewnątrz .promo.
  • @media (min-width: 300px)

    Reguła @media w środku bloku dotyczy od razu .demo. Podgląd ma ponad 300 px szerokości, więc karty są niebieskie.

Warianty zapisu w praktyce

#

span

Zagnieżdżony selektor bez & oznacza potomka, tak jak .demo span. Etykiety we wszystkich kartach zmieniają kolor.
.demo {
  span { color: #fbbf24; }
}

&:hover

Najedź kursorem na dowolną kartę. & dokleja pseudoklasę do samej karty, bez spacji.
.demo {
  &:hover { background: #7c3aed; }
}

&.active

Karta, która ma dodatkowo klasę active. Samo .active w środku reguły szukałoby potomka z tą klasą.
.demo {
  &.active { background: #7c3aed; }
}

.promo &

& na końcu odwraca kierunek: karta dostaje styl, gdy leży wewnątrz .promo.
.demo {
  .promo & { background: #7c3aed; }
}

@media (min-width: 300px)

Reguła @media w środku bloku dotyczy od razu .demo. Podgląd ma ponad 300 px szerokości, więc karty są niebieskie.
.demo {
  @media (min-width: 300px) {
    background: #0284c7;
  }
}

Więcej przykładów

#
Zapytanie @media w środku komponentu
CSS
.grid {
  display: grid;
  gap: 8px;

  @media (min-width: 560px) {
    grid-template-columns: repeat(3, 1fr);
  }
}
Podgląd

Na szerokim ekranie elementy stoją w trzech kolumnach, na telefonie jeden pod drugim. Całe zachowanie siatki mieści się w jednym bloku.

Obsługa przeglądarek

#

Szeroko dostępne · od 2023 roku

Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.

  • Chrome
  • Edge
  • Firefox
  • Safari

Dobre praktyki

#
  • Nie zagnieżdżaj głębiej niż na dwa, trzy poziomy. Każdy poziom to dłuższy selektor i wyższa specyficzność, dokładnie jak przy ręcznie pisanym łańcuchu.
  • Pseudoklasy i pseudoelementy zawsze zapisuj z &: &:hover, &::after. Samo :hover w środku reguły znaczy „dowolny potomek pod kursorem”.
  • Jeśli strona musi działać w przeglądarkach sprzed końca 2023 roku, zostań przy preprocesorze (Sass, PostCSS), który zamieni zagnieżdżenia na zwykły CSS.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.