如何避免由于背景图片加载延迟而导致页面加载时出现的白色“闪烁”?

49

问题在于,大多数网站都有背景图片。它们需要时间来加载。通常情况下,如果这些图片被优化并且足够小的话,这不会是一个问题。然而,在我的一些网站上,javascript文件以某种方式在页面上任何其他内容之前加载,即使它们位于页脚中!这会在背景图片加载之前创建一个白色的“闪光”效果。为什么我的javascript会先于其他任何东西加载?我在许多网站上都遇到了这个问题,并且到处都能看到它。以下是我目前正在工作的网站:

http://www.bridgecitymedical.com/wordpress/

谢谢!

tl;dr 我该如何推迟加载我的网站上的javascript,以便在浏览器完成图像下载之前加载背景图像,从而防止那种白色“闪光”。


这是一个很好但缺乏好答案的问题。为什么?因为这是一个 bug。在 CSS 的设计和浏览器之间,某个人犯了错误。似乎不可能在 Firefox 或 Chrome 中显示或刷新页面而不显示背景颜色作为每个具有背景图像的 div 的错误背景,直到背景图像完全加载。如果是一张照片,那么加载可能需要 90 毫秒或更长时间。 - David Spector
7个回答

59

不要延迟加载站点的部分内容 - 如果背景图像传输时出现错误并且永远无法到达,那么您的脚本将永远无法加载。

相反,如果您真的不喜欢“白色”闪烁,请将文档的背景颜色设置为更令人愉悦的颜色,并与您的背景图像更加协调。您可以在同一 CSS 样式中完成此操作:

body {
    background: #EDEBED url(myGrayBackgroundImage.jpg);
}

这很简单,几乎没有成本,不会出现故障,并且不会延迟不必要的下载。看起来您已经在做类似的事情-我不建议更改它。我认为没有人期望您的站点在加载之前以某种特定方式显示。


3
谢谢!我想我并不真正想要我的问题的解决方案,是吗? - alt
1
我期望一旦页面开始加载,屏幕上的任何内容都不应该改变。有时候,没有纯色背景与图像相似。必须有一种完美预加载背景图片的方法,但是搜寻了数小时也没有找到。这个答案在2021年对我无效,会留下指定颜色的长时间闪烁。在2014年,这个答案能够解决你的问题吗? - David Spector
1
页面已经设置为黑色,但重新加载仍然会闪烁白色。 - WilliamK

22
你可以使用类似以下的代码:

HTML

<!-- Add a class to flag when the page is fully loaded -->
<body onload="document.body.classList.add('loaded')">

CSS

/* Hide slider image until page is fully loaded*/
body:not(.loaded) #slider img {
  display:none;
}

2
聪明!小改进:在追加的className属性中添加一个空格。例如:document.body.className += ' load'; - jimbo
1
@jimbo 为什么呢? - Kris10an
2
@Kris10an 最初我的答案使用了 document.body.className += 'load';,因此如果 body 标签已经有了 class="body-class",那么 class 将变成 "body-classload"。目前更合适的操作类名的方式是通过 classList token 列表。 - kbtz
1
这种疯狂行为是许多新闻网站和其他内容为主的网站即使不使用客户端脚本也无法正常工作的原因之一。 - jbg

4
我遇到了和你一样的问题,觉得这件事情没有被更多地讨论实在很奇怪。我还没有找到任何关于CSS背景图片加载优先级的RFC文档,请在评论中提供您发现的任何信息。
不管怎样,我唯一发现的是<img>会立即加载,而background-image()似乎会在dom准备好后才会加载。
因此,我的解决方案是在背景图片的<div>之前放一个带有display:none<img>。这将立即加载图像,然后它就可以立即用于背景图片。
<img src="my-image.jpg" style="display: none;" />
<div style="background-image: url('my-image.jpg');"></div>
  • 需要注意的一点是,如果图像没有经过优化,仍然可能出现闪烁现象。因此,在创建jpg文件时,请确保对其进行压缩,并设置“渐进式”属性。

我不知道图片何时加载。我只知道这个答案对我没有用。这是我的确切的Bootstrap 5代码:<img src="./imat-bagja-gumilar-jwTvCQQJXh0-unsplash.jpg" style="display: none;"><div class="d-flex flex-column justify-content-center" style="background: url(./imat-bagja-gumilar-jwTvCQQJXh0-unsplash.jpg); background-position:center; background-size: cover; height:70vh;"> - David Spector

1

如果网页的背景设置为黑色图片,我想要添加一些内容。我正在尝试在同一站点的页面之间实现过渡效果。最终我使用了这个方法(从黑色平滑加载到黑色背景,避免了闪烁):

html{
    background-color: black;
}

body{
    -webkit-animation: fadein 1.5s; //I use chrome
    background: linear-gradient( rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.75) ), url('wall_pattern.jpg');
    color: white;
}

3
无论你使用什么,做网页开发时应尽可能地实现浏览器跨兼容。 - carefulnow1

0

因此,虽然更改背景颜色有所帮助,但重要的是要注意页面加载速度缓慢的原因很可能是由于JavaScript位于头部。您可以通过将JavaScript标签放置在

<script type="text/javascript" src="/path/to/js/javascript.js"></script>

在您的页面底部放置JS代码,这样它就会在浏览器读取CSS并显示页面大部分内容之后再加载。我知道这是一篇旧文章,但我在思考这个问题时偶然发现了它,并且通过回忆以前的对话和帖子,意识到我将JS代码放在了头部。

您还可以只需添加 defer 属性 - Kris10an
如果任何浏览器显示空脚本标签的错误,请包含JavaScript注释,如下所示:<script type="text/javascript" src="/path/to/js/javascript.js">/* */</script>。 - Patanjali
1
我的JavaScript代码已经放在body标签底部了。但是这个答案对我没用。 - David Spector

-2

我会在 CSS 中的图像 URL 上使用查询字符串“?201611”。这将告诉浏览器加载哪个版本的图像。因此,它不会每次检查新版本,而是加载缓存中保存的版本。Flash 效果只会在第一次访问网站时发生。

例如:http://domain.com/100x100.jpg?201611


-2
如果您更改渲染时间,就可以防止页面加载白色时让人眼花缭乱。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接