Skip to content

Funciones de suavizado (tween)

Siete familias de suavizado, cada una con su forma easeIn y su forma easeOut. Son matemáticas puras: ni DOM, ni un bucle de animación propio. Tú le das el tiempo actual desde tu propio fotograma y te devuelve el valor que ese fotograma debe usar.

Los parámetros siguen la convención clásica de Robert Penner:

  • t: tiempo actual (cuánto ha transcurrido)
  • b: valor inicial
  • c: variación del valor (el valor final es b + c)
  • d: duración

Todas las funciones acotan por dentro en t >= d, así que llamarlas pasado el final devuelve el valor definitivo en lugar de extrapolar fuera de rango.

Uso

ts
import { cubic } from 'ranuts/utils';

const start = performance.now();
const tick = (now: number) => {
  const x = cubic.easeOut(now - start, 0, 300, 600); // de 0 a 300 en 600 ms
  el.style.transform = `translateX(${x}px)`;
  if (now - start < 600) requestAnimationFrame(tick);
};
requestAnimationFrame(tick);

Curvas disponibles

ExportaciónCurvaSensación
quadcuadrática ()La aceleración más suave; una opción segura
cubiccúbica ()Bastante más viva que quad
quartcuártica (t⁴)Aceleración fuerte
quintquíntica (t⁵)Muy fuerte; el final domina el movimiento
sinesinusoidalLa más suave de todas, apenas se percibe
expoexponencialCasi quieta, y de pronto se lanza
circcircularArranque lento, final muy brusco

API

Todas las exportaciones tienen la misma forma:

ts
interface SpeedType {
  easeIn: EasingFn;
  easeOut: EasingFn;
}

type EasingFn = (t: number, b: number, c: number, d: number) => number;

easeIn / easeOut

Parámetros

ParámetroDescripciónTipoPor defecto
tTiempo transcurridonumberObligatorio
bValor inicialnumberObligatorio
cVariación del valor (el final es b + c)numberObligatorio
dDuraciónnumberObligatorio

Devuelve

ArgumentoDescripciónTipo
valueEl valor en el instante tnumber

Notas

easeIn arranca lento y acelera; easeOut arranca rápido y frena. Para una interfaz que responde a una acción de la persona, easeOut suele quedar mejor: el elemento se mueve al momento y se asienta, en lugar de dudar primero.

Con agradecimiento a zhangxinxu/Tween.

Publicado bajo la licencia MIT.