Pseudoklasy

Podcast o CSS – 015: pseudo-lekcje

Załóżmy, że masz formularz rejestracyjny e-mail i chcesz, by pole formularza miało czerwone obramowanie, jeśli zawiera nieprawidłowy adres e-mail. Jak to zrobić? Możesz użyć pseudoklasy CSS :invalid, która jest jedną z wielu pseudoklas tworzonych w przeglądarce.

Pseudoklasa umożliwia stosowanie stylów na podstawie zmian stanu i czynników zewnętrznych. Oznacza to, że projekt może reagować na dane wprowadzane przez użytkownika, np. nieprawidłowy adres e-mail. Są one opisane w module selektorów, a w tym module dowiesz się z nich więcej.

W przeciwieństwie do pseudoelementów, o których dowiesz się więcej w poprzednim module, pseudoklasy odwołują się do konkretnych stanów, w których może znajdować się element, a nie do określania stylu jego elementów.

Stany interaktywne

Poniższe pseudoklasy mają zastosowanie ze względu na interakcję użytkownika z Twoją stroną.

:hover

Obsługa przeglądarek

  • 1
  • 12
  • 1
  • 2

Źródło

Jeśli użytkownik ma urządzenie wskazujące, np. mysz lub trackpad, i umieści go nad elementem, możesz kliknąć ten stan, używając :hover, aby zastosować style. Jest to przydatna metoda sugerowania, że z elementem można wejść w interakcję.

:active

Obsługa przeglądarek

  • 1
  • 12
  • 1
  • 1

Źródło

Ten stan pojawia się, gdy następuje interakcja z elementem, np. kliknięcie, przed jego zwolnieniem. W przypadku użycia urządzenia wskazującego, np. myszy, ten stan określa moment rozpoczęcia kliknięcia, ale nie został jeszcze wywołany.

:focus, :focus-within:focus-visible

Obsługa przeglądarek

  • 1
  • 12
  • 1
  • 1

Źródło

Jeśli element może zostać zaznaczony, np. <button>, możesz zareagować na ten stan za pomocą pseudoklasy :focus.

Możesz też zareagować, jeśli element podrzędny Twojego elementu zostanie zaznaczony, używając :focus-within.

Wybrane elementy, np. przyciski, będą wyróżniać pierścieniem zaznaczenia, nawet po kliknięciu. W takiej sytuacji deweloper zastosuje taką usługę porównywania cen:

button:focus {
    outline: none;
}

Ten kod CSS usuwa domyślny pierścień zaznaczenia przeglądarki, gdy element jest aktywny, co utrudnia użytkownikom poruszanie się po stronie internetowej za pomocą klawiatury. Jeśli nie wybierzesz stylu zaznaczenia, użycie klawisza tab spowoduje, że użytkownik nie będzie mógł śledzić bieżącego miejsca zaznaczenia. Dzięki :focus-visible możesz zaprezentować styl zaznaczenia, gdy element zostanie zaznaczony za pomocą klawiatury, a jednocześnie użyć reguły outline: none, aby zapobiec interakcji ze wskaźnikiem.

button:focus {
    outline: none;
}

button:focus-visible {
    outline: 1px solid black;
}

:target

Obsługa przeglądarek

  • 1
  • 12
  • 1
  • 1.3

Źródło

Pseudoklasa :target wybiera element, którego parametr id pasuje do fragmentu adresu URL. Załóżmy, że masz taki kod HTML:

<article id="content">
    …
</article>

Jeśli adres URL zawiera ciąg #content, możesz dołączać do niego style.

#content:target {
    background: yellow;
}

Przydaje się to do wyróżniania za pomocą linku pomijania obszarów, do których można Cię bezpośrednio dojechać, np. do głównej treści witryny.

Stany historyczne

Obsługa przeglądarek

  • 1
  • 12
  • 1
  • 1

Źródło

Pseudoklasę :link można zastosować do dowolnego elementu <a> z wartością href, który nie został jeszcze odwiedzony.

