为什么不jQuery使用requestAnimationFrame?

有些浏览器支持requestAnimationFrame ,那么为什么不使用它呢? 毕竟自Google Chrome 10以来 ,它一直受到支持 。 尽pipe如此,jQuery 似乎并没有使用它 。 我发现了一个关于它的错误报告 ,但没有给出真正的解释? 不过,我相信jQuery的人有他们的理由。

为什么他们不使用这个真棒API?

在票#9381中,您可以阅读为什么他们在一段时间后停止使用requestionAnimationFrame

总而言之,问题在于,当窗口没有焦点时,animation没有运行(浏览器试图减lessCPU负载),如果窗口被隐藏,那么没有问题,但是如果它是可见的,则不在焦点。 此外,animation队列堆积,窗口重新聚焦后,事情变得疯狂。 这将需要代码中的丑陋变化和/或改变人们将动作添加到animation队列的方式。 所以决定删除支持,直到有更好的方法来做到这一点。

鉴于其他答案和反对意见,我想在一个简单的幻灯片animation上进行testing:

http://brass9.com/nature

截至2013年,其他答案中的反对意见似乎不再显着。 我已经添加

https://github.com/gnarf/jquery-requestAnimationFrame/blob/master/src/jquery.requestAnimationFrame.js

到我现有的animation代码,并validation它开启并影响正在使用的淡入淡出animation。 它可以在Chrome 30,IE 11和FF 24中可靠地工作,即使在后台窗口中。testingAndroid 2.3,它似乎使用了polyfill,并按预期工作。

jQuery 3

jQuery 3.0集成了requestAnimationFrame 。 基本上,jQuery可以很好的处理,但是有些用户会调用.setInterval(function() { tag.animate(.setInterval(function() { tag.animate( ,所以主要版本发布.setInterval(function() { tag.animate( 3不支持IE8及以下版本。如果你有IE8用户,坚持使用jQuery 1.x.

CSS转换

在我的testing中, requestAnimationFrame的CPU /省电声明是虚假的承诺。 我发现CPU的使用率很高,例如,长时间的褪色。 什么是节省CPU /电池是CSS转换 ,可能是因为浏览器,尤其是移动浏览器,对你想要什么以及什么是要求他们做出更强的假设,而本地代码仍然比Javascript + DOM更快。

所以,如果你真的想节省CPU /电池,CSS转换是给你的。 IE9及以下版本无法处理它们,并且仍然有很多用户,所以请考虑jquery.transit及其后备在页面底部进行animate

在v1.6.2的jQuery源代码中,如果存在requestAnimationFrame ,我会看到它。 我没有详细研究代码,看到它被用于所有可用的代码,但它正在代码的animation部分使用,而不是调用setInterval() 。 以下是来自1.6.2的代码:

 // Start an animation from one number to another custom: function( from, to, unit ) { var self = this, fx = jQuery.fx, raf; this.startTime = fxNow || createFxNow(); this.start = from; this.end = to; this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" ); this.now = this.start; this.pos = this.state = 0; function t( gotoEnd ) { return self.step(gotoEnd); } t.elem = this.elem; if ( t() && jQuery.timers.push(t) && !timerId ) { // Use requestAnimationFrame instead of setInterval if available if ( requestAnimationFrame ) { timerId = true; raf = function() { // When timerId gets set to null at any point, this stops if ( timerId ) { requestAnimationFrame( raf ); fx.tick(); } }; requestAnimationFrame( raf ); } else { timerId = setInterval( fx.tick, fx.interval ); } } }, 

我还没有使用1.6.4,所以我不知道这个版本。 如果不是那个版本的话,肯定会有一些问题,所以被删除了。

编辑:

如果你阅读这个博客文章 ,这听起来好像是从1.6.3中撤出的,也许会被放回到1.7中,而被拉的主要原因是因为它破坏了人们使用animation队列“错误地”虽然也许这是意见的问题)。