CSS 애니메이션은 @keyframes과 animation 속성을 사용해 요소의 상태를 점진적으로 변경하는 방식
애니메이션 속성
animation-name: 애니메이션 이름 animation-duration: 실행 시간 animation-timing-function: 속도 곡선 (ease, linear, ease-in-out 등) animation-delay: 시작 시간 지연 animation-iteration-count: 반복 횟수 (infinite 가능) animation-direction: normal, reverse, alternate 등 animation-fill-mode: 애니메이션 전후 상태 (forwards, backwards) @keyframes
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
트랜지션 (transition)
.box {
transition: all 0.5s ease-in-out;
}
CSS vs JavaScript 애니메이션 차이
requestAnimationFrame 활용) 성능 최적화
transform과 opacity를 사용하면 GPU 가속 적용 left, top 대신 translate 사용 (paint를 최소화) will-change: transform;으로 브라우저에 최적화 힌트 제공 애니메이션 속도 곡선 이해
ease: 느려졌다 빨라짐 ease-in: 천천히 시작 ease-out: 천천히 끝남 ease-in-out: 천천히 시작하고 끝남 cubic-bezier(n, n, n, n): 커스텀 곡선 지정 가능 컴포지팅 최적화 (transform & opacity 활용)
.box {
transform: translate3d(0, 0, 0); /* GPU 가속 유도 */
will-change: transform, opacity;
}
렌더링 단계 고려
layout → paint → composite 순서 layout을 유발하는 width, height 변화는 최소화 paint를 줄이기 위해 복잡한 박스 쉐도우나 배경 제거 CSS 변수 (--var) 활용
:root {
--duration: 0.5s;
}
.box {
animation: fadeIn var(--duration) ease-in-out;
}
opacity & transform 사용 → composite 단계에서 처리 가능 width, height, margin) 피하기 브라우저가 애니메이션을 렌더링할 때 레이아웃(Layout) → 페인트(Paint) → 합성(Compositing) 순서로 진행1️⃣ transform과 opacity를 활용하면 성능이 좋아진다
2️⃣ top, left 대신 translate()를 사용하자
3️⃣ animation-timing-function을 적절히 조절하면 더 자연스럽다