Menu

Hover no CSS: :hover, :active e as cores dos links

A pseudo-classe :hover estiliza um elemento enquanto o ponteiro está sobre ele. Veja efeitos de hover em botões e cards, transições suaves, cores de link com :link, :visited, :hover e :active na ordem certa e hover em telas de toque.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

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.

Os links têm quatro estados clássicos, mais o foco do teclado, e a ordem das regras importa:

Pseudo-classeVale quando
:linkO link não foi visitado
:visitedA URL está no histórico do navegador
:hoverO ponteiro está sobre ele
:activeEle está sendo pressionado
:focus-visibleEle 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 :hover significa "um elemento em hover dentro de .btn". Escreva .btn:hover.
  • transition só 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, :active nessa ordem.
  • Hover sem estilo de foco. Quem usa teclado nunca aciona o :hover; dê também um estilo :focus-visible aos 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: none nessa 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.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR