Cómo funciona :hover
:hover es una pseudoclase que selecciona un elemento mientras el puntero del mouse está encima. Agrégala a cualquier selector y escribe los estilos del estado hover:
Solo cambian las declaraciones de la regla :hover; todo lo demás se mantiene de .btn. Cuando el puntero sale, el elemento vuelve a sus estilos normales.
Efectos hover suaves con transition
Un cambio en hover es instantáneo salvo que agregues transition a la regla normal (no a la regla :hover), para que se anime tanto al entrar como al salir:
transform y opacity son las propiedades más baratas de animar; no mueven los elementos que las rodean. Animar width, height o margin hace que la página recalcule el layout en cada fotograma. Las duraciones, los retrasos y las curvas de aceleración están en la página de transition en CSS.
Colores de enlaces: :link, :visited, :hover, :active
Los enlaces tienen cuatro estados clásicos, más el foco del teclado, y el orden de las reglas importa:
| Pseudoclase | Se aplica cuando |
|---|---|
:link | El enlace no se ha visitado |
:visited | La URL está en el historial del navegador |
:hover | El puntero está encima |
:active | Se está presionando |
:focus-visible | Tiene el foco del teclado |
Todas tienen la misma especificidad, así que gana la regla posterior cuando coinciden dos. Un enlace visitado en hover coincide con :visited y con :hover; si :visited va al final, el color de hover nunca se ve. El orden seguro es Link, Visited, Hover, Active (LVHA):
Los navegadores limitan lo que :visited puede cambiar, para que las páginas no lean tu historial. Solo tienen efecto las propiedades relacionadas con el color (color, background-color, border-color, outline-color y algunas más), y los scripts siempre ven el valor de no visitado.
:active: el estado presionado
:active coincide mientras el elemento se está presionando. Un pequeño movimiento hace que un botón se sienta físico:
Hover en el padre para dar estilo a un hijo
El estado hover pertenece al elemento que está bajo el puntero y a todos sus ancestros. Así, .card:hover .title da estilo al título cuando cualquier parte de la tarjeta está en hover, y la misma idea sirve para mostrar elementos ocultos:
La línea de :focus-within importa: sin ella, un usuario de teclado que llega con Tab al botón Delete presionaría un botón invisible. Acompaña cada elemento que aparece con hover con una regla de foco.
Hover en pantallas táctiles
Los teléfonos y las tablets no tienen un puntero que se quede sobre un elemento. La mayoría de los navegadores móviles aplican :hover en el primer toque y lo mantienen hasta que tocas en otro lugar, así que un estilo hover puede quedar pegado. Dos reglas lo mantienen bajo control:
- Nunca pongas detrás de
:hoverla única forma de llegar a un contenido. Un menú que se abre con hover también tiene que abrirse con un clic. - Envuelve los efectos hover puramente decorativos en una media query que compruebe si hay un dispositivo con hover real:
@media (hover: hover) {
.card:hover { transform: translateY(-4px); }
}
Errores comunes
- Un espacio antes de los dos puntos.
.btn :hoversignifica "un elemento en hover dentro de.btn". Escribe.btn:hover. transitionsolo en la regla:hover. Así se anima al entrar pero vuelve de golpe al salir. Ponla en la regla normal.- Orden incorrecto en los enlaces. Mantén
:link,:visited,:hover,:activeen ese orden. - Hover sin estilo de foco. Los usuarios de teclado nunca activan
:hover; dales también a los elementos interactivos un estilo:focus-visible. - Hover en un elemento tapado por otro. Una capa invisible encima (a menudo un pseudoelemento absoluto) puede capturar el puntero.
pointer-events: noneen esa capa lo soluciona.
Preguntas frecuentes
¿Cómo agrego un efecto hover en CSS?
Escribe una regla con :hover después del selector: .btn:hover { background: #1d4ed8; }. Las declaraciones se aplican mientras el puntero está sobre el elemento. Agrega transition: background 0.2s; a la regla normal para animar el cambio.
¿Qué diferencia hay entre :hover y :active?
:hover se aplica mientras el puntero está sobre el elemento. :active se aplica mientras se está presionando, desde que se baja el botón del mouse hasta que se suelta. Un botón presionado suele estar en hover y en active a la vez.
¿En qué orden van las pseudoclases de los enlaces?
:link, :visited, :hover, :active (recuerda LVHA, o "LoVe HAte" en inglés). Tienen la misma especificidad, así que gana la regla posterior; en cualquier otro orden, un estilo de visitado o de hover puede ocultar el estilo de hover o de active.
¿Cómo cambio el color de los enlaces en CSS?
Da estilo al elemento a: a { color: #2563eb; }, y luego a:visited { color: #7c3aed; } y a:hover { color: #1d4ed8; } para los otros estados. Definir color en a cubre tanto los enlaces no visitados como los visitados.
¿El hover funciona en el celular?
Las pantallas táctiles no tienen un puntero que se quede sobre un elemento. La mayoría de los navegadores móviles aplican :hover al tocar y lo mantienen hasta que tocas en otro lugar, lo que puede dejar un estilo hover pegado. Envuelve los efectos que son solo de hover en @media (hover: hover) y nunca escondas contenido esencial detrás de un hover.