为什么';jQuery是否使用requestAnimationFrame?
有些浏览器支持为什么';jQuery是否使用requestAnimationFrame?,jquery,requestanimationframe,Jquery,Requestanimationframe,有些浏览器支持requestAnimationFrame,为什么不使用它呢?毕竟,这是一场灾难。尽管如此,jQuery还是很有用。我找到了一个关于它的答案,但没有给出真正的解释?不过,我相信jQuery的人有他们的理由 为什么他们不使用这个很棒的API呢?在v1.6.2版的jQuery源代码中,我看到了requestAnimationFrame,如果它存在的话。我还没有详细研究代码,以了解它可以用于任何用途,但它被用于代码的动画部分,而不是调用setInterval()。以下是1.6.2中的代码
requestAnimationFrame
,为什么不使用它呢?毕竟,这是一场灾难。尽管如此,jQuery还是很有用。我找到了一个关于它的答案,但没有给出真正的解释?不过,我相信jQuery的人有他们的理由
为什么他们不使用这个很棒的API呢?在v1.6.2版的jQuery源代码中,我看到了
requestAnimationFrame
,如果它存在的话。我还没有详细研究代码,以了解它可以用于任何用途,但它被用于代码的动画部分,而不是调用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中,它被退出的主要原因是因为它打破了一些人们“错误地”使用动画队列的东西(尽管这可能是一个意见问题).在中,您可以阅读他们在一段时间后停止使用requestionAnimationFrame
的原因
总而言之,问题是当窗口没有焦点时,动画没有运行(浏览器试图减少CPU负载),如果窗口被隐藏,这是正常的,但如果它是可见的,就没有焦点。此外,动画队列堆积如山,在窗口恢复焦点后,事情变得疯狂起来。这将需要在代码中进行难看的更改和/或更改人们向动画队列添加内容的方式。因此,决定删除支持,直到有更好的方法来执行此操作。鉴于这里的其他答案和反对意见,我想用一个简单的幻灯片动画来测试这一点: 截至2013年,此处其他答案中的反对意见似乎不再重要。我补充说 到我现有的动画代码,并验证它正在打开并影响正在使用的淡入淡出动画。它工作可靠,即使在背景窗口,在Chrome30,IE11和FF24。在测试安卓2.3时,它似乎使用了polyfill并按预期工作 jquery3 。基本上,jQuery可以很好地处理它,但是一些用户会调用
.setInterval(function(){tag.animate(
),把它搞砸了。因此,主要版本的发布将一帆风顺。jQuery 3不支持IE8及以下版本,也永远不支持IE8,所以如果您有IE8用户,请坚持使用jQuery 1.x
CSS转换
在我的测试中,requestAnimationFrame
的CPU/电池节省声称是错误的承诺。我看到它的CPU使用率很高,例如,长时间的褪色。节省CPU/电池的原因可能是浏览器,尤其是移动浏览器,对您的意图和其他要求做出了更强有力的假设m、 本地代码仍然比Javascript+DOM快
<如果你真的想保存CPU /电池,CSS转换是为你准备的。IE9和下面不能处理它们,并且仍然有很多用户在那里,所以在页面的底部考虑它们的返回到<代码>动画。请看我已经搜索了<代码>请求引擎动画框架< /代码>,没有合适的方法来添加T。他的后帖1.8是使用类似于我的插件的东西:从jQuery1.8开始,我确保我们可以支持重写计时器循环,并编写了一个非常简单的插件,它将用
requestAnimationFrame
替换setInterval
——这主要是由于人们做了一些愚蠢的事情,比如setInterval(函数{$('.slideshow).animate(…);},3000);
。相反,他们应该等待每一个动画的结尾排到第二个。这是一个简单的修复方法,如果它落地,我们都可以得到更平滑、更省电的动画。这是真的,当窗口没有焦点时,我可以看到滑块褪色——至少在Chrome中是这样。虽然jQuery Core不使用requestAnimationFrame
,但我仍然可以看到在1.8中添加了挂钩,允许您覆盖setInterval
循环,从而可以安装最新版本的jQuery使用requestAnimationFrame
。当它在2016年6月发布时,即2011年9月之后。