Blog Performance

Lazy Loading für Bilder und iframes: Best Practices 2026

loading="lazy" ist eine Zeile Code mit großem Effekt — aber nur wenn du weißt, welche Bilder du damit NICHT lazy laden solltest. Hier sind die vollständigen Best Practices für 2026.

17. Mai 2026 · 10 min Lesezeit · Laurenz Thümmler, Shift07
Lazy Loading für Bilder und iframes: Best Practices 2026 für SEO und Performance

Lazy Loading ist eine der effektivsten Maßnahmen zur Verbesserung von Ladezeit und Core Web Vitals — wenn man sie richtig einsetzt. Das Browser-native loading="lazy"-Attribut hat Lazy Loading demokratisiert: Eine Zeile Code, keine JavaScript-Abhängigkeit, kein Intersection Observer mehr nötig.

Aber genau diese Einfachheit führt zu einem der häufigsten SEO-Fehler: Entwickler lazy-laden das Hero-Bild — und zerstören damit ihren LCP-Wert. Dieser Artikel zeigt, welche Bilder lazy geladen werden sollten, welche nicht, und wie du iframes korrekt handhabst.

Das Browser-native loading="lazy" Attribut

Seit Chrome 76 (2019) und mittlerweile in allen modernen Browsern unterstützt, ermöglicht loading="lazy" nativ im Browser implementiertes Lazy Loading — ohne JavaScript, ohne Polyfills, ohne Bibliotheken.

<!-- Lazy Loading aktivieren —  </p>so einfach ist es -->
<img src="bild.jpg" alt="Beschreibung" loading="lazy" width="800" height="600">

<!-- Auch für iframes -->
<iframe src="https://www.youtube.com/embed/VIDEO_ID" loading="lazy"></iframe>

Der Browser entscheidet selbst, wann er das Bild lädt — basierend auf dem Abstand des Elements zum aktuellen Viewport. Chrome beginnt typischerweise mit dem Laden, wenn das Element 1250 px vom Viewport entfernt ist (bei langsamen Verbindungen mehr, bei schnellen weniger).

Browser-Support

Alle modernen Browser unterstützen loading="lazy": Chrome 77+, Firefox 75+, Safari 15.4+, Edge 79+. Ältere Browser ignorieren das Attribut einfach — das Bild wird dann sofort geladen. Kein Polyfill nötig.

Der kritische LCP-Fallstrick: Das Hero-Bild NIEMALS lazy laden

Häufigster Fehler: LCP-Kandidat wird lazy geladen

Das Hero-Bild oder das erste große Bild above the fold ist in den meisten Fällen der LCP-Kandidat. Lazy Loading auf diesem Bild verschlechtert den LCP-Wert direkt — manchmal um 1–3 Sekunden. Das ist einer der häufigsten Gründe für schlechte Core Web Vitals.

Der LCP (Largest Contentful Paint) misst, wann das größte sichtbare Element gerendert wird. Wenn dieses Element ein Bild ist, das lazy geladen wird, verzögert sich der LCP um die gesamte Lazy-Loading-Verzögerung. Google bewertet LCP direkt als Ranking-Faktor.

<!-- ❌ FALSCH: Hero-Bild lazy laden -->
<img src="hero.jpg" alt="Hero" loading="lazy">

<!-- ✅ RICHTIG: Hero-Bild eager laden + preload -->
<!-- Im <head>: -->
<link rel="preload" as="image" href="hero.jpg" fetchpriority="high">

<!-- Im Body: -->
<img src="hero.jpg" alt="Hero" loading="eager" fetchpriority="high">

Das fetchpriority="high"-Attribut (verfügbar seit Chrome 101) gibt dem Browser den expliziten Hinweis, dieses Bild mit höchster Priorität zu laden. Kombiniert mit dem preload-Link im <head> startet der Browser den Download so früh wie möglich.

Welche Bilder solltest du lazy laden?

Die Regel ist einfach: Alles, was nicht beim ersten Aufruf sichtbar ist ("below the fold"), kann lazy geladen werden. Das trifft auf die meisten Bilder einer Website zu.

