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.
Kolory linków: :link, :visited, :hover, :active
Linki mają cztery klasyczne stany, plus fokus z klawiatury, a kolejność reguł ma znaczenie:
| Pseudoklasa | Działa, gdy |
|---|---|
:link | Link nie był odwiedzony |
:visited | Adres URL jest w historii przeglądarki |
:hover | Kursor jest nad linkiem |
:active | Link jest wciskany |
:focus-visible | Link 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 :hoveroznacza "element z hover wewnątrz.btn". Pisz.btn:hover. transitiontylko 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,:activew 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: nonena 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.