Animation: overallProgress property

Experimental: This is an experimental technology
Check the Browser compatibility table carefully before using this in production.

The overallProgress read-only property of the Animation interface returns a number between 0 and 1 indicating the animation's overall progress towards its finished state. This is the overall progress across all of the animation's iterations, not each individual iteration.

overallProgress works consistently across all animations, regardless of the type of timeline.

Value

A number between 0 and 1, or null if the animation lacks a timeline, is inactive or hasn't been played yet, or if its currentTime is set to a non-time value.

If the animation's iterations property is set to Infinity, or if its currentTime is set to a negative value, overallProgress will return 0.

If the animation's duration is set to 0, overallProgress will return 1.

Examples

Displaying a percentage progress

This demo uses overallProgress to create a "percentage progress" readout, which is displayed to the screen while an animation runs.

HTML

The HTML contains a <button> to press to start the animation, a <p> element in which to display the percentage progress, and a <div> that will be animated.

html
<button>Run animation</button>
<p class="progress">Progress: 0%</p>
<div class="box"></div>

The demo's CSS provides some rudimentary styling, which is not important for understanding how the JavaScript works, therefore we have hidden it for brevity.

JavaScript

In the JavaScript, we start off by grabbing references to the <button>, <p>, and <div> elements.

We then create:

  • an animation variable which will reference the animation, once we've created it
  • a keyframes array
  • an options object containing timing properties.
js
const btn = document.querySelector("button");
const progress = document.querySelector(".progress");
const box = document.querySelector(".box");

let animation;

const keyframes = [{ rotate: "0deg" }, { rotate: "360deg" }];

const timingProps = {
  duration: 3000,
  iterations: 1,
};

Next we add a "click" event listener to the <button> via addEventListener() so that, when pressed, it:

  1. Starts the animation running using Element.animate(), passing it the keyframes and options defined earlier and assigning the returned Animation instance to the animation variable.
  2. Runs a function called updateProgress() via the requestAnimationFrame() method, which handles updating the percentage process display.
js
btn.addEventListener("click", () => {
  // Animate the box
  animation = box.animate(keyframes, timingProps);
  // Start updating the progress percentage via rAF()
  requestAnimationFrame(updateProgress);
});

Now let's define the updateProgress() function. This queries Animation.playState to see if the animation is not finished. If it isn't finished, we grab the current value of overallProgress, multiplying it by 100 and rounding the result down to convert it to a whole percentage number, then update the <p> element's textContent value with it. We then call requestAnimationFrame(updateProgress) again to re-run the progress percentage update.

If the animation is finished, we replace the percentage progress with a "Finished!" message, and don't call requestAnimationFrame(updateProgress), so the progress percentage updates stop.

js
function updateProgress() {
  // Check if the animation is finished
  if (animation.playState !== "finished") {
    // Convert overallProgress to a whole number percentage
    const progressPercentage = Math.floor(animation.overallProgress * 100);
    // Update the progress paragraph with the percentage
    progress.textContent = `Progress: ${progressPercentage}%`;
    // Only request the next frame if the animation is not finished
    requestAnimationFrame(updateProgress);
  } else {
    progress.textContent = "Finished!";
  }
}

Result

The output looks like this. Try pressing the button to see the animation and associated progress indicator run.

Specifications

Specification
Web Animations Level 2
# dom-animation-overallprogress

Browser compatibility

BCD tables only load in the browser

See also