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.