Pseudoklasa CSSPseudoklasy

:has()

Wybiera element na podstawie tego, co zawiera lub co stoi za nim. Pozwala stylować rodzica według jego dzieci.

Na tej stronie

Przykład

#
CSS
.card {
  display: grid;
  gap: 10px;
}

.card:has(img) {
  grid-template-columns: 56px 1fr;
  align-items: center;
}
Podgląd

Definicja i zastosowanie

#

Pseudoklasa :has() sprawdza, czy wewnątrz elementu albo obok niego istnieje coś, co pasuje do podanego selektora. .card:has(img) wybiera karty, które zawierają obrazek, a form:has(:invalid) formularze z przynajmniej jednym błędnym polem. Przez lata taki „selektor rodzica” uchodził w CSS za niemożliwy.

Selektor w nawiasie jest względny wobec elementu. Bez kombinatora oznacza potomka na dowolnej głębokości, z > tylko bezpośrednie dziecko (ul:has(> li.active)), a z + lub ~ rodzeństwo stojące dalej: h2:has(+ p) to nagłówek, za którym stoi akapit. W ten sposób :has() daje też selektor poprzedniego sąsiada.

Warunek działa na żywo. label:has(input:checked) zmieni wygląd etykiety w chwili zaznaczenia pola, a body:has(dialog[open]) może zablokować przewijanie strony, gdy otwarte jest okno. Wiele zadań, które wymagały JavaScriptu, załatwisz jedną regułą.

Specyficzność liczy się jak w :is(): to waga najmocniejszego selektora z listy. :has() nie może zawierać kolejnego :has() ani pseudoelementów. Zawężaj go do konkretnych komponentów, bo bardzo szerokie reguły przeglądarka musi często przeliczać.

Składnia

#
Składnia
:has( <względna lista selektorów> )

Przykładowe selektory

#

Przykładowe selektory w praktyce

#

.card:has(img)

Karty, w których jest obrazek. Karta z samym tekstem zostaje szara.
.card:has(img) { background: #7c3aed; color: #fff; }

.card:has(input:checked)

Zaznacz pole w trzeciej karcie: podświetla się cała karta, a nie tylko pole.
.card:has(input:checked) { background: #7c3aed; color: #fff; }

.card:not(:has(img))

Odwrócony warunek: karty bez obrazka.
.card:not(:has(img)) { background: #7c3aed; color: #fff; }

.demo:has(input:checked)

Kontener reaguje na stan pola leżącego w jego środku. Zaznacz pole i obserwuj ramkę.
.demo:has(input:checked) {
  border-color: #a78bfa;
  background: rgb(124 58 237 / 0.15);
}

Więcej przykładów

#
Pole formularza z błędem
CSS
.field:has(input:invalid) {
  border-color: #f43f5e;
}

.field:has(input:invalid) .error {
  display: block;
}
Podgląd

Wpisz tekst bez znaku @. Ramka i komunikat zmieniają się na poziomie całego pola, choć błąd dotyczy tylko inputu.

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

#
  • Zawężaj :has() do komponentu, np. .card:has(img). Samotne :has(…) bez niczego przed dwukropkiem sprawdza każdy element strony.
  • Starsze przeglądarki pominą regułę z :has() w całości. Zapewnij sensowny wygląd bez niej, a :has() traktuj jako ulepszenie, np. w bloku @supports selector(:has(a)).
  • Zanim dopiszesz rodzicowi klasę w JavaScripcie, sprawdź, czy nie wystarczy :has() z pseudoklasą stanu, taką jak :checked, :focus-visible czy :invalid.

Powiązane hasła

#

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