대부분의 UI 애니메이션은 CSS transition과 keyframe만으로 충분해. 기본기를 알면 라이브러리가 정말 필요한 순간도 더 잘 보여.
상태 사이 변화에는 transition을 써
Hover, focus, 열림과 닫힘처럼 시작과 끝이 분명한 변화는 CSS transition으로 표현해. Tailwind의 transition-colors, duration-200, ease-in-out 같은 유틸리티를 조합할 수 있어.
반복되거나 여러 단계인 동작에는 keyframe을 써
Spinner, pulse, bounce처럼 중간 단계가 있거나 반복되는 움직임은 @keyframes가 잘 맞아. Tailwind에는 animate-spin과 animate-pulse 같은 기본 유틸리티가 있고 직접 만든 keyframe도 연결할 수 있어.
복잡한 상호작용에만 전용 도구를 검토해
드래그, 레이아웃 이동, 여러 엘리먼트의 순차 실행, 제스처가 필요하면 Web Animations API나 Motion 라이브러리가 도움이 돼. 단순한 색상과 위치 변화라면 CSS가 더 작고 예측하기 쉬워.
움직임을 줄이는 사용자 설정을 존중해
prefers-reduced-motion이 켜졌을 때 큰 이동과 반복 애니메이션을 끄거나 짧게 줄여. 접근성 설정은 선택 기능이 아니라 기본 계약이야.
Tailwind의 기본 애니메이션 도구
transition, duration-200, ease-in-out으로 상태 변화를 조절할 수 있어. animate-spin, animate-pulse, animate-bounce, animate-ping은 자주 쓰는 keyframe을 바로 제공해.
레이아웃 변화에는 더 신중해
목록의 위치가 바뀌는 FLIP 애니메이션, route 사이의 shared element, drag gesture처럼 여러 프레임의 측정과 조정이 필요하면 Motion 라이브러리가 도움이 돼. 단순 hover와 열림 효과까지 라이브러리에 맡길 필요는 없어.
전환이 끝난 뒤에도 상태가 분명해야 해
Opacity만 낮춰 버튼이 사라진 것처럼 보이게 하지 말고 disabled와 focus 계약을 함께 유지해. Reduced motion에서 움직임을 없애더라도 성공·오류·선택 상태는 색과 텍스트, 아이콘으로 이해할 수 있어야 해.
Transform과 opacity는 대체로 compositor에서 처리하기 쉬워. Width와 height, top과 left를 매 프레임 바꾸면 layout과 paint가 반복될 수 있으므로 Profiler와 브라우저 Performance 도구로 실제 비용을 확인해.