Menu

Pseudoklasy CSS: nth-child, not, first-child, focus

Pseudoklasy wybierają elementy według pozycji lub stanu: :nth-child(), :first-child, :not(), :focus, :checked, :has() i inne. Poznaj składnię, wzór an+b z testerem na żywo i różnicę między nth-child a nth-of-type.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Czym jest pseudoklasa

Pseudoklasa to słowo kluczowe po dwukropku, które wybiera elementy według ich pozycji w dokumencie albo ich stanu. Dołączasz ją do zwykłego selektora: li:first-child, input:focus, a:hover.

Pseudoklasy stanu dla linków i myszy (:hover, :active, :visited) mają własną stronę, CSS hover.

:nth-child() i wzór an+b

:nth-child() przyjmuje liczbę, słowo kluczowe albo wzór an+b. Przeglądarka sprawdza n = 0, 1, 2, ... i dopasowuje każdą pozycję, którą daje wzór (pozycje zaczynają się od 1).

WzórPasujące pozycjeZnaczenie
33Trzecie dziecko
odd lub 2n+11, 3, 5, ...Nieparzyste wiersze
even lub 2n2, 4, 6, ...Parzyste wiersze
3n3, 6, 9, ...Co trzecie
n+44, 5, 6, ...Czwarte i kolejne
-n+31, 2, 3Pierwsze trzy
3n+11, 4, 7, ...Co trzecie, zaczynając od pierwszego

Wpisz wzór i obserwuj, które elementy pasują:

Wypróbuj odd, even, 4, n+7, -n+5 i 2n+3. Nieprawidłowy wzór nie pasuje do niczego.

Bliźniak liczący od końca to :nth-last-child(): li:nth-last-child(-n+2) wybiera dwa ostatnie elementy.

nth-child kontra nth-of-type

:nth-child() liczy każdy element rodzeństwa, bez względu na znacznik, i dopiero potem sprawdza resztę selektora. :nth-of-type() liczy tylko rodzeństwo z tym samym znacznikiem. Różnicę widać, gdy tylko rodzeństwo jest wymieszane:

Te same pary istnieją dla końców: :first-child / :first-of-type, :last-child / :last-of-type, :only-child / :only-of-type.

:not(), :is() i :where()

PseudoklasaPrzykładPasuje do
:not(X)li:not(.done)Elementów, które nie pasują do X
:is(X, Y):is(h1, h2, h3) aElementów pasujących do czegokolwiek z listy
:where(X, Y):where(ul, ol) liTak samo jak :is(), ze specyficznością zero
:has(X)li:has(> input:checked)Elementów, które zawierają coś pasującego do X

:not() używa się na co dzień, na przykład żeby postawić separator między elementami, ale nie po ostatnim:

Pseudoklasy stanu: focus, checked, disabled, invalid

PseudoklasaPasuje do
:focusElementu, który ma fokus z klawiatury lub myszy
:focus-visibleElementu z fokusem, gdy przeglądarka uzna, że należy pokazać obwódkę (zwykle przy fokusie z klawiatury)
:focus-withinElementu, który zawiera element z fokusem
:checkedZaznaczonego pola wyboru, przycisku radio lub wybranego <option>
:disabled / :enabledKontrolek formularza, które są (lub nie są) wyłączone
:required / :optionalPól z required lub bez
:invalid / :validPól, których wartość nie przechodzi lub przechodzi walidację
:user-invalidNieprawidłowych pól, ale dopiero po interakcji użytkownika
:placeholder-shownPola, które właśnie pokazuje swój placeholder
:emptyElementu bez dzieci, nawet bez tekstu
:targetElementu, którego id pasuje do #fragment w adresie URL

Kliknij w pole e-mail: jego etykieta zmienia kolor na niebieski dzięki :focus-within. Wpisz coś, co nie jest adresem e-mail, i opuść pole: :user-invalid zmienia obramowanie na bursztynowe. Zwykłe :invalid oznaczyłoby puste wymagane pole na bursztynowo, zanim w ogóle go dotkniesz.

Cokolwiek robisz z :focus, zachowaj widoczny styl fokusu. Usunięcie obwódki bez zamiennika sprawia, że osoby korzystające z klawiatury nie widzą, gdzie są.

:has(), selektor rodzica

:has() dopasowuje element według tego, co zawiera. To długo wyczekiwany "selektor rodzica", który działa w aktualnych wersjach Chrome, Firefoksa i Safari.

Wybierz drugi plan: cała karta podąża za przyciskiem radio, bez JavaScriptu.

Częste błędy

  • Spacja przed dwukropkiem. li :first-child oznacza "pierwsze dziecko wewnątrz li". Pisz li:first-child.
  • Oczekiwanie, że p:nth-child(1) oznacza "pierwszy p". Oznacza "pierwsze dziecko, jeśli jest p". Dla pierwszego p użyj :first-of-type.
  • Liczenie od 0. Pozycje zaczynają się od 1: :nth-child(0) nie pasuje do niczego.
  • Usuwanie obwódek fokusu. :focus { outline: none } bez zamiennika psuje nawigację z klawiatury.
  • Mylenie : i ::. :before to stary zapis pseudoelementu ::before; pseudoklasy zawsze mają jeden dwukropek.

Najczęściej zadawane pytania

Czym jest pseudoklasa w CSS?

To słowo kluczowe po dwukropku, które wybiera elementy według stanu lub pozycji, a nie nazwy, na przykład a:hover, li:first-child albo input:focus. Dodaje się ją do zwykłego selektora, a większość pseudoklas liczy się w specyficzności jak klasa (:where() liczy się jako zero).

Jak działa nth-child w CSS?

:nth-child(an+b) pasuje do elementów, których pozycja wśród rodzeństwa wynosi a×n+b dla n = 0, 1, 2 i tak dalej, licząc od 1. :nth-child(3) to trzecie dziecko, :nth-child(odd) albo 2n+1 każde nieparzyste, a :nth-child(n+4) czwarte i kolejne.

Czym różni się nth-child od nth-of-type?

:nth-child() liczy wszystkie elementy rodzeństwa, a potem sprawdza resztę selektora; :nth-of-type() liczy tylko rodzeństwo tego samego typu elementu. W liście złożonej z h2 i następujących po nim akapitów p:nth-child(1) nie pasuje do niczego, a p:nth-of-type(1) pasuje do pierwszego akapitu.

Jak używać :not() w CSS?

W nawiasach umieść selektor do wykluczenia: li:not(.done) pasuje do każdego elementu listy bez klasy done. Przyjmuje też listę, input:not([type="checkbox"], [type="radio"]).

Czym różni się pseudoklasa od pseudoelementu?

Pseudoklasa (jeden dwukropek, :hover) wybiera cały istniejący element w jakimś stanie. Pseudoelement (dwa dwukropki, ::before) celuje w część elementu albo tworzy generowaną treść.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