pagespeed-test.de

Ratgeber · Web-Performance 2026

Lazy-Loading: erst laden wenn nötig

Native browser-lazy-loading ist seit Chrome 76 stabil. IntersectionObserver für komplexe Fälle. Anti-Patterns vermeiden.

Foto von Jan-Tristan Rudat

Von Jan-Tristan Rudat

Redakteur pagespeed-test.de

Was Lazy-Loading bringt

Lazy-Loading bedeutet: Inhalte erst dann laden, wenn sie gebraucht werden. Klassischer Fall: Bilder unterhalb des Viewports laden nicht beim Initial-Page-Load, sondern erst wenn der User dahin scrollt. Spart Bandbreite und beschleunigt LCP.

Native loading="lazy"

Seit Chrome 76, Firefox 75, Safari 15.4 nativ unterstützt:

<img src="/foto.jpg" loading="lazy" alt="..." width="800" height="600">
<iframe src="/embed" loading="lazy"></iframe>

Browser entscheidet selbst, wann (~viewport + 3000 px) das Bild geladen wird. Keine JavaScript-Library nötig.

Anti-Pattern: Hero-Bild lazy-loaden

Das LCP-Bild darf NIE lazy-geladen werden - damit drückt man LCP künstlich nach oben. Stattdessen explizit:

<!-- Hero / LCP-Bild -->
<img src="/hero.avif" fetchpriority="high" alt="..." width="1200" height="600">

<!-- Alle anderen -->
<img src="/foto-2.avif" loading="lazy" alt="..." width="800" height="600">
<img src="/foto-3.avif" loading="lazy" alt="..." width="800" height="600">

IntersectionObserver für komplexe Fälle

Für nicht-img Elemente (heavy Components, Charts, Maps) den IntersectionObserver nutzen:

const observer = new IntersectionObserver((entries) => {
  entries.forEach((entry) => {
    if (entry.isIntersecting) {
      // Lade die Komponente
      import('./Chart').then(({ default: Chart }) => mount(Chart));
      observer.disconnect();
    }
  });
}, { rootMargin: '200px' });

observer.observe(document.querySelector('#chart-placeholder'));

rootMargin: '200px' triggert das Loading 200 px bevor das Element sichtbar wird - meist genug Zeit damit es bei Sichtbarkeit fertig ist.

Lazy-Loading von Komponenten in React

const HeavyChart = React.lazy(() => import('./HeavyChart'));

function Page() {
  return (
    <Suspense fallback={<div>Lädt...</div>}>
      <HeavyChart />
    </Suspense>
  );
}

Astro hat das Konzept im Framework eingebaut über client:visible - Komponente lädt erst bei Sichtbarkeit.

Was nicht lazy-loaden sollte

  • Hero-Bild / LCP-Element (siehe oben)
  • CSS für sichtbaren Bereich (Critical CSS inline statt lazy)
  • Kritische Navigation (Header-Logo, Hauptmenü)
  • Webfonts für Above-the-Fold-Text (preload statt lazy)

Mehr zum Thema