2011-04-09 7 views
48

저는 애니메이션을 처음 접했지만 최근에 setTimeout을 사용하여 애니메이션을 만들었습니다. FPS가 너무 낮았으므로이 link에 설명 된 requestAnimationFrame을 사용하는 해결책을 찾았습니다.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); 
    })(); 

. chopElement 함수에 requestAnimFrame(animloop); 콜백 함수가 있습니다.

또한이 API를 사용하는 데 대한 자세한 지침이 있습니까?

+3

이 질문이있다 – Jan

+3

일반적으로 JS 반환 값에주의를 기울여야한다. 반환 후 개행을 제거하면이 값이 작동한다. –

답변

76

경고! 이 질문은 최선의 방법이 아닙니다.requestAnimFrame. 당신이 그것을 찾고 있다면,이 페이지에서 다른 대답으로 이동하십시오.


당신은 자동 세미콜론 삽입의 속임수를 받았습니다. 이것을 시도하십시오 :

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

자바 스크립트는 자동으로 return 문 뒤에 세미콜론을 넣습니다. 이것은 newline이 나오고 다음 줄이 유효한 표현식이기 때문에이 작업을 수행합니다.

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

이 코드는 return 문 뒤에있는 코드를 실행 결코 undefined 반환되지 않으며 :에 사실 그것은 번역됩니다. 따라서 window.requestAnimFrameundefined입니다. animloop에서 호출하면 javascript에서 오류가 발생하고 실행이 중지됩니다. 표현식을 괄호로 묶어 문제를 해결할 수 있습니다.

Chrome 개발자 도구 또는 방화 광을 사용하여 자바 스크립트 실행을 검사하는 것이 좋습니다. 이러한 도구를 사용하면 오류를 보았을 것입니다. 당신은 (내가 크롬을 믿고있어) 다음과 같이 디버깅 가야한다 :

  1. 코드를 실행
  2. 열기 개발자 도구 (예기치 않은 결과를) (오른쪽 클릭 -> 요소 검사) 당신은 볼 것이다 window.requestAnimFrame를 누르십시오, 당신은 것입니다 입력 : 오른쪽에있는 상태 표시 줄에 빨간색 x 당신은 콘솔에서
    Uncaught TypeError: Property 'requestAnimFrame' of object [object DOMWindow] is not a function
  3. 유형을 볼 수
  4. 열기 콘솔 탭 (이 실행에 오류가 있음을 의미) 그것을 보시려면입니다.3210. 지금까지이 문제는 실제로 requestAnimationFrame과 관련이 없으며 코드의 첫 부분에 집중해야한다는 것을 알고 있습니다.
  5. 이제 코드를 반환하는 부분까지 코드를 좁히는 문제가 있습니다. 이것은 어려운 부분이며 여전히이 지점에서 찾지 못하면 더 많은 도움을 얻기 위해 인터넷을 이용할 수 있습니다.

this video 또한 자바 스크립트 작성에 대한 우수 사례를 살펴보고 악의 자동 세미콜론 삽입에 대해서도 언급합니다.

+3

잘 알고 계시다면, 까다로울 것입니다. – pimvdb

+0

이 메서드는'scroll '또는'resize'를 지원하지 않는 브라우저에서는' nimationFrame'은 setTimeout이 끊임없이 발생하여 새로운 타이머를 생성하고 차례대로 실행하기 때문에 콜백을 항상 의도 한 것과 달리 실행하지 않습니다. 스로틀 방식이 보정에 더 적합합니다. 또한 모든 전역 앞에'window'를 쓸 필요가 없습니다. 중복됩니다. – vsync

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/

희망! 이벤트가 화면에 변화를 칠 수있는 것보다 더 많은 시간을 해고되지 않도록

+1

animate() 내부에서 잘못된 함수 이름을 사용하고 있습니다. Paul은 그의 예제에서 requestAnimFrame을 실제로 사용하지만 requestAnimationFrame을 shimming하고 있습니다 (어느 것이 더 좋을까요?). 쉽게 고칠 수 있습니다. – Micros

+0

의견을 보내 주셔서 감사합니다. Micros! 나는 그것을 편집했다. 나는 주로 네가 좋아하는 것처럼 긴 명명 함수를 사용하는 것을 선호한다. 나는 그 습관이 obj-c 언어를 사용하여 나에게 왔다고 생각한다. :) –

0

"스마트 조절 : 왜 당신이 'JQuery와'로이 태그 않았다

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; }

+0

FPS가 아마 60/60으로 1000/60이어야한다. – Ampersanda

+0

@Ampersanda - 고마워, 내 실수. 이제 고정 된 – vsync

+0

Sweet, 안녕하세요 vsync 또는 requestAnimationFrame을 사용하여 스크롤 페이지를 여유롭게하는 방법에 대해 알고 계십니까? – Ampersanda

관련 문제