防止 iframe 加载时的白屏闪烁

Avatar of Chris Coyier
Chris Coyier 发布

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

如果您在 Google 上搜索此问题(在撰写本文时),您会发现一些不完整的答案,以及一些提倡这种不良实践的其他代码片段。

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

之所以不好,是因为 CSS 会始终隐藏 iframe,而禁用 JavaScript 的用户将永远无法看到该 iframe。现在,我通常不会为了迎合这部分人群而费尽心思,但我完全赞成使用更好的解决方案来解决此问题(如果可用)。

解决方案

感谢 Paul Irish 及其 可靠的 DOM 元素插入,以及 Ryan Seddon 及其关于 插入作用域样式元素的文章,我们有了这个方法。

// 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);
    }
    
})();

只需在出现白屏闪烁问题的任何页面(在 <head> 中)包含此代码,问题即可解决。请注意,我们在这里使用的是 window.onload,因此如果您的页面也在其他地方使用了它,请将它们合并。

工作原理

  1. 它在页面上插入了一些 CSS(立即生效),使所有 iframe 都不可见。您无法在不存在的 iframe 上看到白屏闪烁!
  2. 窗口加载完成后(这意味着 iframe 也加载完成),此 CSS 将被移除,使 iframe 再次可见。

受影响的浏览器

在撰写本文时,我能够在 Chrome 11 和 Safari 5 中重现此问题(基本上是 WebKit 问题)。当前版本的 Firefox、Opera 和 IE 则没有此问题。

其他方法怎么样?

您可以在 iframe 上添加 allowtransparency="true" 属性。您可以使用 CSS 将 iframe 的背景设置为透明。您可以确保源文档的背景与父页面的背景匹配。这些方法都不起作用。此方法有效。好吧……它对启用了 JavaScript 的用户有效。=)