10.4. Podstawowe pseudoklasy (:link, :visited, :hover, :active, :focus)
Wprowadzenie: Stylizowanie stanów elementów
Pseudoklasy w CSS pozwalają stylizować elementy nie na podstawie ich typu, atrybutów czy pozycji w drzewie DOM, ale na podstawie ich **stanu** lub **interakcji użytkownika**.
Zapisuje się je, dodając dwukropek (:
) i nazwę pseudoklasy do selektora (np. a:hover
).
W tej lekcji skupimy się na podstawowych i najczęściej używanych pseudoklasach, głównie związanych z linkami i elementami interaktywnymi.
Pseudoklasy linków: :link
i :visited
:link
: Wybiera linki (elementy<a>
z atrybutemhref
), które **nie zostały jeszcze odwiedzone** przez użytkownika.:visited
: Wybiera linki, które **zostały już odwiedzone** przez użytkownika.
Ze względów prywatności, przeglądarki mocno ograniczają, jakie style można zastosować za pomocą :visited
. Zazwyczaj można bezpiecznie zmieniać tylko właściwości związane z kolorem (color
, background-color
, border-color
, outline-color
). Nie można np. zmieniać rozmiaru czcionki, dodawać tła obrazkowego ani używać pseudoelementów ::before
/::after
dla odwiedzonych linków.
<a href="https://www.google.com">Google (prawdopodobnie odwiedzony)</a><br>
<a href="/nieistniejaca-strona-xyz">Nieistniejąca strona (prawdopodobnie nieodwiedzony)</a>
/* Styl dla nieodwiedzonych linków */
a:link {
color: blue;
text-decoration: none; /* Usuń domyślne podkreślenie */
}
/* Styl dla odwiedzonych linków */
a:visited {
color: purple;
}
W powyższym przykładzie, nieodwiedzone linki będą niebieskie i bez podkreślenia, a odwiedzone będą fioletowe.
Pseudoklasy interakcji: :hover
, :active
, :focus
:hover
: Wybiera element, nad którym użytkownik **aktualnie trzyma kursor myszy**. Działa na większości elementów, nie tylko na linkach.:active
: Wybiera element w momencie, gdy jest **aktywowany** przez użytkownika (np. kliknięcie linku lub przycisku - od momentu wciśnięcia przycisku myszy do jego zwolnienia).:focus
: Wybiera element, który aktualnie **ma fokus** (jest aktywny i gotowy do interakcji, np. pole formularza, w którym można pisać, lub link/przycisk wybrany za pomocą klawisza Tab). Fokus można nadać elementom interaktywnym (linki, przyciski, pola formularzy) oraz elementom z atrybutemtabindex
.
<a href="#" class="interactive-link">Najedź na mnie lub kliknij</a>
<button class="interactive-button">Kliknij mnie</button>
<input type="text" class="interactive-input" placeholder="Kliknij lub użyj Tab">
/* Styl linku po najechaniu myszą */
a.interactive-link:hover {
color: red;
text-decoration: underline;
}
/* Styl linku podczas kliknięcia */
a.interactive-link:active {
color: orange;
}
/* Styl linku, gdy ma fokus (np. po użyciu Tab) */
a.interactive-link:focus {
outline: 2px solid blue; /* Dodaj widoczny obrys fokusu */
}
/* Styl przycisku po najechaniu */
.interactive-button:hover {
background-color: lightgray;
}
/* Styl przycisku podczas kliknięcia */
.interactive-button:active {
background-color: gray;
transform: translateY(1px); /* Lekkie przesunięcie w dół */
}
/* Styl przycisku, gdy ma fokus */
.interactive-button:focus {
box-shadow: 0 0 5px rgba(0, 0, 255, 0.5); /* Dodaj cień fokusu */
}
/* Styl pola input, gdy ma fokus */
.interactive-input:focus {
border-color: blue;
background-color: lightyellow;
}
Ważna kolejność (LVHA): Aby pseudoklasy linków i interakcji działały poprawnie razem, zaleca się definiowanie ich w następującej kolejności w arkuszu CSS: Link, Visited, Hover, Active (mnemonik: LoVe HAte). Pseudoklasę :focus
często umieszcza się razem z :hover
lub po :active
.
/* Zalecana kolejność LVHA dla linków */
a:link { color: blue; }
a:visited { color: purple; }
a:hover { color: red; }
a:active { color: orange; }
/* Można łączyć :hover i :focus dla spójnego stylu */
a:hover, a:focus {
text-decoration: underline;
}
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Stwórz przycisk button
. Użyj pseudoklasy :hover
, aby zmienić kolor tła przycisku po najechaniu na niego myszą. Użyj pseudoklasy :active
, aby lekko zmienić jego wygląd (np. kolor tekstu) podczas kliknięcia.
Rozwiązanie:
HTML:
<button class="task-button">Interaktywny Przycisk</button>
CSS:
.task-button {
padding: 10px 20px;
border: 1px solid #ccc;
background-color: #f0f0f0;
cursor: pointer;
transition: background-color 0.2s ease; /* Płynne przejście koloru tła */
}
.task-button:hover {
background-color: #ddd; /* Zmiana tła po najechaniu */
}
.task-button:active {
color: white; /* Zmiana koloru tekstu podczas kliknięcia */
background-color: #bbb;
}
Efekt: Przycisk będzie miał jasnoszare tło, które ściemnieje po najechaniu myszą. Podczas kliknięcia tło stanie się jeszcze ciemniejsze, a tekst biały.
Zadanie 2 (do samodzielnego wykonania)
Stwórz link a
. Użyj pseudoklas :link
i :visited
, aby nadać różne kolory nieodwiedzonym i odwiedzonym linkom. Dodatkowo, użyj :hover
, aby link był podkreślany tylko po najechaniu myszą.
Zadanie 3 (do samodzielnego wykonania)
Stwórz pole tekstowe input type="text"
. Użyj pseudoklasy :focus
, aby zmienić kolor obramowania i tła pola, gdy użytkownik w nim kliknie lub wybierze je za pomocą klawisza Tab.
FAQ - Najczęściej zadawane pytania
Czy :hover
działa na urządzeniach dotykowych?
Zachowanie :hover
na urządzeniach dotykowych jest niespójne. Niektóre przeglądarki mobilne aktywują stan :hover
po pierwszym dotknięciu elementu i utrzymują go do dotknięcia innego miejsca. Nie należy polegać na :hover
jako głównym mechanizmie interakcji na urządzeniach mobilnych; lepiej używać zdarzeń JavaScript lub zapewniać, że kluczowe informacje są dostępne bez interakcji hover.
Dlaczego kolejność LVHA jest ważna?
Ze względu na specyficzność selektorów. Jeśli np. zdefiniujesz :hover
przed :link
, a link nie został odwiedzony, to styl :link
(który jest bardziej specyficzny w tym kontekście) może nadpisać styl :hover
, gdy kursor znajdzie się nad linkiem. Kolejność LVHA zapewnia, że bardziej specyficzne stany (jak :active
) nadpisują mniej specyficzne (jak :link
).
Jakie elementy mogą otrzymać :focus
?
Domyślnie fokus mogą otrzymać elementy interaktywne: linki (a
z href
), przyciski (button
), elementy formularzy (input
, select
, textarea
) oraz elementy z ustawionym atrybutem tabindex
. Stylizowanie stanu :focus
jest kluczowe dla dostępności, ponieważ pozwala użytkownikom nawigującym za pomocą klawiatury widzieć, który element jest aktualnie aktywny.
Czy mogę łączyć pseudoklasy?
Tak, można łączyć pseudoklasy, np. input:hover:focus
wybierze pole input, które ma fokus ORAZ nad którym znajduje się kursor myszy. Można je również łączyć z innymi selektorami, np. button.primary:hover
.