Como o :hover funciona
:hover é uma pseudo-classe que seleciona um elemento enquanto o ponteiro do mouse está sobre ele. Acrescente-a a qualquer seletor e escreva os estilos do estado em hover:
Só as declarações da regra :hover mudam; todo o resto vem de .btn. Quando o ponteiro sai, o elemento volta aos estilos normais.
Efeitos de hover suaves com transition
A mudança no hover é instantânea, a menos que você acrescente transition à regra normal (não à regra :hover), para que ela anime na entrada e na saída:
transform e opacity são as propriedades mais baratas de animar; elas não empurram os elementos em volta. Animar width, height ou margin faz a página refazer o layout a cada quadro. Durações, atrasos e curvas de easing estão na página de transition no CSS.
Cores de link: :link, :visited, :hover, :active
Os links têm quatro estados clássicos, mais o foco do teclado, e a ordem das regras importa:
| Pseudo-classe | Vale quando |
|---|---|
:link | O link não foi visitado |
:visited | A URL está no histórico do navegador |
:hover | O ponteiro está sobre ele |
:active | Ele está sendo pressionado |
:focus-visible | Ele tem o foco do teclado |
Todas têm a mesma especificidade, então vence a regra posterior quando duas combinam. Um link visitado em hover combina com :visited e com :hover; se :visited vier por último, a cor de hover nunca aparece. A ordem segura é Link, Visited, Hover, Active (LVHA):
Os navegadores limitam o que :visited pode mudar, para impedir que páginas leiam o seu histórico. Só propriedades ligadas a cor (color, background-color, border-color, outline-color e algumas outras) têm efeito, e scripts sempre enxergam o valor de não visitado.
:active: o estado pressionado
:active seleciona o elemento enquanto ele está sendo pressionado. Um pequeno movimento dá ao botão uma sensação física:
Hover no pai para estilizar um filho
O estado de hover pertence ao elemento sob o ponteiro e a todos os ancestrais dele. Assim, .card:hover .title estiliza o título sempre que qualquer parte do card está em hover, e a mesma ideia revela elementos escondidos:
A linha do :focus-within é importante: sem ela, quem navega pelo teclado até o botão Delete apertaria um botão invisível. Junte a cada revelação por hover uma regra de foco.
Hover em telas de toque
Celulares e tablets não têm um ponteiro que repousa sobre um elemento. A maioria dos navegadores móveis aplica o :hover no primeiro toque e o mantém até você tocar em outro lugar, então um estilo de hover pode parecer preso. Duas regras mantêm isso sob controle:
- Nunca deixe o único acesso a um conteúdo atrás de
:hover. Um menu que abre no hover também precisa abrir no clique. - Envolva efeitos de hover puramente decorativos em uma media query que verifica se há um dispositivo com hover de verdade:
@media (hover: hover) {
.card:hover { transform: translateY(-4px); }
}
Erros comuns
- Espaço antes dos dois-pontos.
.btn :hoversignifica "um elemento em hover dentro de.btn". Escreva.btn:hover. transitionsó na regra:hover. Aí a animação acontece na entrada, mas o estilo volta de uma vez na saída. Coloque-a na regra normal.- Ordem errada dos links. Mantenha
:link,:visited,:hover,:activenessa ordem. - Hover sem estilo de foco. Quem usa teclado nunca aciona o
:hover; dê também um estilo:focus-visibleaos elementos interativos. - Hover em um elemento coberto por outro. Uma camada invisível por cima (muitas vezes um pseudo-elemento absoluto) pode capturar o ponteiro.
pointer-events: nonenessa camada resolve.
Perguntas frequentes
Como fazer um efeito hover no CSS?
Escreva uma regra com :hover depois do seletor: .btn:hover { background: #1d4ed8; }. As declarações valem enquanto o ponteiro está sobre o elemento. Acrescente transition: background 0.2s; à regra normal para animar a mudança.
Qual a diferença entre :hover e :active?
:hover vale enquanto o ponteiro está sobre o elemento. :active vale enquanto ele está sendo pressionado, do botão do mouse descer até soltar. Um botão pressionado normalmente está em hover e active ao mesmo tempo.
Em que ordem ficam as pseudo-classes de link?
:link, :visited, :hover, :active (lembre de LVHA, ou "LoVe HAte"). Elas têm a mesma especificidade, então vence a regra posterior; em qualquer outra ordem um estilo de visited ou de hover pode esconder o de hover ou de active.
Como mudar a cor do link no CSS?
Estilize o elemento a: a { color: #2563eb; }, depois a:visited { color: #7c3aed; } e a:hover { color: #1d4ed8; } para os outros estados. Definir color em a cobre tanto os links não visitados quanto os visitados.
O hover funciona no celular?
Telas de toque não têm um ponteiro que repousa sobre um elemento. A maioria dos navegadores móveis aplica o :hover no toque e o mantém até você tocar em outro lugar, o que pode deixar um estilo de hover preso. Envolva efeitos só de hover em @media (hover: hover) e nunca esconda conteúdo essencial atrás de um hover.