Kurs HTML

10.4. Podstawowe pseudoklasy (:link, :visited, :hover, :active, :focus)

Strona główna > Kurs CSS > Rozdział 10: Zaawansowane Selektory CSS > 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 atrybutem href), 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 atrybutem tabindex.
<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.