Lazy Loading: Bilder erst laden wenn nötig | Enjyn Gruppe
Hallo Welt
Hallo Welt
Original Lingva Deutsch
Übersetzung wird vorbereitet...
Dieser Vorgang kann bis zu 60 Sekunden dauern.
Diese Seite wird erstmalig übersetzt und dann für alle Besucher gespeichert.
0%
DE Zurück zu Deutsch
Übersetzung durch Lingva Translate

235 Dokumentationen verfügbar

Wissensdatenbank

Lazy Loading Bilder JavaScript

Zuletzt aktualisiert: 20.01.2026 um 10:05 Uhr

Lazy Loading: Bilder erst laden wenn nötig

Lazy Loading lädt Bilder erst, wenn sie in den Viewport scrollen. Das spart Bandbreite und beschleunigt den initialen Seitenaufbau erheblich.

Warum Lazy Loading?

  • Schnellerer Seitenaufbau: Nur sichtbare Bilder laden
  • Bandbreite sparen: Nutzer scrollt nicht immer ans Ende
  • Bessere Core Web Vitals: Schnelleres LCP
  • Weniger Serverlast: Weniger gleichzeitige Requests

Native Browser-Lösung

Moderner und empfohlener Ansatz – ohne JavaScript:

<!-- Einfach loading="lazy" hinzufügen -->
<img
  src="bild.jpg"
  alt="Beschreibung"
  loading="lazy"
  width="800"
  height="600"
>

<!-- Für iframes funktioniert es auch -->
<iframe
  src="https://example.com"
  loading="lazy"
></iframe>

loading-Attribut Werte

Wert Verhalten
lazy Laden verzögern bis nahe am Viewport
eager Sofort laden (Standard)
⚠️ Wichtig: Bilder im sichtbaren Bereich (Above the Fold) sollten NICHT lazy geladen werden! Das verzögert das LCP.
<!-- Hero-Bild: KEIN Lazy Loading -->
<img src="hero.jpg" alt="Hero" loading="eager" fetchpriority="high">

<!-- Bilder weiter unten: Lazy Loading -->
<img src="content-1.jpg" alt="Content" loading="lazy">
<img src="content-2.jpg" alt="Content" loading="lazy">

Width und Height angeben

Vermeidet Layout Shifts (CLS):

<!-- RICHTIG: Dimensionen angeben -->
<img
  src="bild.jpg"
  alt="Beschreibung"
  loading="lazy"
  width="800"
  height="600"
>

<!-- Oder mit CSS aspect-ratio -->
<style>
  .lazy-img {
    aspect-ratio: 16 / 9;
    width: 100%;
    height: auto;
  }
</style>

<img src="bild.jpg" class="lazy-img" loading="lazy" alt="Bild">

JavaScript: Intersection Observer

Für mehr Kontrolle oder als Fallback:

<!-- HTML: data-src statt src -->
<img
  data-src="bild.jpg"
  alt="Beschreibung"
  class="lazy"
  width="800"
  height="600"
>
// JavaScript
const lazyImages = document.querySelectorAll('img.lazy');

const imageObserver = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      img.classList.remove('lazy');
      img.classList.add('loaded');
      observer.unobserve(img);
    }
  });
}, {
  rootMargin: '50px 0px',  // 50px vor dem Viewport laden
  threshold: 0.01
});

lazyImages.forEach(img => imageObserver.observe(img));

Mit Fade-In Animation

/* CSS */
.lazy {
  opacity: 0;
  transition: opacity 0.3s ease;
}

.lazy.loaded {
  opacity: 1;
}

Lazy Loading mit Placeholder

Blur-Up Technik

<div class="image-wrapper">
  <img
    src="bild-tiny.jpg"        <!-- Kleines Blur-Bild -->
    data-src="bild-full.jpg"   <!-- Volles Bild -->
    class="lazy blur"
    alt="Beschreibung"
  >
</div>
/* CSS */
.image-wrapper {
  position: relative;
  overflow: hidden;
}

.blur {
  filter: blur(20px);
  transition: filter 0.5s ease;
}

.blur.loaded {
  filter: blur(0);
}

LQIP (Low Quality Image Placeholder)

<img
  src="data:image/jpeg;base64,/9j/4AAQ..."  <!-- Base64 Thumbnail -->
  data-src="bild-full.jpg"
  class="lazy"
  alt="Beschreibung"
>

Responsive Lazy Loading

<picture>
  <source
    media="(min-width: 800px)"
    data-srcset="bild-large.webp"
    type="image/webp"
  >
  <source
    media="(min-width: 800px)"
    data-srcset="bild-large.jpg"
  >
  <img
    data-src="bild-small.jpg"
    src="placeholder.jpg"
    loading="lazy"
    alt="Beschreibung"
    class="lazy"
  >
</picture>

Background Images

Für CSS-Hintergrundbilder:

<div class="lazy-bg" data-bg="url(hintergrund.jpg)">
  Content
</div>
// JavaScript
const lazyBackgrounds = document.querySelectorAll('.lazy-bg');

const bgObserver = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const el = entry.target;
      el.style.backgroundImage = el.dataset.bg;
      el.classList.add('loaded');
      bgObserver.unobserve(el);
    }
  });
});

lazyBackgrounds.forEach(el => bgObserver.observe(el));

Libraries

Library Größe Features
vanilla-lazyload ~3 KB SEO-freundlich, responsive
lazysizes ~7 KB Automatisch, viele Plugins
lozad.js ~1 KB Minimal, performant

lazysizes Beispiel

<script src="lazysizes.min.js" async></script>

<img
  data-src="bild.jpg"
  class="lazyload"
  alt="Beschreibung"
>

Best Practices

💡 Empfehlungen:
  • Native loading="lazy" bevorzugen
  • Above-the-Fold Bilder nicht lazy laden
  • Immer width/height oder aspect-ratio angeben
  • fetchpriority="high" für wichtige Bilder
  • Placeholder für bessere UX

Weitere Informationen

Enjix Beta

Enjyn AI Agent

Hallo 👋 Ich bin Enjix — wie kann ich dir helfen?
120