CSS 11: Transiciones y Animaciones

Domina el movimiento en CSS: desde transiciones suaves hasta animaciones complejas con keyframes.

1. ¿Por Qué Animar en CSS?

Las transiciones y animaciones en CSS permiten crear experiencias visuales fluidas y atractivas sin necesidad de JavaScript. Son fundamentales para la UX moderna:

CSS vs JavaScript para Animar

Aspecto CSS JavaScript
Rendimiento ? Excelente (usa GPU) ?? Depende del código
Sencillez ? Muy fácil ?? Más complejo
Control preciso ?? Limitado ? Total
Casos de uso Hovers, fadeIn, slides Animaciones complejas, juegos

Regla de oro: Usa CSS siempre que puedas. Reserva JavaScript para lógica compleja.

2. Transiciones (Transitions)

Una transición es un cambio gradual entre dos estados de un elemento. Por ejemplo, cuando pasas el ratón sobre un botón y cambia de color suavemente en lugar de hacerlo de golpe.

Sintaxis Básica

Se aplica al elemento en su estado normal (no en :hover):

/* Sintaxis general */

.elemento {

  transition: propiedad duración función-tiempo retraso;

}



/* Ejemplo real */

.boton {

  background-color: #3498db;

  transition: background-color 0.3s ease;

}



.boton:hover {

  background-color: #e74c3c;

}

Las 4 Propiedades de Transition

Propiedad Descripción Valores comunes
transition-property Qué propiedad(es) animar all, background-color, transform
transition-duration Cuánto dura la transición 0.3s, 500ms, 1.5s
transition-timing-function Curva de aceleración ease, linear, ease-in-out
transition-delay Espera antes de empezar 0s, 0.5s, 200ms

Ejemplo: Control Total

/* Forma individual (más control) */

.caja {

  transition-property: background-color, transform;

  transition-duration: 0.3s, 0.5s;

  transition-timing-function: ease, ease-out;

  transition-delay: 0s, 0.1s;

}



/* Forma abreviada (más común) */

.caja {

  transition: background-color 0.3s ease,

              transform 0.5s ease-out 0.1s;

}
Hover aquí

?? Propiedades que SÍ se pueden Animar

No todas las propiedades CSS admiten transiciones. Funcionan las que tienen valores intermedios:

Timing Functions (Curvas de Aceleración)

Controlan la velocidad durante la transición:

Pasa el ratón sobre esta sección para ver las diferencias:
linear
ease
ease-in
ease-out
ease-in-out

Cubic Bezier: Control Personalizado

Para curvas personalizadas, usa cubic-bezier():

.elemento {

  /* Rebote suave */

  transition: transform 0.5s cubic-bezier(0.68, -0.55, 0.27, 1.55);

}



/* Herramienta recomendada: https://cubic-bezier.com */

3. Animaciones (Keyframes)

Mientras las transiciones van de un estado A a un estado B, las animaciones con keyframes pueden tener múltiples pasos intermedios y ejecutarse automáticamente (sin hover).

Estructura de una Animación

Se necesitan 2 partes:

  1. Definir la animación con @keyframes
  2. Aplicarla a un elemento con animation
/* 1. Definir la animación */

@keyframes nombre-animacion {

  from {

    /* Estado inicial */

    transform: translateX(0);

    opacity: 0;

  }

  to {

    /* Estado final */

    transform: translateX(100px);

    opacity: 1;

  }

}



/* 2. Aplicar la animación */

.elemento {

  animation: nombre-animacion 2s ease infinite;

}

Keyframes con Porcentajes

Para animaciones complejas, usa porcentajes en lugar de from / to:

@keyframes rebote {

  0% {

    transform: translateY(0);

  }

  50% {

    transform: translateY(-100px);

  }

  75% {

    transform: translateY(-50px);

  }

  100% {

    transform: translateY(0);

  }

}

Las 8 Propiedades de Animation

Propiedad Descripción Valores comunes
animation-name Nombre del @keyframes rebote, fadeIn
animation-duration Duración total 2s, 500ms
animation-timing-function Curva de velocidad ease, linear
animation-delay Espera antes de empezar 0s, 1s
animation-iteration-count Cuántas veces repetir 1, 3, infinite
animation-direction Dirección de reproducción normal, reverse, alternate
animation-fill-mode Estado antes/después none, forwards, backwards
animation-play-state Pausar/reanudar running, paused

Ejemplo: Propiedades Clave Explicadas

animation-iteration-count

.elemento {

  animation: giro 2s linear 3; /* Se repite 3 veces y para */

  animation: giro 2s linear infinite; /* Se repite para siempre */

}

animation-direction

