Editar curvas y tiempos en vivo
Modificar duración, retraso y curva de aceleración desde el panel y desde el editor de curvas, qué se puede cambiar sin recargar, y cómo se traslada el resultado al código.
Ajustar una animación editando el código y recargando es un ciclo de veinte o treinta segundos, y una animación necesita entre diez y treinta iteraciones para quedar bien. Eso son diez minutos de espera pura por animación, y explica por qué en tantos proyectos las curvas son las que salieron por defecto. El panel permite arrastrar los tiempos directamente sobre la línea y editar la curva en un control visual, con el resultado aplicándose al instante. El ciclo pasa de treinta segundos a cero.
- Modificar duración y retraso arrastrando sobre la línea de tiempo.
- Usar el editor visual de curvas y entender qué representan sus puntos.
- Elegir la familia de curva adecuada según el tipo de movimiento.
- Trasladar al código el resultado del ajuste sin perder precisión.
Arrastrar los tiempos
Sobre la línea de tiempo del grupo, las barras son manipulables directamente.
Arrastrar el borde derecho cambia la duración. Arrastrar la barra entera cambia el retraso. Arrastrar el borde izquierdo ajusta el inicio.
Los cambios se aplican inmediatamente, y volver a reproducir el grupo muestra el resultado. Con eso, el ajuste de la coreografía —que es donde están la mayoría de los problemas, como se vio en la lección de la línea de tiempo— pasa a ser directo: escalonar cinco elementos arrastrando cinco barras es cuestión de segundos.
Lo que se cambia aquí no se persiste: al recargar vuelve el valor del código. Es una herramienta de exploración, no de edición. La forma de conservar el resultado es anotar el valor y llevarlo al código.
Los cambios sobre una animación concreta afectan a esa instancia. Si la animación se vuelve a crear —porque el usuario vuelve a abrir el menú, por ejemplo— la nueva instancia sale con los valores del código. Es la causa de la confusión de “lo he cambiado y ha vuelto a lo de antes”: no ha vuelto, es otra animación.
El editor de curvas
Al pulsar sobre el indicador de curva de una animación con aceleración editable, aparece un control visual con la curva dibujada y dos puntos de control arrastrables.
Lo que representa el dibujo es importante y casi nadie lo tiene claro: el eje horizontal es el tiempo y el vertical es el progreso. Una curva que sube deprisa al principio significa que el elemento recorre mucha distancia en poco tiempo al empezar, es decir, arranca rápido. Una que es plana al principio y sube al final significa que arranca lento.
Los dos puntos de control definen una curva de Bézier cúbica con cuatro números, que son las coordenadas de esos dos puntos. El primero y el último están fijos en el origen y en el extremo.
De ahí salen tres lecturas prácticas.
Una curva por encima de la diagonal es rápida al principio y lenta al final: desaceleración. Es la correcta para entradas y para cosas que llegan.
Una curva por debajo de la diagonal es lenta al principio y rápida al final: aceleración. Es la correcta para salidas y para cosas que se van.
Una curva en forma de ese acelera y desacelera: es la correcta para movimientos entre dos posiciones visibles.
El editor incluye además presets con las curvas más habituales, que son un buen punto de partida antes de ajustar a mano.
Hay un caso que el editor de Bézier no cubre: las curvas por pasos, que avanzan a saltos discretos en lugar de continuamente. Se usan para animaciones de sprites y para efectos de escritura, y el panel las muestra pero no las edita con el control de curva.
Qué curva para qué movimiento
| Movimiento | Familia de curva | Por qué |
|---|---|---|
| Algo que entra en pantalla | Desaceleración fuerte | Llega con energía y se asienta |
| Algo que sale de pantalla | Aceleración | Se va y no importa cómo acaba |
| Movimiento entre dos posiciones visibles | Ese suave | El ojo sigue el recorrido completo |
| Respuesta directa a un toque | Casi lineal y muy corta | Cualquier curva se percibe como retraso |
| Aparición de un elemento pequeño | Desaceleración con rebote leve | Sugiere materialidad |
| Cambio de color o de opacidad | Lineal o ese muy suave | No hay trayectoria que interpretar |
La fila que más se incumple es la cuarta. Una respuesta a un toque con una curva de entrada lenta se siente como si la interfaz dudara, y es uno de los defectos que más se notan y menos se diagnostican. Para la respuesta inmediata a una acción del usuario, la regla es duración corta y arranque inmediato.
Trasladar el resultado al código
El editor da los cuatro números de la curva, y esos números van directamente al código.
// Un catalogo de curvas con nombre, para dejar de escribir numeros sueltos
const CURVAS = {
// Entradas: llegan y se asientan
entradaSuave: 'cubic-bezier(0.16, 1, 0.3, 1)',
entradaFirme: 'cubic-bezier(0.05, 0.7, 0.1, 1)',
// Salidas: se van sin ceremonia
salida: 'cubic-bezier(0.3, 0, 0.8, 0.15)',
salidaRapida: 'cubic-bezier(0.4, 0, 1, 1)',
// Movimiento entre posiciones visibles
transicion: 'cubic-bezier(0.4, 0, 0.2, 1)',
// Respuesta directa: casi lineal
respuesta: 'cubic-bezier(0.2, 0, 0.4, 1)',
// Rebote leve: el valor pasa de 1 y vuelve
rebote: 'cubic-bezier(0.34, 1.56, 0.64, 1)'
};
const DURACIONES = {
respuesta: 120,
elemento: 240,
transicion: 320,
pantalla: 420
};
// Comparador ejecutable: dibuja una fila por curva para verlas juntas
(() => {
const host = document.createElement('div');
host.style.cssText = 'font:13px system-ui;padding:8px';
document.body.append(host);
const cajas = Object.entries(CURVAS).map(([nombre, curva]) => {
const fila = document.createElement('div');
fila.style.cssText = 'display:flex;align-items:center;gap:10px;margin:6px 0';
const etiqueta = document.createElement('span');
etiqueta.textContent = nombre.padEnd(14);
etiqueta.style.cssText = 'width:120px;font-family:monospace';
const caja = document.createElement('div');
caja.style.cssText = 'width:22px;height:22px;background:#a6e3a1;border-radius:6px';
fila.append(etiqueta, caja);
host.append(fila);
return { caja, curva };
});
const reproducir = () => {
for (const { caja, curva } of cajas) {
caja.animate(
[{ transform: 'translateX(0)' }, { transform: 'translateX(280px)' }],
{ duration: 900, easing: curva, fill: 'both' }
);
}
};
const boton = document.createElement('button');
boton.textContent = 'Reproducir todas';
boton.onclick = reproducir;
host.prepend(boton);
reproducir();
console.log('Abre el panel de animaciones y ralentiza para comparar las curvas.');
})();
Ese comparador es la herramienta que de verdad enseña la diferencia entre curvas: verlas por separado no sirve de nada, y verlas simultáneamente recorriendo la misma distancia en el mismo tiempo hace evidente cuál corresponde a cada situación.
El catálogo con nombres es la parte que conviene llevarse al proyecto. Escribir los cuatro números en cada sitio garantiza que en seis meses habrá quince curvas ligeramente distintas y ninguna razón documentada. Un conjunto pequeño de curvas con nombre semántico, expuestas como variables CSS o como constantes, es lo que hace que el movimiento de una aplicación se sienta coherente.
Se suele hablar de las curvas de aceleración como si fueran cuestión de gusto, y esa idea impide tomar buenas decisiones. Hay un criterio objetivo detrás, y viene de que el sistema visual humano interpreta el movimiento asumiendo que las cosas tienen masa. Un objeto físico no puede empezar a moverse a velocidad máxima instantáneamente ni pararse en seco: acelera y frena. Cuando un elemento de la interfaz se mueve linealmente, el cerebro lo lee como algo mecánico, empujado por una fuerza externa constante, y esa lectura es correcta para una barra de progreso y equivocada para una tarjeta que el usuario acaba de tocar. Cuando un elemento aparece con una desaceleración fuerte, se lee como algo que venía con inercia y se asienta, que es exactamente la historia que quieres contar cuando algo entra. De ahí salen tres reglas que no son opinables. La primera: nada que el usuario haya iniciado debería empezar lento. Si tocas algo y tarda en reaccionar, la interfaz parece que duda, y la curva de entrada lenta produce exactamente esa impresión aunque la duración total sea corta. La respuesta arranca inmediatamente y frena al final. La segunda: lo que se va merece menos tiempo y menos cuidado que lo que llega. El usuario ya no está mirando lo que desaparece; una salida acelerada y corta libera la atención, y una salida lenta la retiene innecesariamente en algo que ya no importa. Esa asimetría es la razón de que un catálogo de curvas necesite entradas y salidas distintas y no una sola curva simétrica. Y la tercera: el rebote solo tiene sentido cuando quieres sugerir materialidad, y casi nunca la quieres. Un valor que pasa de su destino y vuelve comunica ligereza y juego; en una herramienta profesional que la gente usa ocho horas al día, ese mensaje se agota rápido y acaba percibiéndose como imprecisión. La consecuencia práctica de las tres es que la elección de curva se deriva de qué está pasando, no de qué queda bonito, y por tanto es una decisión que se puede revisar en una revisión de código igual que cualquier otra: si el movimiento no corresponde a la historia que cuenta la interacción, está mal, y el panel de animaciones con la velocidad reducida es donde se comprueba.