首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用requestAnimationFrame?

如何使用requestAnimationFrame?
EN

Stack Overflow用户
提问于 2011-04-09 22:22:55
回答 2查看 55K关注 0票数 52

我是动画新手,但我最近使用setTimeout创建了一个动画。FPS太低了,所以我找到了使用requestAnimationFrame的解决方案,在这篇link中描述了这一点。

到目前为止,我的代码是:

代码语言:javascript
复制
//shim layer with setTimeout fallback
    window.requestAnimFrame = (function(){
        return  
            window.requestAnimationFrame       || 
            window.webkitRequestAnimationFrame || 
            window.mozRequestAnimationFrame    || 
            window.oRequestAnimationFrame      || 
            window.msRequestAnimationFrame     || 
            function(/* function */ callback){
                window.setTimeout(callback, 1000 / 60);
            };
    })();
    (function animloop(){
        //Get metrics
        var leftCurveEndX = finalLeft - initialLeft;
        var leftCurveEndY = finalTop + finalHeight - initialTop;
        var rightCurveEndX = finalLeft + finalWidth - initialLeft - initialWidth;
        var rightCurveEndY = leftCurveEndY;

        chopElement(0, 0, 0, 0, leftCurveEndX, leftCurveEndY, rightCurveEndX, rightCurveEndY);//Creates a new frame 
        requestAnimFrame(animloop);
    })();

这会在第一帧停止。我在chopElement函数中有一个回调函数requestAnimFrame(animloop);

另外,有没有更全面的API使用指南?

EN

回答 2

Stack Overflow用户

发布于 2013-08-06 09:39:15

代码语言:javascript
复制
 /*
  Provides requestAnimationFrame in a cross browser way.
  http://paulirish.com/2011/requestanimationframe-for-smart-animating/
 */

if (!window.requestAnimationFrame) {

    window.requestAnimationFrame = (function() {

        return window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame || // comment out if FF4 is slow (it caps framerate at ~30fps: https://bugzilla.mozilla.org/show_bug.cgi?id=630127)
        window.oRequestAnimationFrame ||
            window.msRequestAnimationFrame ||
            function( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element) {

                window.setTimeout(callback, 1000 / 60);

        };

    })();

}

animate();

function animate() {
    requestAnimationFrame(animate);
    draw();
}

function draw() {
    // Put your code here
}

看看下面的jsfiddle示例;它清楚地说明了我的意思;

http://jsfiddle.net/XQpzU/4358/light/

希望这能有所帮助!

票数 8
EN

Stack Overflow用户

发布于 2014-03-18 04:49:40

“智能节流,这样事件就不会被触发的次数超过屏幕重绘更改的次数:

代码语言:javascript
复制
var requestFrame = window.requestAnimationFrame ||
                   window.webkitRequestAnimationFrame ||
                   // polyfill - throttle fall-back for unsupported browsers
                   (function() {
                       var throttle = false,
                           FPS = 1000 / 60; // 60fps (in ms)
       
                       return function(CB) {
                         if( throttle ) return;
                         throttle = true;
                         setTimeout(function(){ throttle = false }, FPS);
                         CB(); // do your thing
                       }
                    })();

/////////////////////////////
// use case:

function doSomething() {
  console.log('fired');
}

window.onscroll = function() {
  requestFrame(doSomething);
};
代码语言:javascript
复制
html, body{ height:300%; }
body::before{ content:'scroll here'; position:fixed; font:2em Arial; }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5605588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档