【发布时间】:2014-09-22 18:00:57
【问题描述】:
我正在一个视差网站上工作,其中有一系列图像(大约 400 张图像)。背景图像根据页面滚动而变化,以创建平滑移动的动画。我设法让滚动工作,但是当用户滚动时,背景图像的变化并不顺畅(我们可以看到空白区域一秒钟左右,具体取决于互联网连接)。此外,图像没有被缓存,页面每次都会发出新请求。如何优化此代码以使动画流畅,并且不会每次都请求新图像并使用缓存的图像。在画布中创建动画效率高吗?我尝试了画布,但它也会对每个滚动上的图像提出新的请求。这是我使用基于页面滚动的标准背景更改的代码:
HTML
<div class="container">
<div id="background-images" class="background-images">
<div class="test"></div>
</div>
</div>
CSS
#background-images{
height: 4000px;
}
.container{
border: 1px solid red;
height: 400px;
overflow: auto;
}
.test{
position: fixed;
top: 0;
left: 0;
z-index: 999;
width: 600px;
height: 600px;
}
Javascript
var $container = $(".container");
var $bgImage = $(".test");
// Attaching the scroll to the background image
$container.scroll(function(event) {
var position = $container.scrollTop();
setBgImage(position);
});
// preload the given total amount of iamges
function preload(totalImages) {
for (var i = 0; i < totalImages; i++) {
$('<img/>')[0].src = getImgUrl(i);
}
}
preload(36); // Preload 36 images, the cache should keep these so we wont't need to load these while we scroll
// Set the background image
function setBgImage(position){
var imageNum;
var lineCount = 0;
imageNum = parseInt(position / 100);
console.log("IMG: " + imageNum + ", Position: " + position);
$bgImage.css("background-image", "url('" + getImgUrl(imageNum) + "')");
}
// Set a placeholder background image
function getImgUrl(num){
return "http://placehold.it/200x200/&text=" + num;
}
JSFiddle:http://jsfiddle.net/4j9u8qtf/1/
【问题讨论】:
-
您能否打开 firebug 或 chrome 开发工具并验证您的资源是否按预期通过预加载加载(网络选项卡)?
-
是的。它加载状态码为 200 的所有内容,然后每次页面滚动时都会以状态 200 再次加载它们
-
查看this excellent answer 了解如何预加载背景图片。
-
可能无关紧要,但是您在测试时是否打开了控制台?打开控制台可能会使事情变慢很多,尤其是当您正在安慰某些事情时(在每个滚动事件中都是如此)
-
我尝试删除控制台日志并关闭控制台,但同样的问题仍然存在。问题只是延迟是因为接收图像的时间。
标签: javascript jquery css scroll background-image