.elemento {

  /* normal: 0% ? 100% (siempre en la misma dirección) */

  animation-direction: normal;

  

  /* reverse: 100% ? 0% (al revés) */

  animation-direction: reverse;

  

  /* alternate: 0% ? 100% ? 0% ? 100% (ping-pong) */

  animation-direction: alternate;

  

  /* alternate-reverse: 100% ? 0% ? 100% ? 0% */

  animation-direction: alternate-reverse;

}
normal: Vuelve al inicio de golpe
alternate: Va y vuelve suavemente

animation-fill-mode

Controla qué pasa antes de empezar y después de terminar:

.elemento {

  /* none (por defecto): No mantiene ningún estado */

  animation-fill-mode: none;

  

  /* forwards: Mantiene el último keyframe (100%) */

  animation-fill-mode: forwards;

  

  /* backwards: Aplica el primer keyframe (0%) antes de empezar */

  animation-fill-mode: backwards;

  

  /* both: forwards + backwards */

  animation-fill-mode: both;

}

Sintaxis Abreviada

/* Orden: name duration timing-function delay iteration-count direction fill-mode */

.elemento {

  animation: rebote 2s ease-in-out 0.5s infinite alternate forwards;

}



/* Múltiples animaciones */

.elemento {

  animation: fadeIn 1s ease,

             slideUp 0.5s ease 0.5s;

}

4. Transiciones vs Animaciones: ¿Cuándo Usar Cada Una?

Aspecto Transiciones Animaciones
Activación Requiere evento (hover, cambio de clase) Automática al cargar
Estados Solo 2: inicio ? fin Múltiples (0%, 25%, 50%, 100%...)
Control Básico Avanzado (repetir, dirección, etc.)
Casos de uso Hovers, cambios de estado Loaders, intros, efectos complejos

Ejemplos de Uso Real

5. Ejemplos Prácticos Completos

Ejemplo 1: Botón con Efecto Profesional

.btn-pro {

  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);

  color: white;

  padding: 15px 40px;

  border: none;

  border-radius: 50px;

  font-size: 1.1em;

  cursor: pointer;

  box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);

  transition: transform 0.3s ease, 

              box-shadow 0.3s ease;

}



.btn-pro:hover {

  transform: translateY(-3px);

  box-shadow: 0 6px 20px rgba(102, 126, 234, 0.6);

}



.btn-pro:active {

  transform: translateY(-1px);

  box-shadow: 0 3px 10px rgba(102, 126, 234, 0.4);

}

Ejemplo 2: Loader Infinito

@keyframes girar {

  0% {

    transform: rotate(0deg);

  }

  100% {

    transform: rotate(360deg);

  }

}



.loader {

  width: 50px;

  height: 50px;

  border: 5px solid #f3f3f3;

  border-top: 5px solid #3498db;

  border-radius: 50%;

  animation: girar 1s linear infinite;

}

Ejemplo 3: FadeIn de Entrada

@keyframes fadeIn {

  from {

    opacity: 0;

    transform: translateY(20px);

  }

  to {

    opacity: 1;

    transform: translateY(0);

  }

}



.aparecer {

  animation: fadeIn 0.8s ease-out;

}

¡Aparezco suavemente!

Recarga la página para ver el efecto de nuevo

Ejemplo 4: Pulso Infinito

@keyframes pulso {

  0%, 100% {

    transform: scale(1);

    opacity: 1;

  }

  50% {

    transform: scale(1.1);

    opacity: 0.7;

  }

}



.notificacion {

  animation: pulso 2s ease-in-out infinite;

}
?? Nueva notificación

6. Buenas Prácticas y Rendimiento

? Propiedades Económicas (Usar siempre)

Estas propiedades no afectan el layout y usan la GPU:

/* ? BIEN: Usa transform */

.elemento:hover {

  transform: translateX(100px);

}



/* ? MAL: Usa left (provoca reflow) */

.elemento:hover {

  left: 100px;

}

?? Propiedades Costosas (Evitar animar)

Estas fuerzan al navegador a recalcular todo el layout:

Consejos Generales

  1. Duraciones: 200-500ms para interacciones, 800ms para entradas
  2. No abuses de all: Especifica qué animar
    /* ? MAL */
    
    transition: all 0.3s;
    
    
    
    /* ? MEJOR */
    
    transition: background-color 0.3s, transform 0.3s;
  3. Accesibilidad: Respeta prefers-reduced-motion
    @media (prefers-reduced-motion: reduce) {
    
      * {
    
        animation-duration: 0.01ms !important;
    
        transition-duration: 0.01ms !important;
    
      }
    
    }
  4. Usa will-change solo si sabes que vas a animar:
    .elemento {
    
      will-change: transform; /* Prepara la GPU */
    
    }

7. Herramientas y Recursos

Siguiente paso: Explora la Colección de 100 Efectos para ver ejemplos visuales y copiar código.

Volver a CSS