Die „Fassaden-Methode“ für Lazy Loading von unveränderbaren iFrames + Standard Methode

Deine Webseite lädt langsam und du hast die Übeltäter identifiziert: die eingebetteten YouTube- oder Vimeo-Videos. Die Standardlösung „Lazy Loading“ wäre perfekt, aber es gibt ein Problem – du kannst den HTML-Code, der vom CMS oder einem Plugin generiert wird, nicht anpassen. Das src-Attribut im <iframe> ist fix.

Keine Sorge, es gibt eine elegante und extrem effektive Lösung für genau dieses Problem: die Fassaden-Methode. In diesem Artikel zeige ich dir, wie du selbst unveränderbare iFrames per JavaScript in Performance-Booster verwandelst.

Das Problem: Der sofort ladende iFrame

Normalerweise sieht ein Video-Embed so aus:

<div class="video-container">
  <iframe 
    src="https://www.youtube-nocookie.com/embed/DEIN_VIDEO_ID" 
    frameborder="0" 
    allowfullscreen>
  </iframe>
</div>

Der Browser sieht das src-Attribut und beginnt sofort damit, den gesamten YouTube-Player zu laden. Das blockiert das Rendern der restlichen Seite, verbraucht unnötig Daten und verschlechtert deine PageSpeed-Werte dramatisch – selbst wenn der Nutzer das Video nie ansieht.

Die Lösung: Eine Fassade per JavaScript errichten

Wenn wir den HTML-Code nicht ändern können, um das Laden zu verhindern, dann tauschen wir den schweren <iframe> einfach blitzschnell aus, bevor er Schaden anrichten kann.

So funktioniert die Methode:

  1. Blitzschneller Austausch: Sobald das Grundgerüst der Seite steht, durchsucht unser JavaScript die Seite nach Video-Containern.
  2. Platzhalter erstellen: Für jedes gefundene Video wird der <iframe> entfernt. An seiner Stelle wird ein leichter Platzhalter eingefügt: ein Vorschaubild des Videos mit einem Play-Button darüber.
  3. Beobachten: Ein IntersectionObserver (ein moderner Web-API) beobachtet diese Platzhalter.
  4. Laden bei Bedarf: Erst wenn ein Besucher zum Platzhalter scrollt und dieser sichtbar wird, schmeißt das Skript den Platzhalter raus und fügt den originalen <iframe>-Code wieder ein. Das Video wird geladen – aber nur dann, wenn es wirklich gebraucht wird.

Der Performance-Gewinn ist enorm, da im ersten Ladevorgang nur ein winziges Bild anstelle eines komplexen Video-Players geladen wird.


Die Implementierung: Code zum Kopieren

Du benötigst nur zwei Bausteine: ein wenig CSS für das Styling und das JavaScript für die Logik.

Schritt 1: Das CSS für den Platzhalter

Dieser Code sorgt dafür, dass unser Platzhalter (die „Fassade“) korrekt im 16:9-Format angezeigt wird und der Play-Button zentriert und ansprechend aussieht. Füge ihn einfach in deine CSS-Datei ein.

CSS

.video-container {
    position: relative;
    width: 100%;
    /* 16:9 Seitenverhältnis für Videos */
    padding-bottom: 56.25%; 
    height: 0;
    overflow: hidden;
    background-color: #000;
}

.video-container iframe,
.video-container .video-placeholder {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    border: 0;
}

.video-placeholder {
    cursor: pointer;
    background-size: cover;
    background-position: center;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: all 0.2s;
}

.video-placeholder:hover {
    filter: brightness(1.1);
}

/* Play-Button als SVG-Icon */
.video-play-button {
    width: 90px;
    height: 60px;
    background-color: rgba(0, 0, 0, 0.6);
    border-radius: 14px;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: background-color 0.2s;
}

.video-placeholder:hover .video-play-button {
    background-color: #ff0000;
}

.video-play-button::before {
    content: '';
    border-style: solid;
    border-width: 15px 0 15px 26px;
    border-color: transparent transparent transparent white;
}

Schritt 2: Das JavaScript für die Magie 🚀

Dieses Skript erledigt die ganze Arbeit. Füge es am besten am Ende deiner Webseite vor dem schließenden </body>-Tag ein.

JavaScript

