wandres.dev
ANIMATIONS · El panel de animaciones

Capturar animaciones: qué ve el panel y qué es invisible para él

Cómo se abre el panel de animaciones, qué agrupa como un grupo, los tres tipos de animación que captura, y por qué el movimiento hecho a mano no aparece nunca.

⏱ 15 min

El panel de animaciones es de los pocos de las DevTools que se abren pocas veces y que las pocas veces resuelven en dos minutos algo que de otro modo cuesta media hora de recargar y mirar. Su modelo es sencillo: escucha las animaciones que el motor del navegador gestiona, las agrupa por proximidad temporal, y te deja pararlas, rebobinarlas y modificarlas. La parte que hay que entender antes de usarlo es qué entra en esa definición y qué queda fuera, porque lo que queda fuera es invisible por completo.

🎯 Al terminar esta lección sabrás
  • Abrir el panel y provocar la captura de un grupo de animación.
  • Enumerar los tres tipos de animación que el motor gestiona y por tanto captura.
  • Explicar por qué el movimiento controlado por script no aparece.
  • Consultar desde la consola todas las animaciones activas de la página.

Abrir y capturar

El panel de animaciones vive en el cajón inferior y se abre por su nombre desde el menú de comandos.

Empieza vacío y se llena solo: en cuanto ocurre una animación en la página, aparece como un grupo. No hay que pulsar ningún botón de grabación.

El agrupamiento es por proximidad temporal: las animaciones que empiezan aproximadamente a la vez se consideran un grupo y se presentan juntas en una misma línea de tiempo. Es la decisión de diseño que hace útil el panel, porque una transición de interfaz real no suele ser una animación sino cinco o diez que se coordinan, y verlas juntas es lo que permite juzgar si la coordinación funciona.

Cada grupo muestra su duración total, y al seleccionarlo se despliega su contenido: una fila por cada animación, con el elemento al que afecta, sus tiempos y sus fotogramas clave.

💡
Tip

Un flujo que se usa constantemente: provocar la animación, ver que el grupo aparece, y volver a reproducirlo desde el panel con el botón de reproducción. Eso evita tener que volver a provocarla en la página, que muchas veces implica recargar, navegar y volver a colocarse. Con animaciones de entrada, que solo ocurren una vez, es la diferencia entre poder estudiarlas y no poder.

Los tres tipos que captura

El panel ve lo que el motor de animación del navegador gestiona, y eso son exactamente tres cosas.

Transiciones CSS. Un cambio de propiedad con una transición declarada. El grupo aparece en el momento en que cambia la propiedad.

Animaciones CSS con fotogramas clave. Declaradas con una regla de fotogramas clave y aplicadas con la propiedad de animación.

Animaciones creadas con la API de animaciones web. Las que se crean llamando al método de animación de un elemento, o construyendo la animación explícitamente.

Las tres tienen algo en común que es lo que las hace capturables: el navegador conoce su estado completo por adelantado. Sabe dónde empieza, dónde acaba, cuánto dura, con qué curva y en qué momento está. Por eso puede pararlas, rebobinarlas y cambiarles la velocidad.

Lo que es invisible

Todo lo demás. Y “todo lo demás” incluye una parte importante del movimiento que hay en la web.

El movimiento hecho con sincronización de fotograma. Una función que se ejecuta en cada fotograma y modifica un estilo no es una animación para el navegador: son mutaciones sucesivas de un estilo. No hay estado, no hay duración, no hay curva. El panel no puede mostrarlo porque no existe como objeto.

Las librerías que animan escribiendo estilos. Muchas librerías de animación funcionan así, y por tanto su trabajo no aparece en este panel. Algunas ofrecen la opción de usar la API de animaciones web por debajo, y en ese caso sí aparecen. Merece la pena comprobarlo, porque cambia la depurabilidad por completo.

Los cambios de estilo directos. Cambiar una clase que mueve algo instantáneamente no es una animación.

El desplazamiento. Ni el del usuario ni el programático.

La consecuencia práctica es una comprobación de diagnóstico muy útil: si algo se mueve en la página y no aparece en este panel, lo está moviendo código en el hilo principal. Eso es un dato de rendimiento importante, porque significa que ese movimiento se congelará en cuanto el hilo se ocupe, y también significa que no se puede depurar aquí.

