Transiciones y animaciones

Añades un color :hover a un botón y funciona, pero el cambio es abrupto: un fotograma está azul, el siguiente está más oscuro, sin nada en medio. Un pequeño desvanecimiento haría que toda la página se sintiera menos entrecortada. Ese desvanecimiento es una transición, y una vez que puedes describir movimiento entre dos estados, las mismas herramientas escalan hasta efectos hover, tarjetas que se elevan, y un spinner que gira mientras algo se carga. Este capítulo trata sobre cómo CSS mueve cosas, y cómo moverlas sin hacer la página más difícil de usar.
Transiciones
Una transición le dice al navegador que anime una propiedad de su valor anterior al nuevo en lugar de cambiar entre ellos bruscamente. Describes dos estados, el normal y el hover, y la transición rellena los fotogramas en medio.
Aquí hay un botón que cambia de color al pasar el mouse. Sin una transición el color salta; con una se desvanece:
.btn {
background: #3b82f6;
transition: background 0.2s; /* desvanece el color en 0.2 segundos */
}
.btn:hover {
background: #1d4ed8; /* el nuevo estado hacia el que animar */
}Pones transition en el estado normal, no en :hover. De esa manera se aplica tanto cuando llega el mouse como cuando se va.
:hover, así que funciona entrando y saliendo. Comienza con property y una duration y ya tienes un desvanecimiento funcional. Transformaciones
Una transformación mueve, escala o rota un elemento sin perturbar nada a su alrededor. Es lo que normalmente querrás animar, porque se ve suave y no empuja a los vecinos fuera del camino.
Hay tres que usarás constantemente:
.card:hover {
transform: translateY(-4px); /* mueve hacia arriba 4 píxeles */
}
.icon:hover {
transform: scale(1.1); /* crece al 110% de su tamaño */
}
.arrow.open {
transform: rotate(90deg); /* gira un cuarto de vuelta en sentido horario */
}translate mueve, scale redimensiona, y rotate gira. Combina cualquiera de estos con una transición y obtienes una tarjeta que se eleva, un ícono que salta, o una flecha que se abre girando.
transform mueve, escala o rota un elemento sin empujar a sus vecinos. Los tres a recordar son translate para mover, scale para redimensionar, y rotate para girar. Combínalo con una transición y obtienes una tarjeta que se eleva o un ícono que salta al pasar el mouse. Animaciones de fotogramas clave
Una transición anima entre dos estados. Cuando necesitas más de dos, o necesitas que el movimiento se repita, usas una animación de fotogramas clave. Escribes los pasos con @keyframes, luego los adjuntas a un elemento con la propiedad animation.
Un spinner de carga es el ejemplo clásico: gira para siempre, así que una transición no puede hacerlo.
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.spinner {
animation: spin 1s linear infinite; /* ejecuta spin, 1s por vuelta, para siempre */
}from es el inicio y to es el final. La línea animation dice qué fotogramas clave ejecutar, cuánto tiempo tarda un ciclo, la curva de velocidad, y cuántas veces repetir. infinite significa que nunca se detiene.
@keyframes y ejecútalos con animation. Un spinner es el ejemplo de referencia: from a 0 grados, to a 360, repitiendo con infinite. La línea animation establece qué fotogramas, cuánto tiempo, la curva, y cuántas veces. Movimiento que respeta al usuario
No todos quieren movimiento en la pantalla. A algunas personas les resulta distractor, y para algunas puede causar incomodidad real o náusea. Los navegadores dejan que las personas pidan menos en su configuración del sistema, y CSS puede leer esa solicitud con prefers-reduced-motion.
Envuelve tus animaciones en una verificación para que solo se ejecuten para personas que no han pedido reducir el movimiento:
@media (prefers-reduced-motion: no-preference) {
.card {
transition: transform 0.2s;
}
}La otra mitad de respetar al usuario es la contención: mantén el movimiento corto, sutil, y atado a algo que el lector hizo, como un hover o un clic. El movimiento que llama la atención a un cambio real ayuda; el movimiento por su propia cuenta se cansa rápido.
prefers-reduced-motion y solo ejecuta animaciones para personas que no han reducido el movimiento. Mantén el movimiento que sí añades corto, sutil, y atado a algo que el lector hizo. Qué animar, y por qué importa
Una regla rápida que te ahorrará problemas después: cuando animes movimiento, anima transform y opacity, no propiedades como width, height, top, o margin.
/* suave: el navegador maneja estos barato */
.card:hover {
transform: translateY(-4px);
opacity: 0.9;
}La razón es que transform y opacity son las dos propiedades que los navegadores pueden mover más barato, así que las animaciones construidas sobre ellas permanecen suaves incluso en dispositivos más lentos. Animar propiedades de tamaño o posición hace que el navegador haga más trabajo cada fotograma, y el movimiento puede entrecortarse. Te encontrarás con la razón completa cuando profundices, pero el hábito vale la pena construirlo ahora.
transform y opacity, y aléjate de animar width, height, top, o margin. Esos dos son los más baratos para que el navegador mueva, así que el movimiento permanece suave incluso en dispositivos más lentos. Aprenderás el por qué completo después, pero el hábito vale la pena comenzar ahora. 