:visited

Styl linku, który został już odwiedzony przez użytkownika, możesz zmienić za pomocą pseudoklasy :visited. Jest to stan odwrotny do stanu :link, ale ze względów bezpieczeństwa masz mniej właściwości CSS, których chcesz użyć. Możesz stylizować tylko elementy color, background-color, border-color, outline-color oraz kolor SVG fill i stroke.

Kwestie dotyczące kolejności

Jeśli zdefiniujesz styl :visited, możesz go zastąpić pseudoklasą linku o co najmniej takiej samej specyfice. Z tego powodu zalecamy używanie reguły LVHA do określania stylu linków z pseudoklasami w określonej kolejności: :link, :visited, :hover, :active.

a:link {}
a:visited {}
a:hover {}
a:active {}

Stany formularzy

Poniższe pseudoklasy umożliwiają wybieranie elementów formularza w różnych stanach, w których mogą się one znajdować podczas interakcji z nimi.

:disabled:enabled

Obsługa przeglądarek

  • 1
  • 12
  • 1
  • 3.1

Źródło

Jeśli jakiś element formularza, taki jak <button>, jest wyłączony przez przeglądarkę, możesz przykuć go do tego stanu za pomocą pseudoklasy :disabled. Pseudoklasa :enabled jest dostępna w przypadku stanu odwrotnego, chociaż domyślnie elementy formularza również mają wartość :enabled, dlatego może się zdarzyć, że nie będziesz się docierać do tej pseudoklasy.

:checked:indeterminate

Obsługa przeglądarek

  • 1
  • 12
  • 1
  • 3.1

Źródło

Pseudoklasa :checked jest dostępna, gdy pomocniczy element formularza, np. pole wyboru lub przycisk, jest zaznaczony.

Stan :checked jest binarny(prawda lub fałsz), ale pola wyboru mają stan pośredni, jeśli nie są zaznaczone ani odznaczone. Jest to tzw. stan :indeterminate.

Przykładem może być element sterujący „zaznacz wszystko”, który zaznacza wszystkie pola wyboru w grupie. Gdyby użytkownik odznaczył jedno z tych pól wyboru, pole wyboru głównego nie oznaczałoby już zaznaczonego pola „Wszystkie”, więc powinno zostać oznaczone jako nieokreślone.

Element <progress> też ma stan nieokreślony, na podstawie którego można określić jego styl. Typowym przykładem jest nadanie mu wyglądu w paski, aby pokazać, że nie wiadomo, ile jeszcze zostało potrzebnych.

:placeholder-shown

Obsługa przeglądarek

  • 47
  • 79
  • 51
  • 9

Źródło

Jeśli pole formularza ma atrybut placeholder i brak wartości, do dołączania stylów można użyć pseudoklasy :placeholder-shown. Gdy tylko w polu pojawi się treść, niezależnie od tego, czy jest ona oznaczona jako placeholder czy nie, ten stan przestaje obowiązywać.

Stany weryfikacji

Obsługa przeglądarek

  • 10
  • 12
  • 4
  • 5

Źródło

Na sprawdzanie poprawności formularza HTML możesz odpowiadać za pomocą pseudoklas, takich jak :valid, :invalid i :in-range. Pseudoklasy :valid i :invalid są przydatne w kontekstach takich jak pole adresu e-mail z wartością pattern, która musi być dopasowana, aby pole było prawidłowe. Ten stan prawidłowej wartości można wyświetlić użytkownikowi, aby wiedział, że może bezpiecznie przejść do następnego pola.

Pseudoklasa :in-range jest dostępna, jeśli dane wejściowe mają min i max, np. wartości liczbowe oraz wartość mieści się w tych granicach.

Za pomocą formularzy HTML możesz określić, że dane pole jest wymagane z atrybutem required. W przypadku wymaganych pól dostępna będzie pseudoklasa :required. Pola, które nie są wymagane, można wybrać za pomocą pseudoklasy :optional.