Inventario desde la consola

Para saber qué animaciones hay activas sin depender del panel, la API expone una consulta directa.

// Inventario de todas las animaciones activas del documento
(() => {
  const listar = () => {
    const animaciones = document.getAnimations();
    if (!animaciones.length) return console.log('No hay animaciones activas.');

    const filas = animaciones.map((a, i) => {
      const t = a.effect?.getTiming?.() ?? {};
      const objetivo = a.effect?.target;
      return {
        i,
        nombre: a.animationName || a.transitionProperty || a.id || '(WAAPI)',
        estado: a.playState,
        elemento: objetivo
          ? objetivo.tagName.toLowerCase() + (objetivo.id ? '#' + objetivo.id : '')
          : '(sin objetivo)',
        duracionMs: typeof t.duration === 'number' ? Math.round(t.duration) : t.duration,
        retrasoMs: t.delay ?? 0,
        iteraciones: t.iterations ?? 1,
        curva: t.easing ?? '',
        tiempoMs: Math.round(a.currentTime ?? 0)
      };
    });
    console.table(filas);
    return animaciones;
  };

  window.animaciones = listar;
  window.pausarTodas = () => { document.getAnimations().forEach(a => a.pause()); console.log('Pausadas.'); };
  window.reanudarTodas = () => { document.getAnimations().forEach(a => a.play()); console.log('Reanudadas.'); };
  window.ralentizarTodas = (factor = 0.1) => {
    document.getAnimations().forEach(a => { a.updatePlaybackRate(factor); });
    console.log('Velocidad puesta a', factor);
  };

  listar();
  console.log('Disponibles: animaciones(), pausarTodas(), reanudarTodas(), ralentizarTodas(0.1)');
})();

Esa consulta devuelve exactamente el mismo conjunto que el panel captura, lo que la convierte en una comprobación rápida: si tu movimiento no está en esa lista, no está en el panel, y ya sabes por qué.

La función de pausa global tiene además un uso práctico inmediato que nada tiene que ver con depurar animaciones: congelar la interfaz para poder inspeccionar un estado intermedio. Un menú que aparece con una animación de entrada es difícil de inspeccionar mientras se mueve; pausar todas las animaciones lo deja quieto en mitad del recorrido.

Que una animación exista como objeto y no como una sucesión de mutaciones cambia mucho más que su depurabilidad

La distinción entre lo que el panel captura y lo que no parece un detalle de la herramienta y en realidad es una de las decisiones de arquitectura más consecuentes que se toman al construir una interfaz con movimiento. Cuando una animación es un objeto que el navegador conoce, ese objeto tiene propiedades que ninguna sucesión de mutaciones puede tener. Es interrumpible y reversible: se puede invertir a mitad de camino desde su posición actual, que es lo que hace que un menú que se está abriendo y el usuario decide cerrar se comporte de forma natural en lugar de saltar. Es componible: se puede consultar su promesa de finalización y encadenar sin temporizadores que adivinen cuándo acaba. Es planificable: el navegador sabe qué va a pasar en los próximos fotogramas y puede prepararse, incluso ejecutarla fuera del hilo principal si solo afecta a transformación y opacidad, con lo que sobrevive a un bloqueo del hilo. Y es cancelable de forma limpia, con un estado final bien definido. Un movimiento hecho a mano en cada fotograma no tiene ninguna de esas cuatro propiedades: interrumpirlo requiere lógica propia, invertirlo requiere más lógica, saber cuándo termina requiere un temporizador que puede desincronizarse, y si el hilo principal se ocupa, se congela sin remedio porque quien lo mueve es precisamente el hilo que está ocupado. La regla que se deriva es una de las más rentables del desarrollo de interfaces: expresa el movimiento de forma declarativa siempre que puedas, y reserva el control por fotograma para lo que de verdad no se puede expresar así —físicas, movimiento que sigue al puntero, simulaciones—. Y hay un corolario sobre las librerías que conviene aplicar al elegirlas: una librería de animación que se apoye en la API de animaciones web te da gratis las cuatro propiedades y además la depurabilidad en este panel; una que escriba estilos en cada fotograma te obliga a reimplementar las cuatro y te deja sin herramientas. Es un criterio de selección mucho más importante que la sintaxis o el peso.