frontend/css

7. ✨ CSS 애니메이션과 트랜지션 완벽 가이드 — 살아있는 웹 만들기

mirabo01 2025. 11. 5. 21:02

웹사이트가 단순히 ‘보여주는 공간’이 아니라
‘사용자와 상호작용하는 공간’으로 바뀌는 핵심 기술이 바로 CSS 애니메이션이다.

이번 글에서는 트랜지션(transition)애니메이션(animation) 의 차이부터
버튼 호버 효과, 로딩 스피너, 페이드인 효과 등
실무에서 자주 쓰이는 예제 중심으로 완벽 정리했다.


💡 1. 트랜지션(transition) vs 애니메이션(animation)

구분 트랜지션 애니메이션

정의 상태 변화에 따른 자연스러운 전환 시간에 따라 반복적으로 변하는 동작
트리거 이벤트 발생 시 (hover, focus 등) 자동 또는 반복 실행 가능
선언 방식 transition: 속성 시간; @keyframes 정의 후 animation으로 적용
예시 버튼에 마우스를 올리면 색 변경 로딩 아이콘 회전

✅ 요약:

  • 트랜지션은 상태 변화 시점에 작동
  • 애니메이션은 시간 기반 제어

🧱 2. transition 기본 문법

transition: [속성] [지속시간] [타이밍함수] [지연시간]; 

예시 👇

button { 
  background: royalblue; 
  transition: background 0.3s ease; 
} 
 
button:hover { 
  background: dodgerblue; 
} 

✅ 마우스를 올리면 배경색이 부드럽게 변한다.


🧩 자주 쓰는 transition 속성

속성 설명 예시

transition-property 전환할 속성 color, background, transform
transition-duration 지속 시간 0.3s, 1s
transition-timing-function 속도 곡선 ease, linear, ease-in, ease-out
transition-delay 지연 시간 0.2s

💬 여러 속성을 동시에 전환하고 싶다면 👇

transition: all 0.5s ease; 

하지만 성능상 필요한 속성만 지정하는 것이 좋다.


🎯 3. 타이밍 함수 이해하기

함수 설명 움직임

linear 일정한 속도
ease 느리게 시작 → 빠르게 → 느리게 끝 🌀
ease-in 천천히 시작 🐢
ease-out 천천히 끝남 🦋
ease-in-out 느리게 시작 + 느리게 끝 ⚙️
.box { 
  transition: transform 0.5s ease-in-out; 
} 

✅ 자연스러운 UX의 핵심은 적절한 타이밍 함수 선택이다.


🧩 4. transform과 transition의 궁합

transform은 트랜지션과 함께 가장 자주 쓰이는 속성이다.

.card { 
  transition: transform 0.4s ease, box-shadow 0.3s; 
} 
.card:hover { 
  transform: translateY(-8px) scale(1.05); 
  box-shadow: 0 10px 20px rgba(0,0,0,0.15); 
} 

✅ 호버 시 위로 살짝 떠오르며 그림자가 생김
✅ 클릭 유도 효과에 자주 사용됨


⚙️ 5. 애니메이션(animation) 기본 문법

@keyframes 이름 { 
  0% { ...시작 상태... } 
  100% { ...끝 상태... } 
} 
 
.box { 
  animation: 이름 지속시간 타이밍함수 반복여부; 
} 

예시 👇

@keyframes fadeIn { 
  from { opacity: 0; } 
  to { opacity: 1; } 
} 
 
.box { 
  animation: fadeIn 1.5s ease-in; 
} 

✅ 페이지 로드 시 자동으로 부드럽게 등장하는 효과.


🧱 6. 자주 쓰는 animation 속성

속성 설명 예시

animation-name keyframes 이름 fadeIn
animation-duration 지속시간 2s
animation-timing-function 속도 곡선 ease-in-out
animation-delay 지연시간 1s
animation-iteration-count 반복 횟수 infinite, 3
animation-direction 방향 normal, reverse, alternate
animation-fill-mode 종료 후 상태 유지 forwards

예시 👇

