52

アニメーションは初めてですが、最近 を使用してアニメーションを作成しましたsetTimeout。FPS が低すぎるため、このリンクrequestAnimationFrameで説明されている使用する解決策を見つけました。

これまでのところ、私のコードは次のとおりです。

//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);
    })();

これは最初のフレームで停止します。関数にコールバック関数requestAnimFrame(animloop);がありchopElementます。

また、この API を使用するためのより完全なガイドはありますか?

4

3 に答える 3

83

警告!この質問は、シムするための最良の方法についてではありません requestAnimFrame。あなたがそれを探しているなら、このページの他の答えに進んでください。


自動セミコロン挿入にだまされました。これを試して:

window.requestAnimFrame = function(){
    return (
        window.requestAnimationFrame       || 
        window.webkitRequestAnimationFrame || 
        window.mozRequestAnimationFrame    || 
        window.oRequestAnimationFrame      || 
        window.msRequestAnimationFrame     || 
        function(/* function */ callback){
            window.setTimeout(callback, 1000 / 60);
        }
    );
}();

returnjavascriptは、ステートメントの後ろにセミコロンを自動的に配置します。これは、改行が続き、次の行が有効な式であるためです。実際、次のように翻訳されます。

return;
window.requestAnimationFrame       || 
window.webkitRequestAnimationFrame || 
window.mozRequestAnimationFrame    || 
window.oRequestAnimationFrame      || 
window.msRequestAnimationFrame     || 
function(/* function */ callback){
    window.setTimeout(callback, 1000 / 60);
};

このコードはundefinedreturnを返し、returnステートメントの背後にあるコードを実行することはありません。です。window.requestAnimFrame_ undefinedで呼び出すとanimloop、javascriptはエラーを生成し、実行を停止します。式を括弧で囲むことにより、問題を解決できます。

JavaScriptの実行を検査するためにChrome開発者ツールまたはfirebugをお勧めします。これらのツールを使用すると、エラーが発生します。次のようにデバッグする必要があります(Chromeを想定しています)。

  1. コードを実行します(予期しない結果が発生します)
  2. 開発ツールを開きます(右クリック->要素の検査)右側のステータスバーに赤いxが表示されます(これは実行にエラーがあることを意味します)
  3. コンソールタブを開きます
  4. あなたが見るでしょう
    Uncaught TypeError:オブジェクト[オブジェクトDOMWindow]のプロパティ'requestAnimFrame'は関数ではありません
  5. コンソールに次のwindow.requestAnimFrameように入力します。Enterキーを押すと、が表示されますundefinedrequestAnimationFrameこれで、問題は実際には無関係であり、コードの最初の部分に集中する必要があることがわかりました。
  6. 今では、何かを返すところまでコードを絞り込む必要があります。これは難しい部分であり、この時点でまだ見つからない場合は、インターネットを利用してさらにサポートを受けることをお勧めします。

また、JavaScriptを書く際のいくつかの良い習慣については、このビデオをご覧ください。彼はまた、邪悪な自動セミコロン挿入についても言及しています。

于 2011-04-09T15:02:52.543 に答える
8
 /*
  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/

お役に立てれば!

于 2013-08-06T01:39:15.180 に答える
0

「スマートスロットリングにより、画面が変更を再描画できる回数を超えてイベントが発生することはありません。

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);
};
html, body{ height:300%; }
body::before{ content:'scroll here'; position:fixed; font:2em Arial; }

于 2014-03-17T20:49:40.413 に答える