Wybieranie elementów według indeksu, kolejności i wystąpienia

Istnieje grupa pseudoklasy, które wybierają elementy na podstawie ich położenia w dokumencie.

:first-child:last-child

Obsługa przeglądarek

  • 4
  • 12
  • 3
  • 3.1

Źródło

Jeśli chcesz znaleźć pierwszy lub ostatni element, możesz użyć :first-child i :last-child. Te pseudoklasy zwracają pierwszy lub ostatni element w grupie elementów równorzędnych.

:only-child

Obsługa przeglądarek

  • 2
  • 12
  • 1.5
  • 3.1

Źródło

Możesz też wybierać elementy, które nie mają elementów równorzędnych, dzięki pseudoklasie :only-child.

:first-of-type:last-of-type

Obsługa przeglądarek

  • 1
  • 12
  • 3.5
  • 3.1

Źródło

Możesz wybrać :first-of-type i :last-of-type, które na początku wyglądają tak samo jak :first-child i :last-child, ale spójrz na ten kod HTML:

<div class="my-parent">
    <p>A paragraph</p>
    <div>A div</div>
    <div>Another div</div>
</div>

Oraz ta usługa porównywania cen:

.my-parent div:first-child {
    color: red;
}

Żaden element nie miałby koloru na czerwono, ponieważ pierwszy element podrzędny jest akapitem, a nie obiektem div. W tym kontekście przydaje się pseudoklasa :first-of-type.

.my-parent div:first-of-type {
    color: red;
}

Chociaż pierwszy element <div> jest drugim podrzędnym, nadal jest pierwszym typem w elemencie .my-parent, więc w przypadku tej reguły będzie miał kolor czerwony.

:nth-child:nth-of-type

Obsługa przeglądarek

  • 1
  • 12
  • 3.5
  • 3.1

Źródło

Nie masz ograniczeń dotyczących pierwszego i ostatniego dziecka oraz typów treści. Pseudoklasy :nth-child i :nth-of-type umożliwiają określenie elementu, który ma określony indeks. Indeksowanie w selektorach arkusza CSS rozpoczyna się od 1.

Do tych pseudoklas możesz też przekazać więcej niż indeks. Jeśli chcesz zaznaczyć wszystkie równomierne elementy, możesz użyć elementu :nth-child(even).

Możesz też utworzyć bardziej złożone selektory, które będą znajdować elementy w regularnych odstępach czasu, korzystając z mikroskładni An+B.

li:nth-child(3n+3) {
    background: yellow;
}

Ten selektor wybiera co trzeci element, zaczynając od pozycji 3. Wartość n w tym wyrażeniu to indeks, którego wartość rozpoczyna się od 0, czyli 3 (3n) i wskazuje, ile mnożysz ten indeks.

Załóżmy, że masz 7 elementów <li>. Pierwszy wybrany element to 3, ponieważ 3n+3 oznacza (3 * 0) + 3. W następnej iteracji zostanie wybrany element 6, ponieważ n zwiększył się do 1, więc (3 * 1) + 3). To wyrażenie działa zarówno w przypadku :nth-child, jak i :nth-of-type.

Tego typu selektor możesz poeksperymentować z n-tym testerem podrzędnym lub narzędziem do wybierania ilości.

:only-of-type

Obsługa przeglądarek

  • 1
  • 12
  • 3.5
  • 3.1

Źródło

Ponadto w grupie elementów równorzędnych z użyciem :only-of-type możesz znaleźć jedyny element określonego typu. Jest to przydatne, gdy chcesz wybrać listy z jednym elementem lub znaleźć jedyny pogrubiony element w akapicie.

Znajdowanie pustych elementów

Czasami przydaje się identyfikowanie całkowicie pustych elementów – do tego istnieje też pseudoklasa.

:empty

Obsługa przeglądarek

  • 1
  • 12
  • 1
  • 3.1

Źródło

