CSS 애니메이션 vs JavaScript 애니메이션
작성일 : 2025.01.13
개요
웹 애니메이션을 구현하는 방법은 크게 CSS와 JavaScript 두 가지가 있습니다. 각각의 특징과 장단점을 자세히 살펴보면서, 어떤 상황에서 어떤 방식을 선택해야 할지 알아보겠습니다.
CSS 애니메이션의 특징
1. 성능
CSS 애니메이션은 브라우저의 메인 스레드가 아닌 컴포지터 스레드에서 실행됩니다. 이는 다음과 같은 이점을 제공합니다:
- 메인 스레드의 JavaScript 실행이나 레이아웃 계산에 영향을 받지 않음
- GPU 가속을 자동으로 활용할 수 있어 하드웨어 가속의 이점을 얻기 쉬움
- 부드러운 60fps 애니메이션 구현이 용이함
2. 구현 방식
CSS 애니메이션은 두 가지 방식으로 구현할 수 있습니다:
/* 1. @keyframes를 사용한 애니메이션 */
@keyframes slide {
from {
transform: translateX(0);
}
to {
transform: translateX(100px);
}
}
.sliding-element {
animation: slide 2s ease-in-out infinite;
}
/* 2. transition을 사용한 간단한 상태 변화 */
.button {
transition: all 0.3s ease;
}
.button:hover {
transform: scale(1.1);
}
3. CSS 애니메이션의 장점
- 간단한 구현: 복잡한 JavaScript 코드 없이도 구현 가능
- 선언적 정의: 애니메이션의 시작과 끝 상태를 명확하게 정의
- 성능 최적화: 브라우저가 자동으로 최적화를 수행
- 부드러운 실행: 60fps를 쉽게 달성할 수 있음
4. CSS 애니메이션의 단점
- 복잡한 제어의 한계: 동적인 변화나 조건부 실행이 제한적
- 세밀한 제어의 어려움: 중간에 애니메이션을 멈추거나 변경하기 어려움
- 지원하는 속성의 제한: 모든 CSS 속성이 애니메이션 가능한 것은 아님
JavaScript 애니메이션의 특징
1. 구현 방식
JavaScript 애니메이션은 여러 가지 방식으로 구현할 수 있습니다:
// 1. requestAnimationFrame 사용
function animate(element) {
let start = null;
function step(timestamp) {
if (!start) start = timestamp;
const progress = timestamp - start;
element.style.transform = `translateX(${Math.min(progress/10, 200)}px)`;
if (progress < 2000) {
requestAnimationFrame(step);
}
}
requestAnimationFrame(step);
}
// 2. Web Animation API 사용
element.animate([
{ transform: 'translateX(0px)' },
{ transform: 'translateX(100px)' }
], {
duration: 1000,
easing: 'ease-in-out',
iterations: Infinity
});
2. JavaScript 애니메이션의 장점
- 세밀한 제어: 프레임별로 정확한 제어가 가능
- 복잡한 애니메이션 구현: 수학적 계산이나 물리 기반 애니메이션 구현 가능
- 동적인 변경: 사용자 입력이나 조건에 따른 실시간 변경 용이
- 중간 제어: 일시 정지, 재생, 중단, 되감기 등 다양한 제어 가능
3. JavaScript 애니메이션의 단점
- 성능 부담: 메인 스레드에서 실행되어 다른 JavaScript 작업에 영향을 줄 수 있음
- 구현 복잡도: 상대적으로 더 많은 코드가 필요
- 최적화 필요: 성능 최적화를 위한 추가적인 작업 필요
어떤 상황에서 무엇을 선택해야 할까?
CSS 애니메이션이 적합한 경우:
- 간단한 상태 전환 (호버, 포커스 등)
- 시작과 끝이 명확한 애니메이션
- 성능이 중요한 모바일 환경
- 자동으로 실행되는 반복 애니메이션
/* 예: 버튼 호버 효과 */
.button {
transition: transform 0.3s ease;
}
.button:hover {
transform: scale(1.1);
}
JavaScript 애니메이션이 적합한 경우:
- 복잡한 게임이나 인터랙티브 애니메이션
- 사용자 입력에 따른 동적 애니메이션
- 물리 기반 모션이 필요한 경우
- 애니메이션 중간 제어가 필요한 경우
// 예: 물리 기반 바운스 효과
function bounce(element) {
let velocity = 0;
let position = 0;
const gravity = 0.8;
const damping = 0.9;
function animate() {
velocity += gravity;
position += velocity;
if (position > 500) {
position = 500;
velocity = -velocity * damping;
}
element.style.transform = `translateY(${position}px)`;
requestAnimationFrame(animate);
}
animate();
}
결론
애니메이션 구현 방식의 선택은 프로젝트의 요구사항과 상황에 따라 달라져야 합니다. 간단한 전환 효과는 CSS로, 복잡한 인터랙션은 JavaScript로 구현하는 것이 일반적인 접근 방식입니다. 때로는 두 방식을 조합하여 사용하는 것도 좋은 선택이 될 수 있습니다.
성능과 사용자 경험을 최우선으로 고려하면서, 각 기술의 장단점을 잘 파악하고 적절히 활용하는 것이 중요합니다.