transform:translate3d
来操作figure
元素中的图像。根据我所了解的(Paul Irish的博客等),为了性能考虑,这个任务的最佳解决方案是使用requestAnimationFrame
。虽然我知道如何编写Javascript,但我总是不确定如何编写好的Javascript。特别是,尽管下面的代码似乎可以正确流畅地运行,但我想解决一些在Chrome Dev Tools中看到的问题。
$(document).ready(function() {
function parallaxWrapper() {
// Get the viewport dimensions
var viewportDims = determineViewport();
var parallaxImages = [];
var lastKnownScrollTop;
// Foreach figure containing a parallax
$('figure.parallax').each(function() {
// Save information about each parallax image
var parallaxImage = {};
parallaxImage.container = $(this);
parallaxImage.containerHeight = $(this).height();
// The image contained within the figure element
parallaxImage.image = $(this).children('img.lazy');
parallaxImage.offsetY = parallaxImage.container.offset().top;
parallaxImages.push(parallaxImage);
});
$(window).on('scroll', function() {
lastKnownScrollTop = $(window).scrollTop();
});
function animateParallaxImages() {
$.each(parallaxImages, function(index, parallaxImage) {
var speed = 3;
var delta = ((lastKnownScrollTop + ((viewportDims.height - parallaxImage.containerHeight) / 2)) - parallaxImage.offsetY) / speed;
parallaxImage.image.css({
'transform': 'translate3d(0,'+ delta +'px,0)'
});
});
window.requestAnimationFrame(animateParallaxImages);
}
animateParallaxImages();
}
parallaxWrapper();
});
首先,当我在Chrome Dev Tools的“时间轴”选项卡中开始录制时,即使页面上没有执行任何操作,“记录的操作”叠加计数仍然以每秒约40次的速度不断增加。
其次,为什么“动画帧触发”每隔约16毫秒执行一次,即使我没有滚动或与页面交互,如下图所示?
第三,为什么使用的JS堆大小会在我不与页面交互的情况下增加?如下图所示。我已经排除了所有可能引起此问题的其他脚本。
有人能帮我指出如何解决以上问题,并给我改进代码的建议吗?