Start · Sprachen · JavaScript · Referenz · AnimationEffect.updateTiming()

AnimationEffect.updateTiming()

Methode

Aktualisiert einzelne Zeiteigenschaften wie <code>duration</code>, <code>delay</code> oder <code>iterations</code> eines laufenden oder pausierten Animationseffekts.

seit JavaScript Baseline: alle modernen Browser (seit 2020) Kategorie: webapi

Signatur

AnimationEffect.prototype.updateTiming(timing)

Beschreibung

Mit updateTiming() lassen sich die Zeiteigenschaften eines AnimationEffect (meist ein KeyframeEffect) nachträglich ändern, ohne die Animation neu zu erzeugen. Übergeben wird ein Objekt, das nur die Eigenschaften enthält, die sich ändern sollen. Alle anderen Werte bleiben wie sie sind.

Das ist praktisch, wenn Nutzer die Geschwindigkeit, die Anzahl der Wiederholungen oder die Richtung einer Animation zur Laufzeit anpassen sollen, zum Beispiel über Schieberegler in einem Animations-Editor oder wenn prefers-reduced-motion sich ändert. Die Änderung wirkt sofort. Die aktuelle Position der Animation (currentTime) bleibt dabei erhalten, deshalb kann ein Effekt nach einer Änderung von duration sichtbar „springen“.

Welche Werte gerade gelten, liest du mit getTiming() aus. Berechnete Werte wie Fortschritt oder aktuelle Iteration liefert getComputedTiming().

Parameter

Name Typ Default Beschreibung
$timing OptionalEffectTiming {} Objekt mit den Zeiteigenschaften, die geändert werden sollen. Erlaubt sind: delay (ms), endDelay (ms), fill ("none", "forwards", "backwards", "both", "auto"), iterationStart, iterations (Zahl oder Infinity), duration (ms oder "auto"), direction ("normal", "reverse", "alternate", "alternate-reverse") und easing (CSS-Easing-String).

Beispiele

Dauer einer laufenden Animation ändern

const box = document.querySelector('.box');
const animation = box.animate(
  [{ transform: 'rotate(0deg)' }, { transform: 'rotate(360deg)' }],
  { duration: 2000, iterations: Infinity }
);

// Nach 3 Sekunden doppelt so schnell drehen
setTimeout(() => {
  animation.effect.updateTiming({ duration: 1000 });
  console.log(animation.effect.getTiming().duration);
}, 3000);
1000

Geschwindigkeit über einen Schieberegler steuern

const slider = document.querySelector('#speed'); // <input type="range" min="200" max="3000">
const ball = document.querySelector('.ball');

const bounce = ball.animate(
  [{ transform: 'translateY(0)' }, { transform: 'translateY(-150px)' }],
  { duration: Number(slider.value), direction: 'alternate', iterations: Infinity, easing: 'ease-in-out' }
);

slider.addEventListener('input', () => {
  bounce.effect.updateTiming({ duration: Number(slider.value) });
});

Bewegung bei reduzierter Bewegungspräferenz abschwächen

const media = window.matchMedia('(prefers-reduced-motion: reduce)');
const banner = document.querySelector('.banner');

const pulse = banner.animate(
  [{ opacity: 1 }, { opacity: 0.4 }],
  { duration: 800, direction: 'alternate', iterations: Infinity }
);

const applyPreference = () => {
  pulse.effect.updateTiming(
    media.matches
      ? { iterations: 1, fill: 'forwards' }
      : { iterations: Infinity, fill: 'none' }
  );
  console.log(pulse.effect.getTiming().iterations);
};

applyPreference();
media.addEventListener('change', applyPreference);
Infinity (oder 1 bei reduzierter Bewegung)

// Wichtig · Fallstricke

  • Ungültige Werte: Negative duration, negative oder NaN-Werte bei iterations oder ein ungültiger easing-String lösen einen TypeError aus. In diesem Fall wird keine der übergebenen Eigenschaften übernommen.
  • Sprünge: currentTime bleibt gleich, auch wenn sich duration oder delay ändern. Deshalb kann der sichtbare Fortschritt springen. Wenn der relative Fortschritt erhalten bleiben soll, ist animation.updatePlaybackRate() oft die bessere Wahl.
  • CSS-Animationen und CSS-Transitions: Bei CSSAnimation überschreibt updateTiming() die Werte aus dem Stylesheet. Spätere Änderungen an den zugehörigen CSS-Eigenschaften (z. B. animation-duration) werden für diese Eigenschaften dann nicht mehr übernommen.
  • Browser-Kompatibilität: Wird von Chrome/Edge 75+, Firefox 63+ und Safari 13.1+ unterstützt. Ältere Implementierungen boten stattdessen ein veränderbares effect.timing-Objekt an. Dieses ist veraltet und sollte nicht mehr verwendet werden.