requestAnimationFrame 활용
2020-06-20
해당 Post는 requestAnimationFrame 활용을 정리한 파일입니다.
setTimeout이나 setInterval을 사용해서 연속적인 함수 호출로 애니메이션을 구현하는 방법은 약간의 delay가 발생하는 문제가 있다.
이 함수들은 애니메이션을 위해 생겨난 기능은 아니다.
애니메이션 구현을 위해서는 끊임없이 부드럽게 처리가 돼야하는데, 다행히도 이를 위한 메서드를 브라우저가 제공하고 있다.
requestAnimaionFrame
- setTimeout은 animation을 위한 최적화된 기능이라고 보기는 어렵다.
animation 주기를 16.6 미만으로 하는 경우 불필요한 frame 생성이 되는 등의 문제가 생긴다.
그 대안으로 생긴 것이 바로 애니메이션을 위한 전용 함수, requestAnimationFrame이다.
- 먼저 아래처럼 requestAnimationFrame을 한번 실행시켜준 후,
특정 조건이 될 때까지(함수의 탈출 조건) 계속 함수를 연속적으로 호출하는 것이다.
이렇게 requestAnimationFrame 함수를 통해 원하는 함수를 인자로 넣어주면,
브라우저는 인자로 받은 그 비동기 함수가 실행될 가장 적절한 타이밍에 실행시켜준다.
<!-- html 코드 -->
<html>
<header>
<style>
.outside {
position: realative;
background-color: blueviloet;
width: 100px;
font-size: 0.8em;
color: #fff;
}
</style>
</header>
<body>
<div class="outside">제가 좋아하는 과일은요..</div>
</body>
</html>
//requestAnimationFrame()
var count = 0;
var el = document.querySelector(".outside");
el.style.left = "0px";
function run() {
if (count > 70) return;
count = count + 1;
el.style.left = parseInt(el.style.left) + count + "px";
requestAnimationFrame(run);
}
requestAnimationFrame(run);
예제에서는 연속적으로 requestAnimationFrame을 통해서 run 함수를 호출하면서 left 값을 증가시켜주고 있다.
(횟수로 70회까지 테스트하는 코드이다.)
canvas, svg를 사용하면서 그래픽 작업을 하게 될 때 복잡한 애니메이션을 다룰 필요가 생길 수 있다.
JavaScript로 복잡한 애니메이션을 처리해야 할 때 requestAnimationFrame은 꽤 유용하게 쓰일 수 있다.