Jeśli element nie ma elementów podrzędnych, stosowana jest do nich pseudoklasa :empty. Elementy podrzędne to nie tylko elementy HTML czy węzły tekstowe. Mogą też być odstępami, co może być mylące, gdy debugujesz ten kod HTML i rozważasz, dlaczego nie działa z :empty:

<div>
</div>

Między otwierającym a zamykającym tagiem <div> znajduje się spacja, więc puste pole nie będzie działać.

Pseudoklasa :empty może być przydatna, jeśli masz niewielką kontrolę nad kodem HTML i chcesz ukryć puste elementy, takie jak edytor treści WYSIWYG. Redaktor dodał tu zbędny, pusty akapit.

<article class="post">
 <p>Donec ullamcorper nulla non metus auctor fringilla.</p>
 <p></p>
 <p>Curabitur blandit tempus porttitor.</p>
</article>

Dzięki usłudze :empty możesz to znaleźć i ją ukryć.

.post :empty {
    display: none;
}

Znajdowanie i wykluczanie wielu elementów

Niektóre pseudoklasy pomagają pisać bardziej kompaktowe kody CSS.

:is()

Obsługa przeglądarek

  • 88
  • 88
  • 78
  • 14

Źródło

Jeśli chcesz znaleźć wszystkie elementy podrzędne h2, li i img w elemencie .post, możesz utworzyć selektor w ten sposób:

.post h2,
.post li,
.post img {
    …
}

Dzięki pseudoklasie :is() możesz napisać prostszą wersję:

.post :is(h2, li, img) {
    …
}

Pseudoklasa :is jest nie tylko bardziej krótka niż lista selektora, ale także jest bardziej wygodna. W większości przypadków, jeśli na liście wyboru występuje błąd lub nieobsługiwany selektor, cała lista przestanie działać. Jeśli w przekazanych selektorach w pseudoklasie :is wystąpi błąd, selektor zignoruje nieprawidłowy selektor, ale użyje tych, które są prawidłowe.

:not()

Obsługa przeglądarek

  • 1
  • 12
  • 1
  • 3.1

Źródło

Możesz też wykluczać elementy za pomocą pseudoklasy :not(). Możesz go użyć np. do określenia stylu wszystkich linków, które nie mają atrybutu class.

a:not([class]) {
    color: blue;
}

Pseudoklasa :not może też ułatwić ułatwienie dostępu. Na przykład <img> musi zawierać alt, nawet jeśli jest pusta, aby można było utworzyć regułę CSS, która dodaje gruby czerwony kontur do nieprawidłowych obrazów:

img:not([alt]) {
    outline: 10px red;
}

Sprawdź swoją wiedzę

Sprawdź swoją wiedzę o pseudoklasach

Pseudoklasy działają tak, jakby klasa została dynamicznie zastosowana do elementu, a pseudoelementy – na samym elemencie.

Prawda
Zwracaj uwagę na użycie pojedynczego lub podwójnego znaku : jako kluczowego znaku wyróżniającego w selektorze.
Fałsz
Pseudoelementy to części, a pseudoklasy – stan.

Które z poniższych działań należy do pseudoklasy funkcjonalnej?

:is()
🎉
:target
Po pseudoklasach funkcjonalnych znajduje się element (), który wskazuje, że akceptują parametry.
:empty
Po pseudoklasach funkcjonalnych znajduje się element (), który wskazuje, że akceptują parametry.
:not()
🎉

Które z tych pseudoklasy wynikają z interakcji użytkownika?

:hover
🎉
:press
Spróbuj jeszcze raz.
:squeeze
Spróbuj jeszcze raz.
:target
🎉
:focus-within
🎉

Które z tych elementów są pseudoklasami stanu <form>?

:enabled
🎉
:fresh
Spróbuj jeszcze raz.
:indeterminate
🎉
:checked
🎉
:in-range
🎉
:loading
Spróbuj jeszcze raz.
:valid
🎉