웹사이트가 단순히 ‘보여주는 공간’이 아니라
‘사용자와 상호작용하는 공간’으로 바뀌는 핵심 기술이 바로 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 기법을 다뤄보자.
'frontend > css' 카테고리의 다른 글
| 9. 🧊 CSS 반투명 효과와 블러 처리(Glassmorphism) 디자인 구현하기 (0) | 2025.11.05 |
|---|---|
| 8. 🌗 CSS 변수(Variables)와 다크모드(Dark Mode) 구현하기 (0) | 2025.11.05 |
| 6. 📱 반응형 웹 디자인 완벽 가이드 — 미디어쿼리부터 실전 예제까지 (0) | 2025.11.05 |
| 5. 🧱 CSS Grid로 레이아웃 설계하기 — 2차원 배치의 끝판왕 (0) | 2025.11.05 |
| 4. 🧭 Flexbox 완전 이해하기 — 가로·세로 정렬 스트레스 탈출 (0) | 2025.11.05 |