Bildtyp Lazy Loading? Begründung
Hero-Bild (above the fold)❌ NeinLCP-Kandidat, muss sofort sichtbar sein
Logo in der Navigation❌ NeinImmer sichtbar, keine Performance-Last
Erste Textabsatz-Illustration⚠️ PrüfenAbhängig von Seitenstruktur
Blog-Post-Bilder (nach erstem Absatz)✅ JaUnterhalb der Falzkante auf Desktop
Galerie-Bilder✅ JaMeist weit below the fold
Team-Fotos / About-Sektion✅ JaFast immer below the fold
Footer-Logos / Partner-Logos✅ JaGanz unten auf der Seite
Produktbilder (unterhalb der ersten 3)✅ JaScrollen erforderlich

width und height: Pflicht beim Lazy Loading

Lazy-geladene Bilder ohne explizite Dimensionen verursachen Layout Shifts (CLS). Der Browser reserviert keinen Platz für das Bild, solange es nicht geladen ist — wenn es dann erscheint, verschiebt sich der gesamte Seiteninhalt.

<!-- ❌ FALSCH: Keine Dimensionen → CLS-Risiko -->
<img src="bild.jpg" alt="Produkt" loading="lazy">

<!-- ✅ RICHTIG: Explizite Dimensionen → kein Layout Shift -->
<img
  src="bild.jpg"
  alt="Produkt"
  loading="lazy"
  width="800"
  height="600"
>

Mit CSS aspect-ratio kannst du das Seitenverhältnis aus den HTML-Attributen berechnen lassen, auch wenn das Bild responsiv skaliert:

/* CSS: Aspect ratio aus HTML-Attributen beibehalten */
img {
  width: 100%;
  height: auto;
  /* Browser berechnet Höhe basierend auf width/height-Attributen */
}

Intersection Observer: Wann ist manuelles Lazy Loading noch sinnvoll?

Browser-natives Lazy Loading (loading="lazy") reicht für die meisten Fälle aus. Es gibt jedoch Szenarien, in denen der Intersection Observer mehr Kontrolle bietet:

// Intersection Observer: Bilder laden wenn 200px vom Viewport entfernt
const imageObserver = new IntersectionObserver(
  (entries, observer) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const img = entry.target;
        // Wechsle data-src → src (Bild beginnt zu laden)
        img.src = img.dataset.src;
        if (img.dataset.srcset) img.srcset = img.dataset.srcset;
        img.classList.remove('lazy');
        observer.unobserve(img);
      }
    });
  },
  { rootMargin: '200px' } // 200px vor Sichtbarkeit laden
);

document.querySelectorAll('img.lazy').forEach(img => imageObserver.observe(img));
<!-- HTML für Intersection Observer Lazy Loading -->
<img
  class="lazy"
  data-src="bild.jpg"
  data-srcset="bild-400.jpg 400w, bild-800.jpg 800w"
  src="placeholder.jpg"
  alt="Produkt"
  width="800"
  height="600"
>

LQIP: Low Quality Image Placeholder

LQIP ist eine Technik, bei der zuerst eine sehr kleine, stark komprimierte Version des Bildes geladen wird (oft Base64-kodiert und direkt im HTML eingebettet), während das vollauflösende Bild lazy geladen wird. Das gibt Nutzern sofort visuellen Kontext.

<!-- LQIP: Blur-Effekt bis das richtige Bild geladen ist -->
<img
  class="lazy blur-sm"
  data-src="hochaufloesend.jpg"
  src="data:image/jpeg;base64,/9j/4AAQ..." <!-- Winziges Platzhalterbild (Base64) -->
  alt="Beschreibung"
  width="800"
  height="600"
  style="filter: blur(8px); transition: filter 0.3s"
  onload="this.style.filter='none';this.classList.remove('blur-sm')"
>

iframes lazy laden: YouTube, Maps, Tweets

iframes sind oft die größten Performance-Killer auf einer Website. Ein eingebettetes YouTube-Video lädt dutzende Ressourcen und kostet 500–1500 ms — auch wenn der Nutzer nie bis zum Video scrollt.

