CSS :hover Pseudo-Classe
Aprenda como a pseudo-classe CSS :hover funciona, como combiná-la com transitions e como lidar corretamente com dispositivos touch e acessibilidade.
A pseudo-classe :hover corresponde a um elemento enquanto o ponteiro do utilizador está posicionado sobre ele. Ela é ativada assim que o ponteiro se move para o elemento e desativada no momento em que o ponteiro se afasta — sem necessidade de clique.
Esta página abrange:
- Sintaxe básica e como selecionar links, botões e qualquer elemento
- Combinar
:hovercomtransitionpara efeitos animados suaves - Passar o ponteiro sobre um elemento pai para revelar ou reestilizar os seus filhos (padrão de dropdown)
- Restringir estilos de hover com
@media (hover: hover)para segurança em dispositivos touch - Requisitos de acessibilidade e o emparelhamento com
:focus/:focus-within
Sintaxe
selector:hover {
/* declarations applied while pointer is over the element */
}O seletor pode ser qualquer seletor CSS válido — elemento, classe, ID ou uma cadeia de combinadores.
Estilizar links ao passar o ponteiro
O uso mais comum de :hover é alterar a aparência dos links âncora. Para uma estilização previsível de links, declare as regras na ordem LVHA: :link, :visited, :hover, :active. Essa ordem garante que pseudo-classes posteriores possam substituir as anteriores sem surpresas de especificidade.
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<style>
a:hover {
background-color: #8ebf42;
color: #666;
}
</style>
</head>
<body>
<h2>:hover selector example</h2>
<a href="https://www.w3docs.com/">W3docs.com</a>
</body>
</html>Mova o ponteiro sobre o link para ver a cor de fundo e a cor do texto mudarem.
Hover em links de texto inline
Quando um link aparece dentro de um parágrafo, :hover ainda seleciona apenas esse elemento <a> — o texto circundante não é afetado.
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<style>
a {
color: #1c87c9;
}
a:hover {
background-color: #555;
color: #eee;
}
</style>
</head>
<body>
<h2>:hover selector example</h2>
<p>Lorem Ipsum is simply dummy text of the printing and <a href="#">typesetting</a> industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into <a href="#">electronic</a> typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like <a href="#">Aldus PageMaker</a> including versions of Lorem Ipsum.</p>
</body>
</html>Hover em elementos de bloco
:hover funciona em qualquer elemento, não apenas em links. Aplicá-lo a uma <div> permite criar efeitos interativos de cartão ou painel.
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<style>
div {
padding: 30px;
background-color: #8ebf42;
color: #eee;
}
div:hover {
background-color: #444;
color: #fff;
}
</style>
</head>
<body>
<h2>:hover selector example</h2>
<div>
Lorem ipsum is simply dummy text...
</div>
</body>
</html>Efeitos de hover suaves com transition
Uma regra :hover simples altera os estilos instantaneamente. Adicionar uma transition no seletor base (não na regra :hover) faz com que o browser anime a mudança em ambas as direções — quando o ponteiro entra e quando sai.
.button {
background-color: #1c87c9;
color: #fff;
padding: 0.5rem 1.2rem;
border: none;
border-radius: 4px;
cursor: pointer;
/* Place transition on the base rule, not :hover */
transition: background-color 0.25s ease, box-shadow 0.25s ease;
}
.button:hover {
background-color: #145e8a;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}Se você colocar transition apenas dentro da regra :hover, a animação ocorre ao entrar, mas volta instantaneamente ao sair — um erro comum para iniciantes.
Você pode fazer a transição de várias propriedades separando-as com vírgulas, ou usar transition: all 0.25s ease como atalho (embora seja melhor especificar propriedades concretas por questões de desempenho).
Hover no pai para estilizar os filhos
:hover pode fazer parte de um seletor com combinador para reagir ao estado de hover de um pai e estilizar um descendente. Esta é a base dos menus de navegação dropdown e dos efeitos de revelar ao passar o ponteiro.
/* Card image starts dimmed; brightens when the card is hovered */
.card .card-image {
opacity: 0.75;
transition: opacity 0.2s ease;
}
.card:hover .card-image {
opacity: 1;
}
/* Reveal an overlay label on hover */
.card .card-label {
display: none;
}
.card:hover .card-label {
display: block;
}Padrão de menu dropdown
.nav-item .dropdown {
display: none;
position: absolute;
top: 100%;
left: 0;
}
.nav-item:hover .dropdown {
display: block;
}Menus acessíveis apenas por hover são inacessíveis para utilizadores de teclado e touch. Emparelhe :hover com :focus-within para que o menu também abra quando um elemento filho recebe foco via navegação por teclado:
.nav-item:hover .dropdown,
.nav-item:focus-within .dropdown {
display: block;
}Restringir estilos de hover para dispositivos touch
Muitos dispositivos com ecrã tátil ativam um hover simulado ao toque, o que pode deixar os estilos "presos" até o utilizador tocar noutro lugar. Para evitar isso, envolva as regras específicas de hover numa media query que verifica se o dispositivo de entrada principal suporta genuinamente hover:
/* Only apply on devices with a real pointer (mouse, trackpad) */
@media (hover: hover) {
.card:hover {
transform: translateY(-4px);
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15);
}
}A feature de media hover: hover tem suporte amplo nos browsers modernos. Em dispositivos exclusivamente touch, o bloco é simplesmente ignorado, mantendo os estilos base limpos.
Você também pode combiná-la com pointer: fine para selecionar dispositivos de apontamento precisos (rato/trackpad) excluindo os imprecisos (touch):
@media (hover: hover) and (pointer: fine) {
.button:hover {
background-color: #145e8a;
}
}Acessibilidade: emparelhar :hover com :focus
Os utilizadores de teclado navegam com a tecla Tab, que aciona :focus em vez de :hover. Se os seus estilos de hover transmitem feedback visual importante (como destacar o item de navegação ativo), aplique os mesmos estilos ao :focus para que os utilizadores de teclado obtenham feedback equivalente:
/* Always pair hover and focus for interactive elements */
a:hover,
a:focus {
outline: 2px solid #1c87c9;
outline-offset: 2px;
text-decoration: underline;
}Para componentes compostos (como um cartão que contém um botão), :focus-within permite estilizar o pai sempre que qualquer filho tiver foco:
.card:hover,
.card:focus-within {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}Efeitos de hover em outras propriedades
:hover não se limita a cores. Qualquer propriedade CSS animável pode ser alternada ou transicionada ao passar o ponteiro:
| Propriedade | Efeito de hover típico |
|---|---|
opacity | Aparecer/desaparecer overlays ou UI secundária |
transform | Escalar, transladar ou rodar um elemento |
box-shadow | Adicionar profundidade a cartões e botões |
color | Alterar a cor do texto ou ícone |
cursor | Indicar que um elemento é interativo |
Boas práticas
- Emparelhe
:hovercom:focuspara que os utilizadores de teclado recebam o mesmo feedback visual:a:hover, a:focus { ... }. - Restrinja animações exclusivas de hover com
@media (hover: hover)para evitar estados presos em dispositivos touch. - Coloque
transitionna regra base, não dentro de:hover, para que a animação se aplique em ambas as direções. - Não oculte conteúdo essencial que só aparece ao passar o ponteiro — é invisível para utilizadores touch e pode ser ignorado por leitores de ecrã.
- Emparelhe menus de hover com
:focus-withinpara que a navegação por teclado possa abri-los sem rato. - Siga a ordem LVHA ao estilizar links:
:link,:visited,:hover,:active.
Suporte dos browsers
:hover é suportado em todos os browsers modernos e existe desde o IE 7 para a maioria dos elementos (o IE 6 suportava apenas em tags <a>). A feature query @media (hover: hover) é suportada no Chrome 41+, Firefox 64+, Safari 9+ e Edge 79+.