Как использовать requestAnimationFrame?
Я новичок в анимации, но недавно создал анимацию с помощью 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);
на
3 ответов
предупреждение! Этот вопрос не о лучшем способе shim requestAnimFrame
. Если вы ищете это, перейдите к любому другому ответу на этой странице.
вас обманула автоматическая вставка точки с запятой. Попробуйте это:
window.requestAnimFrame = function(){
return (
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback){
window.setTimeout(callback, 1000 / 60);
}
);
}();
javascript автоматически ставит точку с запятой позади вашего return
заявление. Он делает это, потому что за ним следует новая строка, а следующая строка является допустимым выражением. На самом деле это переводится кому:
return;
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback){
window.setTimeout(callback, 1000 / 60);
};
этот код возвращает undefined
и никогда не выполняет код позади оператора return. Так что window.requestAnimFrame
is undefined
. Когда вы вызываете его animloop
, javascript выдает ошибку и останавливает выполнение. Проблему можно решить, заключив выражение в круглые скобки.
могу ли я рекомендовать инструменты разработчика Chrome или firebug для проверки выполнения javascript. С помощью этих инструментов вы бы увидели ошибку. Вы должны пойти об отладке следующим образом (я предполагая хром):
- выполнить код (он дает неожиданные результаты)
- откройте инструменты разработчика (щелкните правой кнопкой мыши - > проверить элемент) Вы увидите красный x в строке состояния справа (это означает, что есть ошибка в выполнении)
- откройте вкладку консоли
- вы увидите
Uncaught TypeError: свойство 'requestAnimFrame' объекта [object DOMWindow] не является функцией
- введите в консоли:
window.requestAnimFrame
и нажмите enter, вы увидите, что этоundefined
. Теперь вы знаете, что проблема на самом деле не связана сrequestAnimationFrame
и что вы должны сосредоточиться на первой части вашего кода. - теперь речь идет о сужении кода до точки, где он что-то возвращает. Это сложная часть, и если вы все еще не нашли ее на данный момент, Вы можете обратиться к интернету за дополнительной помощью.
кроме того,видео для некоторых хорошая практика в написании 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/
надеюсь, что это помогает!
" умное дросселирование, чтобы событие не было уволено больше раз, чем экран может перекрасить изменение:
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; }