CSS 애니메이션 vs JS 애니메이션
CSS 애니메이션과 JavaScript 애니메이션은 모두 웹 애플리케이션에서 요소의 움직임과 변화를 구현하는 방법이다. 다만 구현 방식과 특징에서 차이가 있다.
CSS 애니메이션
- 선언적인 방식: HTML 요소의 클래스에 특정한 CSS 규칙을 추가하여 정의. 미리 만들어진 클래스에 의해 애니메이션 동작이 트리거
- 퍼포먼스: 브라우저의 GPU 가속을 활용하여 부드럽고 효율적인 애니메이션 구현
- 단순한 애니메이션: 기본적인 애니메이션 효과나 트랜지션을 구현하기에 적합
- 키 프레임:
@keyframes
규칙을 사용하여 애니메이션의 시작과 끝 상태를 정의 - 자동 재생: HTML 요소에 클래스를 추가하는 것만으로 자동으로 실행
예시
<div class="box"></div>
.box {
width: 100px;
height: 100px;
background-color: blue;
transition: width 1s ease-in-out;
}
.box:hover {
width: 200px;
}
JavaScript 애니메이션
- 명령적인 방식: 코드 내에서 요소의 스타일 속성을 직접 변경하여 구현. 일반적으로 requestAnimationFrame을 사용하여 애니메이션 프레임을 조작
- 더욱 유연한 제어: JavaScript를 사용하면 더 복잡하고 동적인 애니메이션 구현 가능.
- 복잡한 애니메이션: 더 많은 로직이 필요한 애니메이션, 예를 들어 요소 간의 상호작용이 필요한 경우 JavaScript 애니메이션 사용
- 타이밍 제어: 시작, 일시 정지, 중지 등을 직접 제어
- 자동 재생 관리: JavaScript로 애니메이션을 만들 경우, 자동 재생을 직접 관리해야 한다.
예시
<div class="box"></div>
<button id="animateButton">Animate</button>
.box {
width: 100px;
height: 100px;
background-color: blue;
}
const box = document.querySelector('.box')
const animateButton = document.getElementById('animateButton')
animateButton.addEventListener('click', () => {
let width = 100
const targetWidth = 200
const animationDuration = 1000
const frameRate = 60
const increment =
(targetWidth - width) / (animationDuration / (1000 / frameRate))
const animate = () => {
if (width <= targetWidth) {
box.style.width = width + 'px'
width += increment
requestAnimationFrame(animate)
}
}
animate()
})
비교
- 간단한 트랜지션 또는 애니메이션의 경우 CSS 애니메이션 추천
- 복잡한 동작을 구현하거나 사용자 입력에 따라 동적으로 변하는 애니메이션을 만들어야 한다면 JavaScript 애니메이션 추천
- 두 방법을 혼합하여 사용하는 것도 가능. 예를 들어, CSS로 기본적인 트랜지션을 구현하고 JavaScript로 동적인 상호작용을 추가할 수 있다.