<script>
document.addEventListener("DOMContentLoaded", function() {
    // 1. Finde alle Container, die ein Video enthalten könnten
    const videoContainers = document.querySelectorAll(".video-container");

    // 2. Ersetze jeden iFrame durch eine leichte Fassade
    videoContainers.forEach(container => {
        const iframe = container.querySelector("iframe");
        if (!iframe || !iframe.src) return;

        const videoSrc = iframe.src;
        // Speichere die Original-URL im Container-Element für später
        container.setAttribute("data-video-src", videoSrc);

        // Extrahiere die YouTube-Video-ID aus der URL
        let videoId;
        try {
            const url = new URL(videoSrc);
            videoId = url.pathname.split('/').pop();
        } catch (e) {
            console.error("Ungültige iFrame-URL:", videoSrc);
            return;
        }

        // Erstelle den Platzhalter
        const placeholder = document.createElement("div");
        placeholder.className = "video-placeholder";
        // Nutze das hochauflösende Vorschaubild von YouTube
        placeholder.style.backgroundImage = `url('https://img.youtube.com/vi/${videoId}/maxresdefault.jpg')`;
        
        // Erstelle den Play-Button
        const playButton = document.createElement("div");
        playButton.className = "video-play-button";
        placeholder.appendChild(playButton);

        // Leere den Container und füge nur den Platzhalter ein
        container.innerHTML = "";
        container.appendChild(placeholder);
    });
    
    // 3. Beobachte die Platzhalter und lade das Video, wenn sie sichtbar werden
    const observer = new IntersectionObserver((entries, obs) => {
        entries.forEach(entry => {
            if (entry.isIntersecting) {
                const container = entry.target;
                loadVideo(container); // Lade das Video
                obs.unobserve(container); // Beobachtung beenden, Aufgabe erledigt
            }
        });
    });

    // Wende den Observer auf alle Video-Container an
    videoContainers.forEach(container => {
        observer.observe(container);
    });
});

// Funktion, die den originalen iFrame wiederherstellt
function loadVideo(container) {
    const videoSrc = container.getAttribute("data-video-src");
    if (videoSrc) {
        container.innerHTML = `<iframe src="${videoSrc}" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>`;
    }
}
</script>

Fazit

Mit dieser Methode schlägst du zwei Fliegen mit einer Klappe: Du kannst deine bestehende Inhaltsstruktur beibehalten und musst keine komplexen Änderungen am Backend vornehmen, profitierst aber trotzdem voll von den Vorteilen des Lazy Loadings.

Deine Besucher werden sich über die schnellere Ladezeit freuen und Suchmaschinen wie Google werden deine Webseite mit besseren Core Web Vitals belohnen. Probier es aus – der Aufwand ist minimal, der Effekt ist riesig!

Klar, hier ist die Erklärung für die „normale“ und direkteste Methode des Lazy Loadings, wenn du den HTML-Code des iFrames bearbeiten kannst. Diese Methode ist einfacher und benötigt weniger Code als die Fassaden-Methode.


Die Standard-Methode: src zu data-src ändern

Der ganze Trick besteht darin, dem Browser die Anweisung zum sofortigen Laden zu nehmen. Das erreichen wir, indem wir die Video-URL aus dem Standard-Attribut src in ein benutzerdefiniertes Daten-Attribut, typischerweise data-src, verschieben.

Das Prinzip:

  1. HTML vorbereiten: Wir entfernen die URL aus dem src-Attribut. So weiß der Browser nicht, was er laden soll, und tut erst einmal nichts. Die URL „parken“ wir stattdessen im data-src-Attribut.
  2. Beobachten per JavaScript: Ein IntersectionObserver beobachtet das iFrame-Element.
  3. Laden bei Sichtbarkeit: Sobald der Nutzer zum iFrame scrollt, kopiert das Skript die URL aus data-src zurück in das src-Attribut. Erst dieser Schritt löst das Laden des Videos aus.

Schritt 1: Den HTML-Code anpassen

Das ist der wichtigste Schritt. Du musst jeden iFrame, der verzögert geladen werden soll, manuell anpassen.

Vorher (lädt sofort):

HTML

<iframe 
  src="https://www.youtube-nocookie.com/embed/DEIN_VIDEO_ID" 
  frameborder="0" 
  allowfullscreen>
</iframe>

Nachher (für Lazy Loading vorbereitet):

HTML

<iframe 
  class="lazy-video" 
  data-src="https://www.youtube-nocookie.com/embed/DEIN_VIDEO_ID" 
  frameborder="0" 
  allowfullscreen>
</iframe>

Wichtige Änderungen:

  • src="..." wurde komplett durch data-src="..." ersetzt.
  • Eine CSS-Klasse wie lazy-video wurde hinzugefügt, damit unser Skript das Element leicht finden kann.
  • Das src-Attribut ist anfangs nicht vorhanden oder leer (src="").

