Menu

CSS Hover: :hover, :active i kolory linków

Pseudoklasa :hover stylizuje element, gdy kursor znajduje się nad nim. Poznaj efekty hover dla przycisków i kart, płynne przejścia, kolory linków z :link, :visited, :hover i :active we właściwej kolejności oraz hover na ekranach dotykowych.

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

Jak działa :hover

:hover to pseudoklasa, która pasuje do elementu, gdy kursor myszy jest nad nim. Dodaj ją do dowolnego selektora i napisz style dla stanu po najechaniu:

Zmieniają się tylko deklaracje z reguły :hover; wszystko inne pochodzi z .btn. Gdy kursor opuści element, wraca on do swoich zwykłych stylów.

Płynne efekty hover z transition

Zmiana przy najechaniu jest natychmiastowa, chyba że dodasz transition do zwykłej reguły (nie do reguły :hover), dzięki czemu animacja działa w obie strony:

transform i opacity to najtańsze właściwości do animowania; nie przesuwają elementów wokół. Animowanie width, height albo margin zmusza stronę do przeliczania układu w każdej klatce. Czasy trwania, opóźnienia i krzywe przyspieszenia opisuje strona o CSS transition.

Linki mają cztery klasyczne stany, plus fokus z klawiatury, a kolejność reguł ma znaczenie:

PseudoklasaDziała, gdy
:linkLink nie był odwiedzony
:visitedAdres URL jest w historii przeglądarki
:hoverKursor jest nad linkiem
:activeLink jest wciskany
:focus-visibleLink ma fokus z klawiatury

Wszystkie mają tę samą specyficzność, więc gdy pasują dwie, wygrywa późniejsza reguła. Odwiedzony link, nad którym jest kursor, pasuje zarówno do :visited, jak i do :hover; jeśli :visited stoi na końcu, kolor hover nigdy się nie pokaże. Bezpieczna kolejność to Link, Visited, Hover, Active (LVHA):

Przeglądarki ograniczają to, co może zmienić :visited, żeby strony nie mogły odczytać twojej historii. Działają tylko właściwości związane z kolorem (color, background-color, border-color, outline-color i kilka innych), a skrypty zawsze widzą wartość dla nieodwiedzonego linku.

:active: stan wciśnięcia

:active pasuje, gdy element jest wciskany. Niewielkie przesunięcie sprawia, że przycisk wydaje się fizyczny:

Najechanie na rodzica, żeby ostylować dziecko

Stan hover należy do elementu pod kursorem i do każdego z jego przodków. Dlatego .card:hover .title stylizuje tytuł, gdy kursor jest nad dowolną częścią karty, a ten sam pomysł pozwala odsłaniać ukryte elementy:

Linijka z :focus-within jest ważna: bez niej osoba korzystająca z klawiatury, która przejdzie Tabem do przycisku Delete, wcisnęłaby niewidoczny przycisk. Każdemu odsłanianiu przez hover towarzyszyć powinna reguła dla fokusu.

Hover na ekranach dotykowych

Telefony i tablety nie mają kursora, który zatrzymuje się nad elementem. Większość mobilnych przeglądarek stosuje :hover po pierwszym dotknięciu i utrzymuje go, dopóki nie dotkniesz czegoś innego, więc styl hover może wyglądać na zawieszony. Dwie zasady pomagają nad tym zapanować:

  • Nigdy nie ukrywaj jedynej drogi do treści za :hover. Menu, które otwiera się po najechaniu, musi też otwierać się po kliknięciu.
  • Czysto dekoracyjne efekty hover umieszczaj w media query, które sprawdza, czy urządzenie naprawdę obsługuje hover:
@media (hover: hover) {
  .card:hover { transform: translateY(-4px); }
}

Częste błędy

  • Spacja przed dwukropkiem. .btn :hover oznacza "element z hover wewnątrz .btn". Pisz .btn:hover.
  • transition tylko w regule :hover. Wtedy animacja działa przy najechaniu, ale przy zjechaniu styl wraca skokowo. Umieść ją w zwykłej regule.
  • Zła kolejność linków. Trzymaj :link, :visited, :hover, :active w tej kolejności.
  • Hover bez stylu fokusu. Osoby korzystające z klawiatury nigdy nie wywołują :hover; nadaj elementom interaktywnym także styl :focus-visible.
  • Hover na elemencie zasłoniętym przez inny. Niewidoczna nakładka (często pseudoelement z pozycjonowaniem absolutnym) może przechwytywać kursor. pointer-events: none na nakładce rozwiązuje problem.

Najczęściej zadawane pytania

Jak dodać efekt hover w CSS?

Napisz regułę z :hover po selektorze: .btn:hover { background: #1d4ed8; }. Deklaracje działają, dopóki kursor jest nad elementem. Dodaj transition: background 0.2s; do zwykłej reguły, żeby zmiana była animowana.

Czym różni się :hover od :active?

:hover działa, gdy kursor jest nad elementem. :active działa, gdy element jest wciskany, od naciśnięcia przycisku myszy do jego puszczenia. Wciśnięty przycisk zwykle jest jednocześnie w stanie hover i active.

W jakiej kolejności pisać pseudoklasy linków?

:link, :visited, :hover, :active (zapamiętaj LVHA, po angielsku "LoVe HAte"). Mają tę samą specyficzność, więc wygrywa późniejsza reguła; w każdej innej kolejności styl odwiedzonego lub najechanego linku może zasłonić styl hover lub active.

Jak zmienić kolor linku w CSS?

Ostyluj element a: a { color: #2563eb; }, a potem a:visited { color: #7c3aed; } i a:hover { color: #1d4ed8; } dla pozostałych stanów. Ustawienie color na a obejmuje zarówno nieodwiedzone, jak i odwiedzone linki.

Czy hover działa na telefonie?

Ekrany dotykowe nie mają kursora, który mógłby zatrzymać się nad elementem. Większość mobilnych przeglądarek stosuje :hover po dotknięciu i utrzymuje go, dopóki nie dotkniesz czegoś innego, przez co styl hover może się zawiesić. Umieszczaj efekty tylko dla hover w @media (hover: hover) i nigdy nie chowaj ważnej treści za hover.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