.loading { 
  animation: spin 1s linear infinite; 
} 

🎨 7. 실전 예제 — 로딩 스피너 만들기

<div class="spinner"></div> 
.spinner { 
  width: 40px; 
  height: 40px; 
  border: 5px solid #eee; 
  border-top-color: royalblue; 
  border-radius: 50%; 
  animation: spin 1s linear infinite; 
} 
 
@keyframes spin { 
  0% { transform: rotate(0deg); } 
  100% { transform: rotate(360deg); } 
} 

✅ 결과: 부드럽게 회전하는 로딩 아이콘 완성.
✅ 자바스크립트 없이 순수 CSS만으로 구현 가능.


🧩 8. 애니메이션 반복 및 방향 제어

.box { 
  animation: bounce 1s ease infinite alternate; 
} 
 
@keyframes bounce { 
  0% { transform: translateY(0); } 
  100% { transform: translateY(-30px); } 
} 

✅ infinite → 무한 반복
✅ alternate → 왕복 애니메이션 (위→아래 반복)


⚡ 9. 애니메이션 중첩 (다중 효과)

@keyframes move { 
  0% { transform: translateX(0); } 
  50% { transform: translateX(100px) rotate(10deg); } 
  100% { transform: translateX(0); } 
} 
 
@keyframes colorChange { 
  0% { background: royalblue; } 
  50% { background: orange; } 
  100% { background: royalblue; } 
} 
 
.box { 
  animation: move 2s ease-in-out infinite, colorChange 3s linear infinite; 
} 

✅ 여러 애니메이션을 콤마로 구분해 동시에 실행 가능.


🧠 10. 애니메이션 성능 최적화 팁

1️⃣ transform과 opacity 중심으로 구현 → GPU 가속 가능
2️⃣ left, top, width 등 레이아웃에 영향 주는 속성은 피하기
3️⃣ 애니메이션이 많은 페이지는 will-change 속성 활용 👇

.box { 
  will-change: transform, opacity; 
} 

✅ 브라우저가 미리 렌더링을 준비하여 부드러운 애니메이션 유지


🎯 11. 실무 예제 — 페이드인 & 슬라이드 인트로 효과

.fade-slide { 
  opacity: 0; 
  transform: translateY(20px); 
  animation: fadeSlide 0.8s ease forwards; 
} 
 
@keyframes fadeSlide { 
  to { 
    opacity: 1; 
    transform: translateY(0); 
  } 
} 

✅ 페이지가 로드되면서 자연스럽게 위로 올라오며 등장
✅ 랜딩 페이지, 카드, 배너 등에서 자주 사용됨


🧩 12. 애니메이션 지연 실행

.card { 
  animation: fadeIn 1s ease forwards; 
} 
.card:nth-child(2) { 
  animation-delay: 0.2s; 
} 
.card:nth-child(3) { 
  animation-delay: 0.4s; 
} 

✅ 순차적으로 등장하는 카드형 인터랙션 구현 가능.
💡 “0.2초 딜레이”는 시각적으로 매우 자연스럽게 보인다.


⚙️ 13. 트랜지션과 애니메이션의 조합

.button { 
  background: royalblue; 
  transition: background 0.3s ease, transform 0.2s; 
} 
.button:hover { 
  background: dodgerblue; 
  transform: translateY(-3px); 
} 

💬 마우스 오버 시 부드러운 색 전환 + 살짝 떠오르는 느낌.
트랜지션과 애니메이션을 적절히 조합하면 완성도 높은 인터랙션을 만들 수 있다.


🏁 14. 마무리 — “작은 움직임이 큰 인상을 만든다”

웹 인터랙션은 단순한 ‘움직임’이 아니라,
사용자 경험(UX)을 강화하는 감각적인 표현이다.

💬 “움직임이 목적이 아니라, 의미를 만들어야 한다.”

다음 편에서는
8. CSS 변수(Variables)와 다크모드(Dark Mode) 구현하기
를 통해, 재사용성과 사용자 맞춤 디자인을 동시에 달성하는 현대적인 CSS 기법을 다뤄보자.