Animation: overallProgress-Eigenschaft

Die overallProgress-Eigenschaft des Animation-Interfaces gibt eine Zahl zwischen 0 und 1 zurück, die den Gesamtfortschritt der Animation in Richtung ihres Endzustands angibt. Dies ist der Gesamtfortschritt über alle Iterationen der Animation hinweg, nicht jede einzelne Iteration.

overallProgress funktioniert konsistent über alle Animationen hinweg, unabhängig von der Art der timeline.

Wert

Eine Zahl zwischen 0 und 1, oder null, wenn die Animation keine Timeline hat, inaktiv ist oder noch nicht abgespielt wurde, oder wenn ihre currentTime auf einen Nicht-Zeit-Wert gesetzt ist.

Falls die iterations-Eigenschaft der Animation auf Infinity gesetzt ist oder ihre currentTime auf einen negativen Wert gesetzt ist, wird overallProgress 0 zurückgeben.

Wenn die duration der Animation auf 0 gesetzt ist, wird overallProgress 1 zurückgeben.

Beispiele

Anzeige eines prozentualen Fortschritts

Dieses Beispiel verwendet overallProgress, um eine "Prozentfortschritt"-Anzeige zu erstellen, die beim Ausführen einer Animation auf dem Bildschirm angezeigt wird.

HTML

Das HTML enthält einen <button>, der gedrückt werden muss, um die Animation zu starten, ein <p>-Element, in dem der prozentuale Fortschritt angezeigt wird, und ein <div>, das animiert wird.

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

Das CSS des Beispiels bietet ein grundlegendes Styling, das nicht wichtig für das Verständnis des JavaScript ist, daher haben wir es der Kürze halber ausgeblendet.

JavaScript

Im JavaScript beginnen wir damit, Referenzen zu den <button>, <p> und <div>-Elementen zu erhalten.

Wir erstellen dann:

  • eine animation-Variable, die auf die Animation verweisen wird, sobald wir sie erstellt haben,
  • ein keyframes-Array,
  • ein Optionsobjekt, das Zeitsteuerungseigenschaften enthält.
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,
};

Als Nächstes fügen wir dem <button> einen "click"-Ereignislistener über addEventListener() hinzu, sodass beim Drücken Folgendes passiert:

  1. Die Animation wird mittels Element.animate() gestartet, wobei die zuvor definierten Keyframes und Optionen übergeben und die zurückgegebene Animation-Instanz der animation-Variable zugewiesen werden.
  2. Eine Funktion namens updateProgress() wird über die Methode requestAnimationFrame() ausgeführt, die die Aktualisierung der Prozentfortschrittsanzeige übernimmt.
js
btn.addEventListener("click", () => {
  // Animate the box
  animation = box.animate(keyframes, timingProps);
  // Start updating the progress percentage via rAF()
  requestAnimationFrame(updateProgress);
});

Definieren wir nun die updateProgress()-Funktion. Diese fragt Animation.playState ab, um zu sehen, ob die Animation noch nicht beendet ist. Wenn sie nicht beendet ist, holen wir den aktuellen Wert von overallProgress, multiplizieren ihn mit 100 und runden das Ergebnis ab, um es in eine ganze Prozentzahl umzuwandeln, dann aktualisieren wir den textContent-Wert des <p>-Elements damit. Anschließend rufen wir requestAnimationFrame(updateProgress) erneut auf, um die Fortschrittsaktualisierung erneut auszuführen.

Wenn die Animation beendet ist, ersetzen wir den Prozentfortschritt durch eine "Fertig!"-Nachricht und rufen requestAnimationFrame(updateProgress) nicht erneut auf, sodass die Fortschrittsaktualisierungen eingestellt werden.

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!";
  }
}

Ergebnis

Die Ausgabe sieht so aus. Versuchen Sie, den Button zu drücken, um die Animation und den zugehörigen Fortschrittsindikator auszuführen.

Spezifikationen

Specification
Web Animations Level 2
# dom-animation-overallprogress

Browser-Kompatibilität

Siehe auch

  • Animation für andere Methoden und Eigenschaften, die Sie zur Steuerung von Webseitenanimationen verwenden können.
  • Web Animations API