Schritt 2: Das JavaScript für die Logik

Dieses Skript ist kurz und effizient. Es sucht nach allen Elementen mit der Klasse .lazy-video und wendet den IntersectionObserver auf sie an.

Füge diesen Code vor dem schließenden </body>-Tag ein:

JavaScript

<script>
document.addEventListener("DOMContentLoaded", function() {
  // 1. Wähle alle iFrames aus, die verzögert geladen werden sollen
  const lazyIframes = document.querySelectorAll("iframe.lazy-video");

  // 2. Erstelle einen Beobachter
  const observer = new IntersectionObserver((entries, obs) => {
    entries.forEach(entry => {
      // Prüfe, ob das Element jetzt im sichtbaren Bereich ist
      if (entry.isIntersecting) {
        const iframe = entry.target;
        
        // 3. Kopiere die URL von data-src nach src
        iframe.src = iframe.dataset.src;
        
        // Entferne die Klasse, falls sie für Styling (z.B. Lade-Spinner) genutzt wurde
        iframe.classList.remove("lazy-video");
        
        // 4. Beende die Beobachtung für dieses Element, die Aufgabe ist erledigt
        obs.unobserve(iframe);
      }
    });
  });

  // 5. Wende den Beobachter auf jedes ausgewählte iFrame an
  lazyIframes.forEach(iframe => {
    observer.observe(iframe);
  });
});
</script>

CSS für ein responsives Vollbild-Video

Füge diesen CSS-Code zu deiner Stylesheet-Datei hinzu. Er funktioniert sowohl für die „normale“ Lazy-Loading-Methode als auch für die „Fassaden-Methode“.

CSS

.video-container {
    position: relative;
    width: 100%; /* Nimmt die volle Breite des Elternelements ein */
    height: 0;
    padding-bottom: 56.25%; /* Dies ist der Trick für das 16:9 Seitenverhältnis (9 / 16 = 0.5625) */
    overflow: hidden;
    background-color: #000; /* Schwarzer Hintergrund, falls das Laden kurz dauert */
}

.video-container iframe {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    border: 0; /* Entfernt den Standard-Rahmen des iFrames */
}

Wie es funktioniert 💡

  1. position: relative;: Der Container (.video-container) wird zum Bezugspunkt für alle Elemente, die darin absolut positioniert sind.
  2. width: 100%;: Der Container wird so breit wie sein Elternelement (z.B. der Inhaltsbereich deines Artikels).
  3. height: 0; und padding-bottom: 56.25%;: Das ist der entscheidende Teil. Wir setzen die Höhe des Containers auf null, aber erzeugen seine Höhe durch einen prozentualen padding-bottom. Da sich Prozentwerte beim padding auf die Breite des Elements beziehen, erzwingen wir so ein festes Seitenverhältnis. Für ein 16:9-Video ist die Höhe 56.25% der Breite.
    • Für ein 4:3 Video würdest du 75% verwenden (3 / 4 = 0.75).
  4. position: absolute; (beim iframe): Der iFrame wird aus dem normalen Fluss der Seite genommen und innerhalb seines relativen Containers platziert.
  5. top: 0; left: 0; width: 100%; height: 100%;: Damit spannt sich der iFrame exakt über die gesamte Fläche seines Containers, die durch den padding-trick auf das richtige Seitenverhältnis gebracht wurde.

Egal wie breit der Bildschirm ist, das Video wird immer die volle Breite ausfüllen und dabei niemals verzerrt dargestellt.

Zusammenfassung: Vor- und Nachteile

  • Vorteile:
    • Sehr effizient: Es ist die direkteste und ressourcenschonendste Methode.
    • Wenig Code: Das Skript ist kurz und einfach zu verstehen.
    • Kein Flackern: Der Übergang ist nahtlos, da der leere iFrame-Rahmen direkt mit dem Videoinhalt gefüllt wird.
  • Nachteil:
    • HTML muss änderbar sein: Der größte Nachteil ist, dass du die Kontrolle über den HTML-Code haben musst, um die src-Attribute anzupassen. Wenn das nicht der Fall ist, musst du auf die „Fassaden-Methode“ zurückgreifen.
Das musst du sehen...
Tom Scharlock
Tom Scharlock

PWA.ist ein PWA App Store, ein Blog, eine Video Wissensseite und die Agenturpräsenz der PRGRSV ::Agentur Arnstadt. Ganz neu sind die PWA & WEB Tools Meine Biografie

Artikel: 168