垂直滚动视差背景效果

背景

我被要求编写一个脚本,为项目创建垂直滚动视差背景效果。 我最初的尝试看起来像这样:

(function($){ $.fn.parallax = function(options){ var $$ = $(this); offset = $$.offset(); var defaults = { "start": 0, "stop": offset.top + $$.height(), "coeff": 0.95 }; var opts = $.extend(defaults, options); return this.each(function(){ $(window).bind('scroll', function() { windowTop = $(window).scrollTop(); if((windowTop >= opts.start) && (windowTop <= opts.stop)) { newCoord = windowTop * opts.coeff; $$.css({ "background-position": "0 "+ newCoord + "px" }); } }); }); }; })(jQuery); // call the plugin $('.lines1').parallax({ "coeff":0.65 }); $('.lines1 .lines2').parallax({ "coeff":1.15 }); 

此代码确实提供了所需的效果,但滚动事件上的绑定是一个真正的性能消耗。

第1部分。如何更改插件以提高效率? 第2部分。是否有任何资源(书籍,链接,教程)我可以阅读以了解更多信息?

您可以尝试以下方式:

 (function($){ $.fn.parallax = function(options){ var $$ = $(this); offset = $$.offset(); var defaults = { "start": 0, "stop": offset.top + $$.height(), "coeff": 0.95 }; var timer = 0; var opts = $.extend(defaults, options); var func = function(){ timer = 0; var windowTop = $(window).scrollTop(); if((windowTop >= opts.start) && (windowTop <= opts.stop)) { newCoord = windowTop * opts.coeff; $$.css({ "background-position": "0 "+ newCoord + "px" }); } }; return this.each(function(){ $(window).bind('scroll', function() { window.clearTimeout(timer); timer = window.setTimeout(func, 1); }); }); }; })(jQuery); 

因此,如果有多个滚动事件是序列,浏览器将不会滚动背景。 我在事件处理程序之外编写了func ,以避免在每个事件中创建一个新的闭包。

你应该让实际的“scroll”事件处理程序启动一个计时器:

  var opts = $.extend(defaults, options); var newCoord = null, prevCoord = null; setInterval(function() { if (newCoord !== null && newCoord !== prevCoord) { $$.css({ "background-position": "0 "+ newCoord + "px" }); prevCoord = newCoord; } }, 100); return this.each(function(){ $(window).bind('scroll', function() { windowTop = $(window).scrollTop(); if((windowTop >= opts.start) && (windowTop <= opts.stop)) { newCoord = windowTop * opts.coeff; } else prevCoord = newCoord = null; }); }); 

或类似的东西。 这样,您每秒最多只能执行10次DOM操作。

你可以做的一件事是:而不是:

  $(window).bind('scroll', function() { windowTop = $(window).scrollTop(); if((windowTop >= opts.start) && (windowTop <= opts.stop)) { newCoord = windowTop * opts.coeff; $$.css({ "background-position": "0 "+ newCoord + "px" }); } }); 

您可以在scroll事件之外创建窗口jQuery对象。

  $window = $(window); //create jQuery object $window.bind('scroll', function() { windowTop = $window.scrollTop(); if((windowTop >= opts.start) && (windowTop <= opts.stop)) { newCoord = windowTop * opts.coeff; $$.css({ "background-position": "0 "+ newCoord + "px" }); } });