探索使javascript动画平滑的一些方法
本文通过基于DOM的Javascript动画库的概述,如velocity.js和GSAP,看看它是如何更有效地比jQuery和CSS动画效果。
jQuery
让我们从基础开始:Javascript和jQuery是错误的。javascript动画很快。jQuery减慢了速度,为什么因为尽管jQuery非常强大,但成为一个强大的动画引擎绝不是jQuery的设计目标:
jQuery无法避免颠簸的布局,这是因为它的代码库提供了除动画之外的多种用途。
jQuery的内存消耗常常触发垃圾收集,它允许动画不时地被修复。
jQuery使用setInterval代替requestanimationframe(RAF)保护新技术的影响。
需要注意的是布局是崎岖不平的,也就是说动画的最初部分不流畅。垃圾收集是不光滑的动画时期的主要原因。而不是使用皇家空军,它将导致低帧速率。
实现的例子
避免DOM查询和更新组合,从而导致布局混乱:
无功currenttop,
currentleft;
布局颠簸。
currenttop = element.style.top; / * * /查询
element.style.top = currenttop + 1; / * * /更新
currentleft = element.style.left; / * * /查询
element.style.left = currentleft + 1; / * * /更新
无布局颠簸。
currenttop = element.style.top; / * * /查询
currentleft = element.style.left; / * * /查询
element.style.top = currenttop + 1; / * * /更新
element.style.left = currentleft + 1; / * * /更新
更新后的查询将强制浏览器重新计算页面的计算数据。同时,它将考虑到新的更新效果。这将给动画带来巨大的代价,这仅仅是16毫秒的小间隔运行超时。
同样地,实现英国皇家空军不必是对现有代码库的重大返工。让我们来比较一下英国皇家空军的基地setInterval:
无功startingtop = 0;
setInterval:运行每16毫秒达到60fps(16ms / / / 60 1000ms ~ =)。
setInterval(){()函数(
由于这60秒的滴答声60次,我们将最高属性每1秒1单位的增量划分为…
element.style.top =(startingtop = 1 / 60);
},16);
RequestAnimationFrame:尝试运行60fps /基于浏览器是否处于最优状态。
函数滴答(){
element.style.top =(startingtop = 1 / 60);
}
window.requestanimationframe(√);
英国皇家空军产生最大的可能性,促进动画性能,你可以做一个单一的代码更改。
CSS转换
通过CSS转换逻辑,浏览器本身把动画处理超出了jQuery,并在以下几个方面:(1)有效的DOM交互,内存消耗的优化避免卡顿(颠簸),(2)使用空军发动机原理,(3)硬件加速(被迫提高性能利用动画GPU的能力)。
然而,现实的情况是,这些优化也可以在javascript.gsap直接执行这样做已经有很多years.velocity.js,一个新的动画引擎,不仅使用相同的技术,但也有几个步骤-我们将很快讨论这些。
事实上,Javascript动画可以与CSS竞争,作为我们恢复程序的第一步,第二步是实现比CSS更快的Javascript动画。
现在我们来讨论CSS转换的弱点:
转型强制硬件加速会增加GPU的消耗,这将导致在高负荷情况下运行不畅。这是特别明显,在移动设备上。(在特殊情况下,例如,当数据浏览器的主线程和线程之间的排版,通过瓶颈导致失败)。一些CSS属性,如变换和不透明,不受这些瓶颈的影响。认真总结Adobe这里有这些问题。
过渡在IE10没有用,和桌面网站可用性由于IE8和IE9仍然是广泛使用的问题。
由于转换不由Javascript本地控制(而不是由Javascript触发),浏览器无法学习如何通过控制过渡的Javascript代码同步优化它们。
相反,基于Javascript的动画库可以自动确定合适的硬件开放,它们是所有IE浏览器的固有版本,特别适合批量动画优化。
我的建议是使用本地的CSS变换仅当你制定和实施简单的动画仅移动端。在这样的环境中,转型是一个土生土长的有效的解决方案,使您无需增加额外的Javascript库实现所有动画逻辑在样式表中,这样你的页面臃肿。然而,当你设计复杂UI界面的不同状态或开发应用程序,你应该使用动画库保持动画流和工作流管理方便。交通是一个管理的CSS转换特别优秀的图书馆。
Javascript动画
嗯,Javascript在性能方面可能占上风。但具体的Javascript快多少好先构建一个真正的3D动画的例子是足够快的速度是什么,通常在建筑中你只会看到WebGL使用。构建一个小的多媒体动画就足够了。你通常只看到闪光灯或闪光灯效果吗。建设和建设虚拟世界就足够了,通常你只会看到画布的构建。
为了直接比较领先的动画库,当然,它包括交通(它使用CSS渐变效果),回头看看velocityjs.org速度的文件。
问题仍然存在:Javascript如何在细节上实现其高性能下面是一个基于Javascript动画实现的优化列表。
在整个动画链中间同步DOM堆栈,以最小化布局抖动。
为整个链调用缓存属性的值,以尽量减少DOM查询的发生(这些都是高性能DOM动画的陷阱)。
在同一个调用中,整个同级别元素的单位转换率被缓存(如PX到%、EM等等)。
当更新没有可视可见时,可以跳过更新。
让我们回顾一下以前关于布局和颠簸的知识。velocity.js采用这些最佳实践来缓存动画结束值重新使用它作为后续动画的起始值,从而避免重新查询DOM得到元素的起始值。
$元
将元素向下滑动到视图中。
速度({透明度:1,顶部:50% })
后延迟/ 1000ms滑动元件出的观点。
速度({透明度:0,顶部:50%,{,{延迟:1000 });
在上面的例子中,第二个速度调用知道它应该自动从不透明开始到1和顶部为50%。
浏览器本身最终能够完成许多这些相同的优化,但这将显著降低的方式,开发商可以使动画代码。因此,出于同样的原因,因为jQuery不使用RAF(如上所述),浏览器将不进行优化,甚至给个小机会打破规格或偏离预期的行为。
最后,我们比较了这两种Javascript动画库(Velocity.js和GSAP)。
GSAP是第一部图书馆展示Javascript DOM的令人印象深刻的动画的表现。这是真的,但也存在一些不足之处:
在中高负荷的DOM交互动画,GSAP开销使动画在开始和过程中的失帧。
相反,Velocity.js是超宽松的MIT许可下发布的,GSAP是封闭的源代码,并允许在多类业务的年费。
因为GSAP是一个完整的动画套件,它的大小是速度的三倍。然而,GSAP有如此丰富的功能,它可以成为一个活生生的瑞士军刀。
我建议你使用时,你需要精确的控制时序GSAP(如重绘,暂停/恢复)和运动(如贝塞尔曲线路径)。这些功能在游戏开发和在一些特殊的应用中是至关重要的,但通常不需要使用用户界面的Web应用程序。
velocity.js
引用GSAP丰富的功能并不代表速度本身的特点是重量轻。相反,在7kb只有经过压缩,速度jQuery(美元。动画)不仅复制的所有功能,它还把彩色动画、转换、循环,缓解效果,动画滚动包装。
总之,速度是jQuery、jQuery UI和CSS渐变的最佳组合。
此外,通过使用jQuery($队列)方法,可以方便地使用(jQuery的)方法,使我们能够实现无缝的互操作性。此外,由于速度的语法($)动画()语法是相同的,您不需要更改任何代码页。
让我们快速看一下速度的基本级别,js的速度行为与动画()相同:
$元
延迟(1000)
使用速度的动画元素的 /顶在一段时间2000ms财产。
速度({顶部:50% },2000)
使用一个标准的jQuery方法来将元素淡出,一旦速度完成,动画顶部…
淡出(1000);
在最先进的水平上,你可以创建一个复杂的三维动画滚动场景-几乎只要它使用两行简单的代码:
$元
滚动浏览器这个元素的顶部或在一段时间1000ms ..
速度(滚动)
然后围绕y轴度旋转元素。* 360
。速度({ rotatey:360deg},1000);