Skip to content

animate

Use this function to animate the transform and opacity properties of an element.

Usage

js
import { animate, easeInOutExpo } from '@studiometa/js-toolkit/utils';

const animation = animate(
  document.body,
  [
    { x: 0, '--red': 0 }, // from
    { x: 100, scale: 0.5, opacity: 0.5, '--red': 255, easing: [0, 1, 0, 1] },
    { x: 0, '--red': 0 }, // to
  ],
  {
    duration: 10,
    easing: easeInOutExpo,
  },
);

animation.start();

Parameters

  • element (HTMLElement | HTMLElement[] | NodeListOf<HTMLElement>): the target HTML element
  • keyframes (KeyFrame[]): array of objects describing the key frames of the animation
  • options (Options): options for the animation, see types below for more details

Return value

The animate function returns an object with methods to control the animation:

start()

Use this method to start the animation which does not start automatically.

pause()

Use this method to pause an animation and commit its styles to the element.

play()

Use this method to unpause a paused animation.

finish()

Use this method to go to the end of the animation. This is an alias for animation.progress(1).

progress(value)

Use this method to get or set the progress (0–1 range) of the animation.

js
import { animate } from '@studiometa/js-toolkit/utils';

const animation = animate(document.body, [{ opacity: 1 }, { opacity: 0 }]);

console.log(animation.progress()); // 0
animation.progress(1);
console.log(animation.progress()); // 1
console.log(document.body.style.opacity); // '0'

Types

ts
import { TransformProps } from '@studiometa/js-toolkit/utils';

type EasingFunction = (value:number) => number;
type BezierCurve = [number, number, number, number];
type CSSCustomPropertyName = `--${string}`;

interface KeyFrame extends TransformProps {
  opacity?: number;
  transformOrigin?: string;
  easing?: EasingFunction|BezierCurve;
  offset?: number;
  [key:CSSCustomPropertyName]: number;
}

interface Options {
  duration?: number | (element: HTMLElement, index: number) => number;
  stagger?: number | (element: HTMLElement, index: number) => number;
  smooth?: true | number;
  easing?: EasingFunction | BezierCurve;
  onStart?: (progress: number) => void;
  onProgress?: (progress: number) => void;
  onFinish?: (progress: number) => void;
}

interface Animate : {
  start: () => void;
  pause: () => void;
  play: () => void;
  finish: () => void;
  progress: (value?: number) => number;
}

function animate(
  element:HTMLElement,
  keyframes: KeyFrame[],
  options?: Options
): Animate;

MIT Licensed