Signatur
Beschreibung
Das Interface HTMLImageElement steht für jedes <img>-Element im Dokument. Es erbt von HTMLElement und ergänzt bildspezifische Eigenschaften wie src, srcset, sizes, alt, width/height, naturalWidth/naturalHeight, complete, currentSrc, loading, decoding, crossOrigin, referrerPolicy und fetchPriority.
Instanzen entstehen entweder durch das Parsen von HTML, über document.createElement("img") oder über den Konstruktor new Image(width, height). Ein Bild wird bereits geladen, sobald src gesetzt ist – auch wenn das Element noch nicht im DOM hängt. Das macht es zum klassischen Werkzeug zum Vorladen (Preloading) von Bildern.
Wichtige Einsatzfälle sind: Bilder dynamisch nachladen, auf das Ende des Ladevorgangs warten (Ereignisse load und error oder die Promise-basierte Methode decode()), die tatsächlichen Pixelmaße auslesen (naturalWidth) sowie Bilder als Quelle für <canvas> oder createImageBitmap() verwenden.
Beachte: width und height geben die dargestellte (bzw. per Attribut gesetzte) Größe zurück, naturalWidth/naturalHeight dagegen die intrinsische Größe der Bilddatei. Beide sind erst nach dem Laden verlässlich.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $width | number | Nur für den Konstruktor new Image(width, height): setzt das Attribut width in CSS-Pixeln. |
|
| $height | number | Nur für den Konstruktor new Image(width, height): setzt das Attribut height in CSS-Pixeln. |
Rückgabewert
new Image() bzw. document.createElement("img") liefern ein neues, noch nicht eingehängtes HTMLImageElement.Beispiele
Bild erzeugen und einfügen
const img = new Image(320, 200);
img.src = "/bilder/logo.png";
img.alt = "Firmenlogo";
img.loading = "lazy";
img.decoding = "async";
document.querySelector("#header").append(img);
console.log(img instanceof HTMLImageElement, img.width);
Bild vorladen und auf decode() warten
const ladeBild = async (url) => {
const img = new Image();
img.src = url;
await img.decode(); // wirft bei Ladefehler
return img;
};
try {
const img = await ladeBild("/bilder/foto.jpg");
console.log(`Intrinsische Größe: ${img.naturalWidth}×${img.naturalHeight}`);
document.body.append(img);
} catch (err) {
console.error("Bild konnte nicht geladen werden:", err.message);
}
load/error-Ereignisse und bereits gecachte Bilder
const img = document.querySelector("img.avatar");
const fertig = () => console.log("Geladen:", img.currentSrc);
const fehler = () => { img.src = "/bilder/platzhalter.png"; };
if (img.complete && img.naturalWidth > 0) {
fertig(); // bereits aus dem Cache geladen
} else {
img.addEventListener("load", fertig, { once: true });
img.addEventListener("error", fehler, { once: true });
}
Responsives Bild mit srcset und Canvas-Verwendung
const img = new Image();
img.crossOrigin = "anonymous"; // nötig, um das Canvas nicht zu "verschmutzen"
img.srcset = "/bilder/klein.jpg 480w, /bilder/gross.jpg 1200w";
img.sizes = "(max-width: 600px) 480px, 1200px";
img.src = "/bilder/gross.jpg"; // Fallback
await img.decode();
const canvas = document.createElement("canvas");
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
canvas.getContext("2d").drawImage(img, 0, 0);
console.log(canvas.toDataURL("image/webp").slice(0, 22));
// Wichtig · Fallstricke
- Reihenfolge: Event-Listener für
load/errorvor dem Setzen vonsrcregistrieren – sonst kann das Ereignis bei gecachten Bildern verpasst werden. Alternativcompleteprüfen oderdecode()nutzen. completeist auch bei fehlgeschlagenem Ladentrue; zusätzlichnaturalWidth > 0prüfen.- CORS: Cross-Origin-Bilder ohne
crossOriginund passendeAccess-Control-Allow-Origin-Header machen ein Canvas „tainted“ –toDataURL()undgetImageData()werfen dann einenSecurityError. - Sicherheit: URLs aus Nutzereingaben nicht ungeprüft in
srcsetzen (Tracking-Pixel, Datenabfluss); CSP-Direktiveimg-srcbeachten. Werte nie perinnerHTMLzusammenbauen (XSS überonerror-Attribute). altimmer setzen (Barrierefreiheit); für rein dekorative Bilderalt = \"\".- Kompatibilität: Grundfunktionen in allen Browsern;
decode(),loading=\"lazy\"undfetchPrioritysind neuer – in sehr alten Browsern fehlen sie (Safari unterstütztloading=\"lazy\"erst ab 15.4). - Für
<picture>-Konstrukte liefertcurrentSrcdie tatsächlich gewählte Quelle, nichtsrc.