El panel de animaciones: capturar e inspeccionar
Dónde está, cómo funciona la captura por grupos, qué significa cada parte de la barra de una animación, qué aparece y qué no, y las cuatro preguntas que responde en diez segundos.
Hay una herramienta en las DevTools que responde en diez segundos preguntas que de otro modo cuestan media hora de leer código: qué se está animando exactamente, cuánto dura de verdad, en qué orden arranca cada parte y qué elemento corresponde a cada barra. Casi nadie la usa, en parte porque está escondida en el cajón y en parte porque su modelo de captura no es evidente hasta que alguien te lo explica.
- Abrir el panel y capturar un grupo de animaciones de forma fiable.
- Interpretar cada parte de la barra: retardo, duración, iteraciones y keyframes.
- Saber qué tipos de animación aparecen en el panel y cuáles son invisibles para él.
- Usarlo para responder las cuatro preguntas de diagnóstico más frecuentes.
Abrir y capturar
En Chromium, el panel vive en el cajón inferior: pulsa Escape para abrirlo y elige la pestaña Animations; si no está, aparece en el menú de tres puntos del cajón, en More tools. En Firefox está integrado en el inspector como una pestaña lateral junto a Reglas y Diseño.
El modelo de captura es lo que hay que entender primero, porque produce el desconcierto inicial de todo el mundo: el panel solo registra animaciones que empiezan mientras está abierto. Si abres el panel después de disparar la animación, no verás nada. El flujo correcto es abrir el panel, dejar la página quieta, y entonces provocar la interacción.
Lo segundo es la agrupación. El panel no lista animaciones sueltas: agrupa en un mismo bloque todas las que arrancan dentro de una ventana temporal corta. Un modal que abre a la vez el fondo, el diálogo y tres elementos escalonados aparece como un solo grupo con cinco filas, y esa agrupación es justamente lo que te deja ver la coreografía completa de un vistazo. La lista de la izquierda acumula un grupo por cada disparo; el botón de borrar los limpia todos.
Qué se ve en un grupo
Al seleccionar un grupo, la parte derecha muestra una línea de tiempo con una fila por animación.
El nombre. Para una animación CSS, el nombre de los @keyframes. Para una transición, la propiedad que transiciona. Para una animación creada con element.animate(), el identificador que le hayas dado, o uno genérico si no le pusiste ninguno. Ponerle nombre a tus animaciones de WAAPI merece la pena solo por esto:
elemento.animate(keyframes, { duration: 320, easing: "ease-out", id: "entrada-tarjeta" });
El tramo de retardo. Un segmento atenuado al principio de la barra, que representa el delay. Ver los retardos alineados unos junto a otros es la forma más rápida de entender un escalonado y de detectar el que se te fue de las manos.
El tramo activo. La parte sólida: la duración real. Aquí es donde se descubren la mitad de los problemas de coreografía, porque lo que uno cree que dura trescientos milisegundos a menudo dura ochocientos.
Los círculos de keyframe. En las animaciones CSS con @keyframes de varios pasos, cada porcentaje aparece como un punto en la barra. Su posición muestra el reparto temporal real, que no siempre es el que uno recuerda haber escrito.
Las iteraciones. Una animación repetida dibuja su tramo activo tantas veces como iteraciones tenga. Una infinita se dibuja hasta el borde.
Y dos gestos que valen mucho: pasar el ratón por una fila resalta el elemento en la página con el mismo recuadro que usa el inspector, y pinchar en el nombre lo selecciona en el panel de elementos. En una coreografía de doce filas, eso responde “¿cuál de estas es la que se ve mal?” sin leer una línea de CSS.
El panel de animaciones de Firefox muestra un icono de rayo junto a las animaciones que se están ejecutando en el hilo del compositor. Es una información que Chromium no da de forma directa y que responde la pregunta más importante del rendimiento de animación —¿esto sobrevive a un hilo bloqueado?— sin necesidad de ningún experimento. Vale la pena tener Firefox abierto solo para esto.
Qué aparece y qué no
Esta es la parte que ahorra frustración, porque el panel no es un observador universal.
Aparece:
- Las transiciones CSS.
- Las animaciones CSS con
@keyframes. - Las animaciones creadas con
element.animate()y con la API de WAAPI en general. - Por extensión, todo lo que crea una librería que delegue en WAAPI, que incluye buena parte de lo que hace una librería híbrida moderna.
- Las animaciones dirigidas por scroll, en los navegadores que las implementan, con su propio indicador de progreso en lugar de una línea de tiempo temporal.
No aparece:
- Nada dirigido por
requestAnimationFrameque escriba estilos en línea. Esto incluye la parte del motor de GSAP que no delega, los muelles interrumpibles de cualquier librería, y tu propio bucle. - Los cambios de estilo aplicados de golpe sin transición.
- El movimiento de un
canvas, un vídeo o un contexto WebGL. - Las animaciones dentro de un
iframede otro origen.
Ese primer punto tiene un uso diagnóstico que es la mejor razón para conocer el panel: si el elemento se mueve y el panel no muestra nada, sabes con certeza que hay un bucle de JavaScript escribiendo estilos. Y eso te dice de inmediato que la animación no está en el compositor y que se va a congelar en cuanto el hilo principal se ocupe. Es la misma conclusión a la que llegarías bloqueando el hilo, pero sin escribir nada.
Las cuatro preguntas de diez segundos
¿Cuánto dura de verdad esto? Dispara la interacción con el panel abierto y lee el ancho del grupo completo. Una apertura de modal que “es instantánea” y ocupa novecientos milisegundos de línea de tiempo es un descubrimiento habitual, y casi siempre el culpable es un retardo heredado o una transición sobre una propiedad que nadie recordaba.
¿Qué se está animando además de lo que yo creo? El número de filas del grupo. Cuando salen doce y tú escribiste tres, las nueve restantes vienen de una regla transition: all, del sistema de diseño, o de un componente hijo. Esas nueve están costando trabajo en cada apertura.
¿Por qué esto se siente descoordinado? Mira la alineación de los tramos de retardo. Una coreografía que se percibe torpe casi siempre tiene dos elementos que deberían empezar juntos y empiezan con cuarenta milisegundos de diferencia, o un elemento largo que termina mucho después que el resto y deja la sensación de que la transición “no acaba”.
¿Qué elemento es esta barra? Pasa el ratón. Es trivial y es la razón principal por la que el panel merece estar abierto durante cualquier trabajo de coreografía.
El valor real de esta herramienta no es que ahorre tiempo: es que te muestra la representación resuelta de tu animación, después de que la cascada, los valores heredados, las abreviaturas y los valores por defecto hayan hecho su trabajo. Y entre lo que escribiste y lo que el navegador entendió hay una distancia que nadie sospecha hasta que la ve dibujada. Una transition: all 200ms en un componente de sistema de diseño no es una animación de doscientos milisegundos: son once animaciones de doscientos milisegundos, una por cada propiedad que cambia, y el panel las dibuja las once. Una abreviatura animation con un solo valor de tiempo asigna ese valor a la duración y deja el retardo en cero, pero con dos valores el primero es duración y el segundo retardo, y confundirlos produce exactamente la barra desplazada que estás viendo. Un @keyframes con porcentajes a 0, 60 y 100 reparte el tiempo de forma muy distinta a como se lee el código, y los círculos lo enseñan. Un elemento con dos reglas que declaran transiciones sobre propiedades solapadas acaba con una sola transición ganadora y las otras silenciosamente descartadas. Ninguna de estas cosas es un bug del navegador; todas son consecuencias correctas de reglas que conoces, aplicadas a un conjunto de declaraciones que en su día tenían sentido por separado. Lo que ocurre es que el modelo mental que tienes de tu propia animación es una simplificación construida a partir del último trozo de código que escribiste, y esa simplificación se desincroniza de la realidad muy deprisa en cuanto hay más de una persona tocando la hoja de estilos. El panel es la forma más rápida de resincronizarlo, y por eso el hábito que de verdad marca la diferencia no es abrirlo cuando algo falla, sino abrirlo cuando algo funciona, para comprobar que funciona por las razones que crees.