TechLead

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