η‘μ
CSSμ Animationκ³Ό @keyframes λ³Έλ¬Έ
π’ animation
μμμ μ€νμΌμ μκ°μ λ°λΌ λ€μν ν¨κ³Ό λ° λ³νμν€λ κΈ°λ₯.
βΌ @keyframes (μ λλ©μ΄μ μ μ€κ³λ)
μ λλ©μ΄μ μ μκ°μ νλ¦μ λ°λ₯Έ μ€νμΌ λ³ν λ¨κ³λ₯Ό μ μ.
@keyframes μ λλ©μ΄μ
μ΄λ¦ {
from { /* μν */ }
to { /* μν */ }
}
@keyframes μ λλ©μ΄μ
μ΄λ¦ {
0% { /* μμ μν */ }
50% { /* μ€κ° μν */ }
100% { /* λ μν */ }
}
- from (μμ) → 0%, to (λ) → 100%.
- μ€κ° λ¨κ³(μ: 25%, 50%, 75%) μ μ κ°λ₯.
π― μ£Όμ μμ± π―
πΉ animation-name: μ΄λ¦.
- @keyframesμμ μ μν μ΄λ¦.
πΉ animation-duration: μλ£λλλ° κ±Έλ¦¬λ μκ°.
- μ: 2s, 500ms.
πΉ animation-timing-function: μλ λ³ν λ°©μ.
- μ: linear, ease, ease-in-out
πΉ animation-delay: μμ μ λκΈ° μκ°.
- μ: 2s, 500ms.
πΉ animation-iteration-count: λ°λ³΅ νμ μ§μ .
- μ«μ λλ infinite(무ν)
πΉ animation-direction: μ§ν λ°©ν₯ μ§μ .
- normal: μ λ°©ν₯.
- reverse: μλ°©ν₯.
- alternate: μ λ°©ν₯ → μλ°©ν₯ λ°λ³΅.
πΉ animation-fill-mode: μ λλ©μ΄μ ν μν.
- forwards: λ μν μ μ§.
- backwards: μμ μν μ μ§.
- both: λ λ€ μ μ§.
π§Ώ μ€μ ν¨μ λ° μ μ΄ μμ± π§Ώ
πΉ animation-fill-mode:μ λλ©μ΄μ μ΄ μμλκΈ° μ κ³Ό λλ νμ μμμ μ΄λ€ μ€νμΌμ μ μ©ν μ§λ₯Ό κ²°μ .
- none: μ λλ©μ΄μ μΈμλ μ€νμΌμ μ μ§νμ§ μμ. (κΈ°λ³Έκ°)
- forwards: μ λλ©μ΄μ μ’ λ£ ν λ§μ§λ§ μνλ₯Ό μ μ§.
- backwards: μ λλ©μ΄μ μμ μ μ²μ μνλ₯Ό μ μ§.
- both: μμ μ κ³Ό μ’ λ£ ν λͺ¨λ μνλ₯Ό μ μ§ (forwards + backwards).
πΉ animation-play-state: μ λλ©μ΄μ μ΄ μ€ν μ€μΈμ§ μΌμμ μ§ μνμΈμ§λ₯Ό κ²°μ .
- running: μ λλ©μ΄μ μ΄ μ μμ μΌλ‘ μ€νλ¨. (κΈ°λ³Έκ°)
- paused: μ λλ©μ΄μ μ΄ μΌμμ μ§λ¨. (νμνλ©΄ JSλ CSSλ‘ λ€μ μ€ν κ°λ₯)
π¨ μΆμ½ν μμ± (Shorthand)
animation μμ±μ ν μ€λ‘ μ μνλ μμ±.
.box {
animation: [name] [duration] [timing-function] [delay] [iteration-count] [direction] [fill-mode];
}
- λ¬Έλ²: animation: μ΄λ¦ μ§μμκ° νμ΄λ° λκΈ°μκ° νμ λ°©ν₯ μ€νμΌμμ;
- μκ° κ΄λ ¨ κ° μμ μμΉ μ£Όμ, μ΄λ¦&μ§μμκ°μ νμ κ°, μλ΅ μ κΈ°λ³Έκ° μ μ©.
πβ POINT π
βοΈ @keyframes λ μ λλ©μ΄μ μ μλ리μ€, animation μμ±μ μ΄λ₯Ό μ€ννλ μ€μ . βοΈ
βοΈ infinite λ₯Ό νμ©νλ©΄ λ‘λ© λ°μ²λΌ κ³μ λμκ°λ ν¨κ³Όλ₯Ό μ½κ² λ§λ λ€. βοΈ
βοΈ alternate λ°©ν₯ μ€μ μ μ볡 μ λλ©μ΄μ μ λ§λ€ λ keyframesλ₯Ό μ λ°λ§ μ¨λ λκ² ν΄μ€λ€. βοΈ
π μμ±λ³ μμ λͺ¨μ π
| μμ± | μ½λ μμ | μ€λͺ |
| Iteration | animation-iteration-count: 3; | λ± 3λ²λ§ μμ§μ΄κ³ μ μ§ν¨ |
| Direction | animation-direction: alternate; | κ°λ€κ° λ€μ λμμ€λ μ볡 μ΄λ |
| Fill-mode | animation-fill-mode: forwards; | μ λλ©μ΄μ μ’ λ£ ν λ§μ§λ§ λͺ¨μ΅ μ μ§ |
| Play-state | .box:active { animation-play-state: paused; } | ν΄λ¦νλ λμ μμ§μμ΄ λ©μΆ€ |
βοΈ μ€μ μμ μ½λ: ν΅ν΅ νλ 곡 βοΈ
/* 1. μ λλ©μ΄μ
μ€κ³λ λ§λ€κΈ° */
@keyframes bounce {
0% { transform: translateY(0); }
50% { transform: translateY(-50px); }
100% { transform: translateY(0); }
}
.ball {
width: 50px;
height: 50px;
background-color: #3498db;
border-radius: 50%;
/* 2. μ λλ©μ΄μ
μ μ©νκΈ° */
/* μ΄λ¦(bounce), 0.6μ΄κ°, λΆλλ½κ²(ease-in-out), 무νλ°λ³΅(infinite) */
animation: bounce 0.6s ease-in-out infinite;
}
'<style>' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| perspective (0) | 2026.03.27 |
|---|---|
| transition μμ± (1) | 2026.03.27 |
| Functionsμ filterμμ±κ³Ό ν¨μ (0) | 2026.03.27 |
| transform μμ±κ³Ό functions (ν¨μ) (0) | 2026.03.26 |
| Pseudo-elements (μμ¬ μμ) (0) | 2026.03.26 |