Czym jest selektor CSS
Selektor to część reguły przed nawiasami klamrowymi. Decyduje, do których elementów stosują się deklaracje.
p.note { color: #2563eb; }
/* selector: p.note declaration: color: #2563eb */
Pięć podstawowych selektorów wystarcza w większości prawdziwych arkuszy stylów:
Rodzaje selektorów w skrócie
| Selektor | Przykład | Pasuje do |
|---|---|---|
| Uniwersalny | * | Każdego elementu |
| Typu | p | Każdego <p> |
| Klasy | .tip | Elementów z class="tip" (między innymi) |
| ID | #main-title | Elementu z id="main-title" |
| Atrybutu | [type="email"] | Elementów, których atrybut pasuje |
| Pseudoklasa | a:hover, li:first-child | Elementów w danym stanie lub pozycji |
| Pseudoelement | p::first-line, .x::before | Części elementu |
| Grupa | h1, h2, h3 | Wszystkiego, co pasuje do jednego z listy |
| Złożony | p.tip | <p>, który ma też tę klasę |
Klasy i ID mają własną stronę, selektor klasy CSS. Pseudoklasy, takie jak :nth-child() i :not(), omawia strona o pseudoklasach.
Kombinatory: potomek a dziecko
Kombinator łączy dwa selektory według ich relacji w drzewie HTML. Są cztery.
| Kombinator | Składnia | Pasuje do B, gdy |
|---|---|---|
| Potomka | A B (spacja) | B jest gdziekolwiek wewnątrz A |
| Dziecka | A > B | Rodzicem B jest A |
| Sąsiedniego rodzeństwa | A + B | B następuje zaraz po A, z tym samym rodzicem |
| Ogólnego rodzeństwa | A ~ B | B następuje gdzieś po A, z tym samym rodzicem |
Spacja i > to para, którą najczęściej się myli. Selektor potomka sięga na dowolną głębokość; selektor dziecka zatrzymuje się na jednym poziomie:
Kombinatory rodzeństwa: + i ~
Rodzeństwo patrzy tylko do przodu. Nie ma kombinatora "poprzedniego rodzeństwa", choć da się to wyrazić przez :has(): h2:has(+ p) pasuje do h2, po którym bezpośrednio następuje p.
Selektory atrybutów
Nawiasy kwadratowe dopasowują atrybuty i ich wartości:
| Selektor | Pasuje, gdy |
|---|---|
[disabled] | Ma atrybut, z dowolną wartością |
[type="email"] | Wartość to dokładnie email |
[href^="https"] | Wartość zaczyna się od https |
[href$=".pdf"] | Wartość kończy się na .pdf |
[class*="icon"] | Wartość zawiera gdziekolwiek icon |
[lang|="en"] | Wartość to en lub zaczyna się od en- |
[data-state="open" i] | Dokładne dopasowanie, bez rozróżniania wielkości liter |
Selektory atrybutów na atrybutach data-* to czysty sposób na stylizowanie stanu ustawianego przez JavaScript, bez wymyślania nazw klas.
Wypróbuj dowolny selektor
Wpisz selektor w pole. Każdy pasujący element dostaje bursztynowy kontur, a poniżej pojawia się ich liczba.
Wypróbuj #demo a, ul > li, h2 ~ *, a[href^="https"], li:not(.active).
Złożony a potomka: spacja ma znaczenie
p.note i p .note różnią się jedną spacją i znaczą co innego.
Jak przeglądarki czytają selektory
Gdy kilka reguł pasuje do tego samego elementu i ustawia tę samą właściwość, wygrywa bardziej specyficzny selektor, a przy remisie późniejszy. ID waży więcej niż dowolna liczba klas, a klasa więcej niż dowolna liczba selektorów typu; strona o !important zawiera pełną tabelę specyficzności.
Grupa ma jeden haczyk: jeśli którykolwiek selektor na zwykłej liście jest nieprawidłowy, cała reguła przepada. W a, b:unknown { } nie zostaną ostylowane nawet linki. Otoczenie listy przez :is() czyni ją wyrozumiałą, więc :is(a, b:unknown) nadal stylizuje linki.
Częste błędy
- Brak kropki lub krzyżyka.
tip { }celuje w element<tip>, a nie wclass="tip". Pisz.tip. - Spacja w selektorze złożonym.
p .noteto niep.note. - Oczekiwanie, że
>sięgnie do wnuków. Dla dowolnej głębokości użyj spacji. - Jedna literówka psuje całą grupę. W
h1, h2:hovr, h3nic nie zostaje ostylowane. - Zbyt długie selektory.
body div.wrapper ul li atrudno się czyta i trudno go nadpisać. Zwykle wystarczy jedna klasa.
Najczęściej zadawane pytania
Czym jest selektor CSS?
To część reguły CSS przed {, która mówi, do których elementów stosują się deklaracje. W p.note { color: blue; } selektor p.note pasuje do każdego <p> z klasą note.
Czym różni się spacja od > w selektorze CSS?
Spacja to kombinator potomka: nav a pasuje do każdego linku w dowolnym miejscu wewnątrz nav, na dowolnej głębokości. > to kombinator dziecka: nav > a pasuje tylko do linków, których bezpośrednim rodzicem jest nav.
Co oznacza + w CSS?
+ to kombinator sąsiedniego rodzeństwa. h2 + p pasuje do <p>, który następuje bezpośrednio po <h2> z tym samym rodzicem. ~ jest luźniejszy: h2 ~ p pasuje do każdego późniejszego <p> z rodzeństwa.
Jak wybierać elementy według atrybutu w CSS?
Umieść atrybut w nawiasach kwadratowych: [disabled] pasuje do elementów, które go mają, [type="email"] do dokładnej wartości, [href^="https"] do wartości zaczynającej się od ciągu znaków, [href$=".pdf"] do takiej, która się nim kończy, a [class*="btn"] do takiej, która go zawiera.
Czy CSS może wybrać element rodzica?
Tak, za pomocą pseudoklasy :has(), obsługiwanej w aktualnych wersjach Chrome, Firefoksa i Safari. li:has(> a.active) pasuje do elementów listy, które bezpośrednio zawierają aktywny link.