<!-- ✅ Native iframe Lazy Loading -->
<iframe
  src="https://www.youtube.com/embed/VIDEO_ID"
  loading="lazy"
  width="560"
  height="315"
  title="Video-Titel"
  allow="accelerometer; autoplay; clipboard-write; encrypted-media"
  allowfullscreen
></iframe>

Noch effektiver ist das YouTube Facade-Muster: Statt des echten iframes wird zunächst nur das Vorschaubild angezeigt. Der echte iframe wird erst beim Klick des Nutzers geladen:

<!-- YouTube Lite Embed: Nur Thumbnail laden, iframe erst bei Klick -->
<div
  class="youtube-facade"
  data-video-id="VIDEO_ID"
  style="position:relative;padding-bottom:56.25%;background:#000;cursor:pointer"
>
  <img
    src="https://i.ytimg.com/vi/VIDEO_ID/hqdefault.jpg"
    alt="Video: Titel"
    loading="lazy"
    style="width:100%;height:100%;object-fit:cover;position:absolute"
  >
  <button style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
    background:red;border:none;border-radius:12px;padding:16px 24px;cursor:pointer"
    aria-label="Video abspielen">
    ▶
  </button>
</div>

<script>
document.querySelectorAll('.youtube-facade').forEach(facade => {
  facade.addEventListener('click', () => {
    const id = facade.dataset.videoId;
    const iframe = document.createElement('iframe');
    iframe.src = `https://www.youtube.com/embed/${id}?autoplay=1`;
    iframe.allow = 'autoplay; fullscreen';
    iframe.style.cssText = 'position:absolute;width:100%;height:100%;border:0';
    facade.innerHTML = '';
    facade.appendChild(iframe);
  });
});
</script>

Google Maps, Calendly-Embeds und ähnliche iframes profitieren ebenfalls von loading="lazy". Für Maps gibt es zusätzlich die Möglichkeit, einen statischen Screenshot als Vorschau zu zeigen und die interaktive Karte erst bei Bedarf zu laden.

Responsive Bilder und Lazy Loading kombinieren

Lazy Loading und responsive Bilder mit srcset lassen sich problemlos kombinieren. Der Browser wählt das passende Bild basierend auf Viewport-Breite und Pixel-Ratio — und lädt es lazy:

<img
  src="bild-800.jpg"
  srcset="
    bild-400.jpg 400w,
    bild-800.jpg 800w,
    bild-1200.jpg 1200w,
    bild-1600.jpg 1600w
  "
  sizes="(max-width: 600px) 100vw, (max-width: 1024px) 50vw, 800px"
  alt="Beschreibung"
  loading="lazy"
  width="800"
  height="600"
>

Für das Hero-Bild (das nicht lazy geladen werden sollte) kombinierst du srcset mit preload und fetchpriority:

<!-- Im head: Hero-Bild mit imagesrcset vorladen -->
<link
  rel="preload"
  as="image"
  href="hero-800.jpg"
  imagesrcset="hero-400.jpg 400w, hero-800.jpg 800w, hero-1200.jpg 1200w"
  imagesizes="100vw"
  fetchpriority="high"
>

Lazy Loading und SEO: Was Googlebot sieht

Googlebot crawlt JavaScript-gerendertes Content und unterstützt browser-natives Lazy Loading. Da Googlebot jedoch keinen visuellen Viewport hat und Bilder nicht "sieht", behandelt er loading="lazy" unterschiedlich von echten Nutzern.

Für Bild-SEO und Google Image Search gilt: Lazy-geladene Bilder werden von Googlebot gecrawlt, aber möglicherweise mit niedrigerer Priorität als Bilder, die ohne lazy-Attribut erreichbar sind. Das bedeutet:

Lazy Loading mit modernen Bildformaten

Die Kombination von Lazy Loading mit <picture> und modernen Formaten (WebP, AVIF) maximiert die Performance-Gewinne:

