Signatur
Beschreibung
HTMLProgressElement ist die DOM-Schnittstelle für das HTML-Element <progress>. Sie erbt alle Eigenschaften und Methoden von HTMLElement und ergänzt sie um Eigenschaften, mit denen sich der Fortschritt einer Aufgabe wie eines Datei-Uploads, eines Downloads oder eines mehrstufigen Formulars anzeigen und per Skript ändern lässt.
Die wichtigsten Eigenschaften sind:
value(number): der aktuelle Fortschritt, zwischen0undmax. Entspricht dem Attributvalue.max(number): der Maximalwert, Standard ist1. Muss größer als0sein.position(number, nur lesbar):value / maxals Bruch zwischen0und1, bzw.-1, wenn die Anzeige unbestimmt ist.labels(NodeList, nur lesbar): die dem Element zugeordneten<label>-Elemente.
Eine Fortschrittsanzeige ist unbestimmt (indeterminate), solange kein value-Attribut gesetzt ist. Browser zeigen dann meist eine Lade-Animation. Das ist nützlich, wenn die Gesamtdauer noch unbekannt ist. Mit removeAttribute('value') kommt man in diesen Zustand zurück. Das CSS-Pseudoklassen-Selektor :indeterminate passt genau auf diesen Zustand.
Für Messwerte innerhalb eines bekannten Bereichs, etwa Speicherbelegung oder Akkustand, ist <meter> bzw. HTMLMeterElement semantisch die richtige Wahl. <progress> ist ausschließlich für den Fortschritt einer Aufgabe gedacht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value | number | 0 (Attribut fehlt = unbestimmt) | Eigenschaft: aktueller Fortschritt. Werte unter 0 werden als 0 behandelt, Werte über max werden auf max begrenzt. |
| $max | number | 1 | Eigenschaft: Obergrenze des Fortschritts. Werte ≤ 0 werden ignoriert, dann gilt wieder 1. |
| $position | number | -1 bei unbestimmtem Zustand | Nur lesbare Eigenschaft: value / max (zwischen 0 und 1) oder -1, wenn kein value gesetzt ist. |
| $labels | NodeList | Nur lesbare Eigenschaft: alle <label>-Elemente, die mit dem Element verknüpft sind. |
Rückgabewert
document.createElement('progress') oder document.querySelector('progress') zurückgibt.Beispiele
Fortschrittsbalken erzeugen und Eigenschaften lesen
const bar = document.createElement('progress');
bar.max = 200;
bar.value = 50;
document.body.append(bar);
console.log(bar instanceof HTMLProgressElement);
console.log(bar.position);
// Unbestimmter Zustand
bar.removeAttribute('value');
console.log(bar.position);
Download-Fortschritt mit fetch und ReadableStream
// HTML: <label for="dl">Download:</label> <progress id="dl"></progress>
const bar = document.querySelector('#dl');
const download = async (url) => {
const response = await fetch(url);
const total = Number(response.headers.get('Content-Length'));
const reader = response.body.getReader();
const chunks = [];
let received = 0;
if (total > 0) bar.max = total; // sonst bleibt der Balken unbestimmt
while (true) {
const { done, value } = await reader.read();
if (done) break;
chunks.push(value);
received += value.length;
if (total > 0) bar.value = received;
}
bar.value = bar.max;
return new Blob(chunks);
};
download('/dateien/bericht.pdf')
.then((blob) => console.log(`Fertig: ${blob.size} Bytes`));
Mehrstufiges Formular mit Beschriftung
// HTML: <label for="schritte">Schritt</label> <progress id="schritte" max="4" value="1"></progress>
const progress = document.getElementById('schritte');
const naechsterSchritt = () => {
progress.value = Math.min(progress.value + 1, progress.max);
progress.textContent = `${progress.value} von ${progress.max}`; // Fallback-Text
progress.setAttribute('aria-valuetext', `Schritt ${progress.value} von ${progress.max}`);
};
naechsterSchritt();
console.log(progress.value, progress.labels[0].textContent);
// Wichtig · Fallstricke
- Unbestimmter Zustand:
bar.value = 0macht die Anzeige nicht unbestimmt, denn damit wird das Attribut gesetzt. Nutze stattdessenremoveAttribute('value'). - Kein
min: Anders als<meter>beginnt<progress>immer bei0. - Ungültige Werte: Wird
maxauf0oder einen negativen Wert gesetzt, ignoriert der Browser das und verwendet1. Nicht-numerische Werte lösen beim Setzen einenTypeErroraus,NaNundInfinityebenso. - Performance: Bei sehr häufigen Aktualisierungen, z. B. pro Stream-Chunk, sollte das Setzen von
valuemöglichst mitrequestAnimationFramegedrosselt werden. - Styling: Das Aussehen hängt stark vom Browser ab. Zum Anpassen braucht man herstellerspezifische Pseudoelemente wie
::-webkit-progress-valueund::-moz-progress-bar. Moderne Browser unterstützenaccent-color. - Barrierefreiheit: Das Element hat automatisch die Rolle
progressbar. Verknüpfe es trotzdem mit einem<label>oderaria-label. - Kompatibilität: Wird von allen aktuellen Browsern unterstützt. Der Internet Explorer kennt das Element erst ab Version 10,
labelsdort gar nicht.