Start · Sprachen · JavaScript · Referenz · HTMLLinkElement.imageSrcset

HTMLLinkElement.imageSrcset

Eigenschaft

Liest oder setzt das <code>imagesrcset</code>-Attribut eines <code>&lt;link&gt;</code>-Elements, also eine kommagetrennte Liste von Bildkandidaten für responsives Vorladen.

seit JavaScript Baseline 2023: Chrome 73, Edge 79, Safari 17.2, Fi Kategorie: webapi

Signatur

HTMLLinkElement.imageSrcset

Beschreibung

Die Eigenschaft imageSrcset des Interfaces HTMLLinkElement spiegelt das HTML-Attribut imagesrcset wider. Ihr Wert ist ein String mit einem oder mehreren durch Kommas getrennten Bildkandidaten. Jeder Kandidat besteht aus einer URL und optional einem Breitendeskriptor (z. B. 800w) oder einem Pixeldichte-Deskriptor (z. B. 2x) – genau wie beim srcset-Attribut von <img>.

Gebraucht wird sie fast ausschließlich zusammen mit rel="preload" und as="image". So lassen sich responsive Bilder, etwa ein großes Hero-Bild (LCP-Element), vorladen: Der Browser wählt anhand von imagesrcset und imagesizes dieselbe Bildvariante, die später das <img> mit identischem srcset/sizes anfordert. Dadurch wird nichts doppelt geladen.

Verwendet man Breitendeskriptoren (w), sollte man zusätzlich imageSizes setzen. Ohne diese Angabe nimmt der Browser 100vw an. Die Eigenschaft lässt sich lesen und schreiben; ist das Attribut nicht vorhanden, liefert sie einen leeren String.

Parameter

Name Typ Default Beschreibung
$value string "" Beim Setzen: kommagetrennte Liste von Bildkandidaten, z. B. "bild-400.jpg 400w, bild-800.jpg 800w". Wird ins Attribut imagesrcset geschrieben.

Rückgabewert

Typ
string
Beschreibung
Der aktuelle Wert des Attributs imagesrcset. Fehlt das Attribut, ist es ein leerer String.

Beispiele

Wert eines vorhandenen Preload-Links auslesen

// HTML: <link id="hero-preload" rel="preload" as="image"
//   href="hero-800.jpg"
//   imagesrcset="hero-400.jpg 400w, hero-800.jpg 800w, hero-1600.jpg 1600w"
//   imagesizes="100vw">
const link = document.getElementById('hero-preload');
console.log(link.imageSrcset);
console.log(link.imageSizes);
hero-400.jpg 400w, hero-800.jpg 800w, hero-1600.jpg 1600w 100vw

Responsives Hero-Bild dynamisch vorladen

const preloadResponsiveImage = (srcset, sizes, fallback) => {
  const link = document.createElement('link');
  link.rel = 'preload';
  link.as = 'image';
  link.href = fallback; // für Browser ohne imagesrcset-Unterstützung
  link.imageSrcset = srcset;
  link.imageSizes = sizes;
  document.head.append(link);
  return link;
};

const l = preloadResponsiveImage(
  '/img/banner-640.webp 640w, /img/banner-1280.webp 1280w',
  '(max-width: 700px) 100vw, 700px',
  '/img/banner-1280.webp'
);
console.log(l.getAttribute('imagesrcset'));
/img/banner-640.webp 640w, /img/banner-1280.webp 1280w

Pixeldichte-Deskriptoren und Feature-Erkennung

const supportsImageSrcset = 'imageSrcset' in HTMLLinkElement.prototype;

const link = document.createElement('link');
link.rel = 'preload';
link.as = 'image';
if (supportsImageSrcset) {
  link.imageSrcset = 'logo.png 1x, logo@2x.png 2x';
} else {
  link.href = 'logo@2x.png';
}
document.head.append(link);
console.log(supportsImageSrcset, link.imageSrcset);
true logo.png 1x, logo@2x.png 2x

// Wichtig · Fallstricke

  • Nur mit rel="preload" und as="image" wirksam: Bei anderen Link-Typen hat das Attribut keine Wirkung.
  • Werte müssen übereinstimmen: imageSrcset und imageSizes müssen exakt zu srcset/sizes des späteren <img> passen. Sonst wählt der Browser womöglich eine andere Variante und lädt das Bild doppelt.
  • Keine Validierung beim Setzen: Ein fehlerhafter String löst keinen Fehler aus. Ungültige Kandidaten ignoriert der Browser später einfach.
  • Kommas in URLs: Kommas innerhalb einer URL können die Auswertung stören; solche URLs sollten kodiert werden (%2C).
  • Kompatibilität: In Chromium ab Version 73 und in Firefox ab 78 verfügbar, in Safari erst ab 17.2. Ältere Browser ignorieren das Attribut. Setzt man zusätzlich href als Rückfallwert, laden solche Browser aber ein festes Bild vor. Chromium wertet href nicht aus, wenn imagesrcset vorhanden ist.
  • Soll das Vorladen noch vor dem Rendern greifen, gehört der Link möglichst früh ins statische HTML. Per JavaScript nachträglich eingefügte Preloads bringen deutlich weniger.