<picture>
  <source
    type="image/avif"
    srcset="bild-400.avif 400w, bild-800.avif 800w"
    sizes="(max-width: 600px) 100vw, 800px"
  >
  <source
    type="image/webp"
    srcset="bild-400.webp 400w, bild-800.webp 800w"
    sizes="(max-width: 600px) 100vw, 800px"
  >
  <img
    src="bild-800.jpg"
    alt="Beschreibung"
    loading="lazy"
    width="800"
    height="600"
  >
</picture>

Browser, die AVIF unterstützen (Chrome, Firefox, Safari 16+) laden das kleinste Format. Ältere Browser fallen auf WebP oder JPEG zurück. Das Lazy Loading gilt für alle <source>-Elemente.

CSS-Hintergrundbilder lazy laden

Das loading="lazy"-Attribut funktioniert nur für <img>- und <iframe>-Elemente. CSS-Hintergrundbilder (background-image) werden nicht erfasst. Dafür benötigst du entweder den Intersection Observer oder eine CSS-Klassen-Technik:

/* CSS: Hintergrundbild standardmäßig nicht laden */
.lazy-bg {
  background-image: none;
}
.lazy-bg.loaded {
  background-image: url('hintergrund.jpg');
}
// JavaScript: CSS-Klasse bei Sichtbarkeit hinzufügen
const bgObserver = new IntersectionObserver(entries => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.classList.add('loaded');
      bgObserver.unobserve(entry.target);
    }
  });
});

document.querySelectorAll('.lazy-bg').forEach(el => bgObserver.observe(el));

Performance-Messung: Vorher vs. Nachher

Wie misst du den Effekt von Lazy Loading? Die wichtigsten Metriken:

Nutze den Core Web Vitals Checker für eine schnelle Bestandsaufnahme. Für detaillierte Analysen: Chrome DevTools → Performance → Filmstrip zeigt exakt, wann welche Bilder geladen werden.

Checkliste: Lazy Loading Best Practices 2026

  • ✅ Hero-Bild (LCP-Kandidat) NICHT lazy laden — eager + fetchpriority="high" verwenden
  • ✅ Alle Bilder below the fold mit loading="lazy" ausstatten
  • ✅ Immer width und height angeben (verhindert CLS)
  • ✅ iframes (YouTube, Maps, Calendly) mit loading="lazy" ausstatten
  • ✅ YouTube-Facade-Pattern für große Videosektionen verwenden
  • ✅ srcset und sizes mit Lazy Loading kombinieren (responsive + lazy)
  • ✅ picture-Element für AVIF/WebP-Fallback nutzen
  • ✅ CSS-Hintergrundbilder mit Intersection Observer lazy laden
  • ✅ Alt-Texte für alle Bilder (auch lazy-geladene) — für SEO und Accessibility
  • ✅ Nach Implementierung LCP mit Chrome DevTools oder PageSpeed Insights messen
  • ✅ Wichtige Bilder im ImageObject-Schema Markup erfassen

Fazit: Lazy Loading richtig — großer Effekt mit einer Zeile

Lazy Loading ist eine der wenigen Performance-Optimierungen, die wirklich jeder umsetzen kann und sollte. Browser-natives loading="lazy" ohne jede JavaScript-Abhängigkeit ist 2026 der Standard. Die einzige kritische Regel: Lazy lade nie das Hero-Bild oder irgendeinen LCP-Kandidaten.

Die Kombination aus loading="lazy" für alle Bilder below the fold, fetchpriority="high" für das Hero-Bild, expliziten Dimensionen zur CLS-Vermeidung und YouTube-Facade für Videos ergibt eine Performance-Basis, die sich direkt in besseren Core Web Vitals — und damit in besseren Google-Rankings — niederschlägt.

Ergänze Lazy Loading mit optimierten Bildformaten (WebP, AVIF) und — für maximalen Effekt — mit Service Workern für Offline-Caching. Dann sind Bilder nicht nur beim ersten Besuch schnell, sondern bei allen folgenden blitzschnell aus dem Cache.

Sind deine Core Web Vitals im grünen Bereich?

Prüfe LCP, CLS und INP deiner Website — kostenlos und ohne Anmeldung.

Core Web Vitals jetzt prüfen

Verwandte Artikel