Javascript Animate Performance
Javascript Animate Performance
我的js在这里遇到了一些问题。
它运行正常,但在某些情况下性能太慢。
我轻轻地滚动到底部,但是当我尝试再次向上滚动时,它滚动得非常慢。
我能做些什么来提高性能?
谢谢!
$(function(){
var windowHeight = $(window).height();
var windowWidth = $(window).width();
var sectionsNumbers = $("#content section").length-1;
var sectionCount = 0;
// Scroll sets
var windowScrollX = ((sectionsNumbers+1)*windowWidth)-windowWidth;
var windowScrollY = ((sectionsNumbers+1)*windowHeight)-windowHeight;
$("#content").css("width", windowScrollX+windowWidth);
$("#content").css("height", windowScrollY+windowHeight);
$(".illusion1").css("width", windowScrollX+windowWidth);
$(".illusion1").css("height", windowScrollY+windowHeight);
// Set mask w and h
$("#mask").css("width", windowWidth);
$("#mask").css("height", windowHeight);
$(".scrollRule").css("height", (sectionsNumbers+1)*windowHeight);
$("#content section").each(function() {
// Defines its width and height
$(this).css("width", windowWidth);
$(this).css("height", windowHeight);
// Defines its position
$(this).css("left", sectionCount*windowWidth);
$(this).css("top", sectionCount*windowHeight);
sectionCount++;
});
// When window scrolls
$(window).scroll(function(){
var curScrollTop = $(window).scrollTop();
var angleVar = windowScrollX/windowScrollY;
$("#content").stop().animate({left: "-"+curScrollTop*angleVar, top: "-"+curScrollTop}, {duration: 250, easing: 'easeOutQuart'});
$(".illusion1").stop().animate({left: "-"+curScrollTop*angleVar*0.5, top: "-"+curScrollTop*0.5}, {duration: 250, easing: 'easeOutQuart'});
//{duration: 1500, easing: 'easeOutQuart'}
});
});
你没有在动画中缓存选择器(反复使用 $(this) 或 $('#mask') 也是浪费),所以每次用户滚动时,它都会搜索整个 dom/以查找 #content,#illusion1。此外,在滚动上制作动画有些多余,因为滚动本身就是一种"动画"。固定定位将是理想的,但您只需在每个滚动上设置 CSS 样式即可实现相同的效果。只是不要在每个滚动事件上使用动画。此外,您没有为左侧和顶部提供"px",这样做可以防止需要通过前缀"-"+"将"强制转换"到字符串中。尝试重写 $(window).scroll 函数,如下所示:
var $window = $(window),
$content = $("#content"),
$illusion = $(".illusion1");
$window.scroll(function(){
var curScrollTop = $window.scrollTop();
var angleVar = windowScrollX/windowScrollY;
$content.css({ left: (-curScrollTop*angleVar)+'px', top: (-curScrollTop)+'px' });
$illusion.css({ left: (-curScrollTop*angleVar*0.5)+'px', top: (-curScrollTop*0.5)+'px' });
});
如果您专注于动画效果,请考虑使用去抖动/油门方法。与其对每个滚动事件进行动画处理,不如使用:"timeout = setTimeout(function(){ ... }, 25)",它将在允许超时过期时执行动画,并在滚动时只需清除超时(timeout)并再次设置超时。动画不会是实时的,因为除非用户停止滚动 25 毫秒,否则永远不会执行动画。
不确定这是否有帮助,但是当我必须在滚动时相对于浏览器窗口移动元素时,我使用某种形式的固定定位。 我发现这在 Chrome 和其他浏览器中提供了更好的性能,而不是尝试设置或动画绝对或相对定位元素的偏移量。 也许如果你能鞭打一个jsfiddle来说明你正在努力达到的效果,我可以给出一些进一步的建议。
编辑:如果你能提供一些HTML来代替jsfiddle,那也会有所帮助。
说将整个捆绑包更改为TweenLite,它比jQuery动画运行更流畅。
http://www.greensock.com/v12/
您可以在下面比较差异。
http://www.greensock.com/js/speed.html
- 可以'使用jQuery animate时无法看到动画
- 如何使用jquery animate来回移动多个元素
- Performance: NaCl vs Emscripten
- jQuery animate()函数没有't设置动画
- JQuery.animate();不以固定高度工作
- $animate addClass在angular 1.3中不起作用
- JS异常:animate不是一个函数
- 关于使用Animate.css向和项添加和删除动画类的问题
- 有没有什么方法可以停止Jquery中的animate(也可以停止完整的回调函数)
- 有没有一种方法可以用步骤递归调用jQuery animate()
- jquery animate无法正常工作
- Can't get the tail to wag (animate) in three.js?
- 添加animate.css类,然后使用remove移除元素
- 使用.animate滚动文本
- JQuery.animate()菜单幻灯片返回
- jQuery animate只在单击时工作一次
- 如何在不使用css转换的情况下将jQuery animate与css3属性相结合
- Implementation of jQuery 'animate' with Meteor
- jQuery:在 animate 属性上使用变量
- Javascript Animate Performance