FrontEnd/JavaScript

requestAnimationFrame에 대해 알아보기

박창준 2025. 3. 18. 14:00

 

requsetAnimationFrame이란?

 

requestAnimationFrame()은 브라우저에서 애니메이션을 최적화하여 실행할 수 있도록 제공하는 JavaScript API이다.
주로 CSS 애니메이션이나 setTimeout(), setInterval()을 사용하는 것 보다 성능이 뛰어나기 때문에 웹 애니메이션을 구현할 때 많이 사용된다.

 

requestAnimationFrame()의 목적은 애니메이션을 위한 프레임 렌더링을 브라우저의 화면 갱신속도(리페인팅)에 맞추는 것이다.

이 API를 사용하면 브라우저의 리프레시 속도(초당 60프레임, 60FPS)를 고려하는데 이 갱신 주기를 맞추어 콜백을 실행해 부드럽고 효율적인 애니메이션을 만들 수 있다.

 

이를 통해 브라우저가 최적의 시점에 프레임을 렌더링하도록 보장하여 부드러운 사용자 경험을 제공하고, 불필요한 연산을 줄일 수 있다.

 

사용 예시는 아래와 같다.

const animate = () => {
  /* 애니메이션을 위한 동작 */

  if (일정시간이지나면) {
    return;
  }
  
  requestAnimationFrame(animate)
}

requestAnimationFrame(animate)

 

물론 setTimeout()이나 setInterval()과 같은 함수로 애니메이션을 실행할 수 있지만, 브라우저의 화면 갱신주기와 맞지 않는 경우가 발생한다. 이로인해 프레임 드랍및 애니메이션 끊김현상이 발생할 수 있다. 반면, requestAnimationFrame()은 화면 갱신주기에 맞춰 실행되기 때문에 프레임 드랍이나 애니메이션 끊김현상 없이 매끄럽게 보여지고, 성능 측면에서도 좋다.

 

requestAnimation()의 또 다른 장점

이외에도, 디스플레이 주사율에 맞춰서 콜백의 실행주기가 동적으로 조정된다. 60Hz, 120Hz, 144Hz등 디스플레이 주사율에 맞게 최적의 타이밍을 찾아 실행된다.

 

또한 setTimeout(), setInterval()과 달리 비활성화 탭(백그라운드)에서 실행되지 않아 CPU 자원을 절약할 수 있다.

 

cancelAnimationFrame으로 애니메이션 중지

requestAnimation()은 정수형 id값을 반환한다.

animationId에 requsetAnimation()의 반환값을 저장해놓고 cancelAnimation(animationId)로 인자값을 넣어주면 해당 함수는 중지된다.

 

let animationId;

function startAnimation() {
  let position = 0;
  let box = document.getElementById("box");

  function step() {
    position += 5;
    box.style.transform = `translateX(${position}px)`;

    if (position < 500) {
      animationId = requestAnimationFrame(step);
    }
  }

  animationId = requestAnimationFrame(step);
}

function stopAnimation() {
  cancelAnimationFrame(animationId);
}