setInterval() – Timer, Countdown, Slideshows

setInterval( function(){} , d ) wiederholt Anweisungen in einem Interval von d Millisekunden. Typische Anwendungen für setInterval() sind z.B. Countdown-Timer, Speichern im Hintergrund, aber auch einfache Animationen wie ein Karussell oder eine Slideshow.

Javascript setInterval – Animation

setInterval vs setTimeout

Während setTimeout (action,timeout) Anweisungen nach einer Verzögerung von timeout Millisekunden einmal ausführt, wiederholt Javascript Anweisungen mit setInterval ( action, i) in einem Intervall von i Millisekunden.

Für eine fließende Animation wie der Farbroller muss setTimeout rekursiv ausgeführt werden, aber dann gibt es immer noch einen kleinen Unterschied:

  • setInterval führt die Anweisungen sofort und dann alle 1000 / 2000 … Millisekunden durch
  • setTimeout wartet 1000 / 2000 … Millisekunden, führt die Funktion aus (und braucht dafür ein paar Millisekunden) und wartet dann auf den nächsten Timeout. Die Zeitspanne zwischen zwei Frames ist also einen Tick größer als 1000 / 2000 … Millisekunden.
     +-- Referenz für den Aufruf von cancelInterval
     |
     |             Verzögerung / Delay --+
     |                                   |
var ref = window.setInterval( animate, 1000);
                                  |
                                  +-- callback
function animate() {
  // Anweisungen der Animation
}

clearInterval

clearInterval(action,interval) regelt oder cancelt eine Funktion, die wiederholt mit einer Verzögerung aufgeweckt wird.

setInterval mit closures

Alternativ kann setInterval( action , delay) mit einer anonymen Funktion aufgerufen werden. Das hält den Scriptcode besser zusammen als var interval = window.setInterval (code, delay) und ersetzt auch eine externe Funktion.

6
const timerId = setInterval ( function tick() {
   let counter = parseInt(document.getElementById("counter").textContent);
   if (counter < 1) {
      clearInterval(timerId)
   } else 
      document.getElementById("counter").textContent = counter - 1;
}, 1000);

Beispiel: Slideshow mit setInterval() und Keyframes-Animation

Die einfache Slideshow braucht nur einen Container für die einzelnen Slides oder Bilder. Die erste Slide / das erste Bild bekommt die CSS-Klasse active.

<div class="slideshow">
	<div class="slide active"><img src="…"></div>
	<div class="slide"><img src="…"></div>
	…
</div>

Der div-Block slideshow ist relativ positioniert, die Slides darunter sind absolut positioniert. display:flex bringt alle Slides nebeneinander auf eine Linie, so dass sie in jedem Interval nach links aus dem sichtbaren Ausschnitt geschoben werden können.

.slideshow {
  position: relative;
  width: 100%;
  overflow: hidden;
}

.slide {
  position: absolute;
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  opacity: 0;
  pointer-events: none;
}

.slide img {
   width: 100%;
   object-fit: contain;
}

.slide.active {
  opacity: 1;
  pointer-events: auto;
}

Das Javascript Web Animation API animiert die einzelnen Slides ganz ohne externe Library. Am Ende wechselt setInterval() alle drei Sekunden das aktive Bild gegen das nächste Bild aus.

const slides = document.querySelectorAll(".slide");
let current = 0;

function showSlide(nextIndex) {
  const currentSlide = slides[current];
  const nextSlide = slides[nextIndex];

  // Aktuelles Bild nach links rausschieben
  currentSlide.animate([
    { transform: "translateX(0%)", opacity: 1 },
    { transform: "translateX(-100%)", opacity: 0 }
  ], {
    duration: 600,
    easing: "ease"
  });

  // Nächstes Bild animieren
  nextSlide.animate([
    { transform: "translateX(100%)", opacity: 0 },
    { transform: "translateX(0%)", opacity: 1 }
  ], {
    duration: 600,
    easing: "ease"
  });

  // CSS-Klassen auf Stand bringen
  currentSlide.classList.remove("active");
  nextSlide.classList.add("active");
  current = nextIndex;
}

function nextSlide() {
  const next = (current + 1) % slides.length;
  showSlide(next);
}

setInterval(nextSlide, 3000);

setInterval() – Beispiele und Anwendungen

Anwendung Beschreibung
Slideshows / Karussells Automatischer Bildwechsel (siehe Beispiel oben).
Live-Daten abfragen In bestimmten Intervallen den Status eines Servers oder eines Sensors abfragen.
Countdown-Timer Jede Sekunde den Timer aktualisieren.
Polling oder automatische Updates Regelmäßig prüfen, ob eine Bedingung erfüllt ist oder ein Element ins Document Object Model geladen wurde. Allerdings sollte beim asynchronen Laden sichergestellt werden, dass sich Intervalle nicht überlappen. Dann sind Promises oder async/await in Kombination mit setTimeout() oft robuster.
Hintergrundaktionen Autosave alle paar Minuten auslösen.

Suchen auf mediaevent.de