애니메이션 효과를 주고 싶을 때, CSS의 transition
/ animation
속성이나 JS의 setInterval()
/ requestAnimationFrame()
을 사용할 수 있다. 하지만 각각 특징이 다르고 장단점이 있기 때문에 어떤 차이가 있는지 알아두는 것이 좋다. 또한, 특정 애니메이션은 성능 문제를 일으킬 수 있기 때문에 주의해서 사용해야한다.
2번은 브라우저 렌더링 과정에서 reflow를 발생시키기 때문에 뚝뚝 끊기는 느낌을 받게 된다. 따라서 레이아웃을 변경하는 경우에는 CSS 애니메이션을 사용하는 것을 브라우저 최적화를 위해 권장한다.
(*reflow: 이벤트에 의해 DOM 요소의 크기나 위치를 변경하면 해당 노드의 하위 노드와 상위 노드들을 포함하여 Layout 단계를 다시 수행하는 것)
CSS로 처리하기에는 복잡하고 무거운 작업들을 세밀하게 다루기 위해 사용한다. 바닐라 자바스크립트로 구현할 경우 위에서 살펴본 바와 같이 계속해서 요소의 위치를 재계산하기 때문에 비효율적이고 사용자 눈에 가장 부드러운 60fps가 유지되지 않는다. 이때문에 RAF(RequestAnimationFrame) API가 등장했고 구현방식은 동일하지만 60fps를 보장할 수 있게 되었다.
transition
/ animation
속성보다 뛰어나다.CSS: 컴포지터 스레드에서 작업 수행 (transition, opacity 등)
JS: 메인 스레드에서 수행 (스타일 지정, 레이아웃 변경, 페인트 등 cost 큰 작업)
두 스레드는 다른 스레드이다. 따라서 메인스레드에서 cost 높은 작업들을 처리해도 컴포지터 스레드에서 계속 수행할 수 있다.