0Pricing
CSS Academy · Lekcja

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

  1. Natywne zagnieżdżanie CSS
  2. Pseudoklasa relacyjna :has()
  3. @scope dla stylów o ograniczonym zakresie
  4. View Transitions API
← Powrót do CSS Academy