requestAnimationFrame/cancelAnimationFrame的正确使用[重复]
Posted
技术标签:
【中文标题】requestAnimationFrame/cancelAnimationFrame的正确使用[重复]【英文标题】:Right usage of requestAnimationFrame / cancelAnimationFrame [duplicate] 【发布时间】:2015-01-04 08:02:40 【问题描述】:在使用 requestAnimationFrame API 时,我遇到了一个问题。 可能是因为我使用的结构是错误的,但对我来说似乎是合乎逻辑的。
我基本上做的是一个非常简单的背景位置操作,以获得无限下降的效果:
(这个版本是简化的,但是是示范性的)
cache.mechanism.snowFall = function()
cache.snow.position.y ++;
if( cache.snow.position.y > cache.viewport.height )
cache.snow.position.y -= cache.viewport.height;
cache.snow.elem.style.backgroundPosition = "0px " + cache.snow.position.y + "px";
requestAnimationFrame( cache.mechanism.snowFall );
;
实际上,它每动画帧将背景位置降低 1px。 (必要时重置,以避免高绘制时间和 FPS 损失)
我通过调用来初始化它:
cache.mechanism.snowFall();
所以,它运行良好,FPS 非常高,但无法停止。
cancelAnimationFrame( cache.mechanism.snowFall );
- 什么都不做,返回 undefined。
【问题讨论】:
【参考方案1】:您应该将要取消的requestAnimationFrame
的ID 发送到cancelAnimationFrame
。该id是原始requestAnimationFrame
的返回值。
所以请求一个动画循环:
var id = requestAnimationFrame(cache.mechanism.snowFall);
并取消该请求:
cancelAnimationFrame(id);
另外,由于必须调用 requestAnimationFrame
来保持循环运行,您可以使用标志来停止动画:
// Set an external flag to allow animations to continue
var continueAnimating = true;
function animate()
if(continueAnimating)
// when continueAnimating is false, this new
// request will not occur and animation stops
requestAnimationFrame(animate);
// To turn off animation
continueAnimating = false;
【讨论】:
以上是关于requestAnimationFrame/cancelAnimationFrame的正确使用[重复]的主要内容,如果未能解决你的问题,请参考以下文章