Animaciones y Transiciones
Transiciones, keyframes y efectos de movimiento
Transiciones CSS
Las transiciones te permiten cambiar valores de propiedades suavemente durante una duración especificada. Son perfectas para efectos hover, cambios de estado y micro-interacciones.
Propiedades de Transición
/* Propiedad individual */
.button {
transition-property: background-color;
transition-duration: 0.3s;
transition-timing-function: ease;
transition-delay: 0s;
}
/* Atajo */
.button {
transition: background-color 0.3s ease;
}
/* Múltiples propiedades */
.button {
transition:
background-color 0.3s ease,
transform 0.2s ease-out,
box-shadow 0.3s ease;
}
/* Todas las propiedades */
.button {
transition: all 0.3s ease;
}
Funciones de Temporización
transition-timing-function: linear; /* Velocidad constante */
transition-timing-function: ease; /* Inicio/fin lentos */
transition-timing-function: ease-in; /* Inicio lento */
transition-timing-function: ease-out; /* Fin lento */
transition-timing-function: ease-in-out; /* Ambos lentos */
/* Bezier cúbico personalizado */
transition-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55);
Animaciones CSS (Keyframes)
Para animaciones más complejas que transiciones simples, usa keyframes. Los keyframes te permiten definir múltiples pasos y crear animaciones que se ejecutan automáticamente o en bucle.
Definiendo Keyframes
/* Sintaxis básica */
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
/* Múltiples pasos con porcentajes */
@keyframes bounce {
0% {
transform: translateY(0);
}
50% {
transform: translateY(-20px);
}
100% {
transform: translateY(0);
}
}
/* Keyframes complejos */
@keyframes pulse {
0%, 100% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.05);
opacity: 0.8;
}
}
Propiedades de Animación
.element {
animation-name: fadeIn;
animation-duration: 1s;
animation-timing-function: ease;
animation-delay: 0s;
animation-iteration-count: 1; /* o infinite */
animation-direction: normal; /* reverse, alternate */
animation-fill-mode: forwards; /* none, backwards, both */
animation-play-state: running; /* paused */
}
/* Atajo */
.element {
animation: fadeIn 1s ease 0s 1 normal forwards;
}
/* Común */
.element {
animation: fadeIn 0.5s ease forwards;
}
Animaciones Comunes
Fade In
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.fade-in {
animation: fadeIn 0.5s ease forwards;
}
Slide Up
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.slide-up {
animation: slideUp 0.5s ease forwards;
}
Spinner de Carga
@keyframes spin {
to { transform: rotate(360deg); }
}
.spinner {
width: 40px;
height: 40px;
border: 3px solid #f3f3f3;
border-top: 3px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
}
Rendimiento
⚠️ Propiedades que Causan Reflow (Evitar Animar)
- • width, height
- • top, right, bottom, left
- • margin, padding
- • font-size
✓ Propiedades Baratas (Preferir Estas)
- • transform (translate, scale, rotate)
- • opacity
/* En lugar de animar width */
.bad { animation: growWidth 0.3s; }
/* Usa transform: scale */
.good { animation: scale 0.3s; }
✓ Mejores Prácticas de Animación
- • Mantén las animaciones cortas (200-500ms para UI)
- • Usa transform y opacity para rendimiento
- • Respeta prefers-reduced-motion para accesibilidad
- • No animes demasiadas cosas a la vez
- • Usa funciones de easing que se sientan naturales