White Flash beim Laden von Iframes verhindern

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Wenn Sie zur Zeit der Erstellung dieses Artikels nach diesem Problem googeln, finden Sie einige unvollständige Antworten und andere Snippets, die diese schlechte Praxis befürworten.

<!-- NO! Bad! -->
<iframe src="..." style="visibility:hidden;" onload="this.style.visibility='visible';"></iframe>

Der Grund, warum dies schlecht ist, ist, dass der CSS den iframe egal was passiert ausblendet und Benutzer mit deaktiviertem JavaScript diesen iframe niemals sehen werden. Nun, ich bin normalerweise nicht jemand, der extreme Anstrengungen unternimmt, um dieser Menge entgegenzukommen, aber ich bin jederzeit für bessere Lösungen, die dieses Problem lösen, wenn sie verfügbar sind.

Die Lösung

Dank Paul Irish und seiner Surefire DOM Element Insertion und Ryan Seddon und seinem Artikel über das Einfügen von gestylten Style-Elementen, haben wir das hier:

// Prevent variables from being global      
(function () {

      /*
          1. Inject CSS which makes iframe invisible
      */
    
    var div = document.createElement('div'),
        ref = document.getElementsByTagName('base')[0] || 
              document.getElementsByTagName('script')[0];

    div.innerHTML = '&shy;<style> iframe { visibility: hidden; } </style>';

    ref.parentNode.insertBefore(div, ref);

        
    /*
        2. When window loads, remove that CSS, 
           making iframe visible again
    */
    
    window.onload = function() {
        div.parentNode.removeChild(div);
    }
    
})();

Fügen Sie dies auf jeder Seite (im <head>) mit dem Problem des weißen Blitzes ein und es wird behoben. Beachten Sie einfach, dass wir hier window.onload verwenden. Wenn Ihre Seite dies ebenfalls irgendwo verwendet, kombinieren Sie sie.

Wie es funktioniert

  1. Es fügt sofort etwas CSS auf der Seite ein, das alle iframes unsichtbar macht. Sie können keinen weißen Blitz bei einem iframe sehen, der nicht da ist!
  2. Wenn das Fenster vollständig geladen ist (was bedeutet, dass auch die iframes vollständig geladen sind), wird dieses CSS entfernt, wodurch die iframes wieder sichtbar werden.

Betroffene Browser

Zum Zeitpunkt der Erstellung dieses Artikels konnte ich das Problem in Chrome 11 und Safari 5 reproduzieren (also im Wesentlichen ein WebKit-Problem). Aktuelles Firefox, Opera und IE sind in Ordnung.

Was ist mit... anderen Dingen?

Sie können das Attribut allowtransparency="true" auf den iframe setzen. Sie können den Hintergrund des iframe mit CSS auf transparent setzen. Sie können sicherstellen, dass der Hintergrund im Quellendokument mit dem Hintergrund der Elterndatei übereinstimmt. Nichts davon funktioniert. Dies funktioniert. Nun ja... es funktioniert für Benutzer mit aktiviertem JavaScript, jedenfalls. =)