Pseudoklasa relacyjna :has()
Wybieraj elementy nadrzędne na podstawie ich elementów potomnych, używając zaawansowanej pseudoklasy relacyjnej :has().
Pseudoklasa relacyjna :has() to bezpłatna lekcja CSS Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej CSS Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs CSS Academy zawiera 4 lekcji w sumie.
Czym jest :has()?
Pseudoklasa :has() wybiera element, jeśli zawiera element potomny pasujący do argumentu. Często nazywana „selektorem rodzica” umożliwia stylowanie elementu nadrzędnego na podstawie jego elementów potomnych — jest to możliwość, której wcześniej CSS nie oferował.
Podstawowa składnia
.card:has(img) wybiera dowolny element .card, który zawiera element potomny img. Argument jest listą selektorów względnych — dowolnymi poprawnymi selektorami CSS opisującymi elementy względem elementu będącego przedmiotem selekcji.
Stylowanie elementów nadrzędnych
Można stylować kontener formularza, gdy zawiera nieprawidłowe pole: form:has(:invalid) { border-color: red; }. Można też stylować sekcję zawierającą nagłówek: section:has(h2) { padding-top: 2rem; }. Element nadrzędny zmienia wygląd na podstawie stanu elementu potomnego.
Wybieranie elementów rodzeństwa
:has() może wybierać poprzedzające elementy rodzeństwa — czego nie potrafią + ani ~. h2:has(+ p) wybiera elementy h2, po których bezpośrednio następują elementy p. li:has(~ .active) wybiera elementy li, które mają późniejszy element rodzeństwa .active.
Stylowanie stanu formularza
Można reagować na natywną poprawność formularza bez JavaScriptu: input:has(~ .error-msg) styluje pole input mające element rodzeństwa z komunikatem o błędzie. label:has(+ input:required) styluje etykiety, których powiązane pole input jest wymagane — wszystko wyłącznie za pomocą CSS.
Stan nawigacji
Można wyróżniać kontenery nawigacji na podstawie aktywnego elementu potomnego: nav:has(.active) stosuje style do całego nav, gdy dowolny element potomny ma klasę active. Jest to przydatne do wskazywania na poziomie kontenera, która sekcja nawigacji jest bieżąca.
Łączenie z innymi pseudoklasami
.grid:has(.card:focus-within) styluje całą siatkę, gdy dowolny card otrzyma fokus z klawiatury. .dropdown:has(:hover) utrzymuje listę rozwijaną otwartą podczas wskazywania dowolnego elementu potomnego — jest to prostsze niż złożone łańcuchy kombinatorów rodzeństwa.
Odpowiednik zapytania media w CSS
.sidebar:has(nav) stosuje inny układ niż .sidebar:not(:has(nav)). Układ warunkowy bez JavaScriptu: obecność lub brak określonych elementów potomnych steruje układem elementu nadrzędnego, umożliwiając tworzenie naprawdę adaptacyjnego CSS uwzględniającego treść.
Kwestie wydajności
:has() z szerokimi selektorami argumentów (np. :has(*)) może być kosztowne — przeglądarka musi sprawdzić każdy element. Argumenty :has() powinny być konkretne. Jeśli to możliwe, proszę wybierać :has(> .specific-child) (bezpośredni element potomny) zamiast :has(.specific-child) (dowolny element potomny).
Obsługa przeglądarek
:has() jest obsługiwane w Chrome 105+, Safari 15.4+ i Firefox 121+. Pełna obsługa w ramach standardu baseline jest dostępna od końca 2023 roku. Nie istnieje polyfill (jego działanie wymagałoby symulacji za pomocą JavaScriptu), dlatego w starszych przeglądarkach należy stosować tę funkcję z progresywnym ulepszaniem, gdy nie jest ona kluczowa.
Zastępowanie wzorców JavaScriptu
Wzorce, które wcześniej wymagały nasłuchiwania zdarzeń w JS: „dodaj klasę do elementu nadrzędnego, gdy element potomny otrzyma fokus”, „pokaż nakładkę, gdy istnieje wyzwalacz modalu”, „styluj siatkę inaczej, gdy ma dokładnie trzy elementy”. :has() obsługuje wszystkie te przypadki deklaratywnie.
Sprawdzenie wiedzy
Co wyróżnia :has() na tle istniejących kombinatorów CSS, takich jak + i ~?
Podsumowanie
:has() to pierwsza prawdziwa relacyjna pseudoklasa CSS, która umożliwia wybieranie elementów nadrzędnych i poprzedzających elementów rodzeństwa. Umożliwia stylowanie zależne od treści, reagowanie na stan formularza, wyróżnianie nawigacji oraz wiele wzorców, które wcześniej wymagały manipulowania DOM-em za pomocą JavaScriptu — wszystko to deklaratywnie w CSS.
Często zadawane pytania
Czy lekcja „Pseudoklasa relacyjna :has()” jest bezpłatna?
Tak — pełny tekst „Pseudoklasa relacyjna :has()” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu CSS Academy, przejdź na CoddyKit PRO. Kurs CSS Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Pseudoklasa relacyjna :has()”?
Wybieraj elementy nadrzędne na podstawie ich elementów potomnych, używając zaawansowanej pseudoklasy relacyjnej :has(). Ćwiczysz CSS Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć CSS Academy?
Nie wymagamy żadnego doświadczenia. CSS Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Pseudoklasa relacyjna :has()”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji CSS Academy?
Tak. Każda lekcja CSS Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Natywne zagnieżdżanie CSS
- Pseudoklasa relacyjna :has()
- @scope dla stylów o ograniczonym zakresie
- View Transitions API