CSS λͺ¨μ κ²½λ‘ λ³΄κ° μκ³ λ¦¬μ¦μ 볡μ‘μ±μ νꡬνμ¬ μ μΈκ³ κ°λ°μλ€μ΄ λ€μν νλ«νΌκ³Ό κΈ°κΈ°μμ μ μ°νκ³ λ§€λ ₯μ μΈ μ λλ©μ΄μ μ λ§λ€ μ μλλ‘ μ§μν©λλ€.
CSS λͺ¨μ κ²½λ‘ λ³΄κ° μκ³ λ¦¬μ¦: κΈλ‘λ² μ¬μ©μλ₯Ό μν λΆλλ¬μ΄ κ²½λ‘ μ λλ©μ΄μ μ μ
λμμμ΄ μ§ννλ μΉ λμμΈ λ° κ°λ° νκ²½μμ μ¬μ©μ κ²½ν(UX)μ κ°μ₯ μ€μν©λλ€. μ¬μ©μμ μ°Έμ¬λ₯Ό μ λνκ³ , μ£Όμλ₯Ό λλ©°, λμ§νΈ μΈν°νμ΄μ€λ₯Ό μννκ² μλ΄νλ κ²μ΄ ν΅μ¬μ λλ€. UXλ₯Ό ν¬κ² ν₯μμν€λ κ°λ ₯ν κΈ°μ μ€ νλλ μ λλ©μ΄μ μ λλ€. CSSμ μλ§μ μ λλ©μ΄μ κΈ°λ₯ μ€μμλ, λͺ¨μ κ²½λ‘(Motion Path)λ 볡μ‘ν SVG κ²½λ‘λ₯Ό λ°λΌ μμλ₯Ό μ λλ©μ΄μ ννλ λ₯λ ₯μΌλ‘ λκ°μ λνλ λλ€. κ·Έλ¬λ μ§μ μΌλ‘ μ μ°νκ³ μμ°μ€λ¬μ΄ μμ§μμ ꡬννλ €λ©΄ κ·Έ κΈ°λ°μ΄ λλ λ³΄κ° μκ³ λ¦¬μ¦μ λν κΉμ μ΄ν΄κ° νμν©λλ€. μ΄ κΈμμλ CSS λͺ¨μ κ²½λ‘ λ³΄κ°μ ν₯λ―Έλ‘μ΄ μΈκ³λ₯Ό νꡬνλ©°, μ μΈκ³ κ°λ°μλ€μ΄ μ κ΅νκ³ λΆλλ¬μ΄ μ λλ©μ΄μ μ μ μν μ μλ ν΅μ°°λ ₯μ μ 곡ν©λλ€.
λͺ¨μ κ²½λ‘μ ν
μκ³ λ¦¬μ¦μ λΆμνκΈ° μ μ, CSS λͺ¨μ κ²½λ‘κ° λ¬΄μμ μ 곡νλμ§ κ°λ¨ν μ΄ν΄λ³΄κ² μ΅λλ€. μ΄λ κ²½λ‘(μΌλ°μ μΌλ‘ SVG κ²½λ‘)λ₯Ό μ μν λ€μ, μ΄ κ²½λ‘μ μμλ₯Ό μ°κ²°νμ¬ κΆ€μ μ λ°λΌ μμΉ, νμ λ° ν¬κΈ°λ₯Ό μ λλ©μ΄μ νν μ μκ² ν΄μ€λλ€. μ΄λ 볡μ‘ν μ ν μμ°κ³Ό μΈν°λν°λΈ μΈν¬κ·Έλν½λΆν° λ§€λ ₯μ μΈ μ¨λ³΄λ© νλ‘μ°μ μΉ μ ν리μΌμ΄μ λ΄μ ν₯λ―Έλ‘μ΄ μ€ν 리ν λ§μ μ΄λ₯΄κΈ°κΉμ§ 무νν κ°λ₯μ±μ μ΄μ΄μ€λλ€.
μλ₯Ό λ€μ΄, μλ‘μ΄ κΈ°κΈ°λ₯Ό μ 보μ΄λ μ΄μ»€λ¨Έμ€ νλ«νΌμ μκ°ν΄ 보μΈμ. μ μ μΈ μ΄λ―Έμ§ λμ , κΈ°κΈ°μ μλλ μ¬μ©λ²μ λͺ¨λ°©νλ κ²½λ‘λ₯Ό λ°λΌ μ λλ©μ΄μ μ μ μ©νμ¬ ν΄λμ±μ΄λ κΈ°λ₯μ μλμ μ΄κ³ κΈ°μ΅μ λ¨λ λ°©μμΌλ‘ 보μ¬μ€ μ μμ΅λλ€. κΈλ‘λ² λ΄μ€ μΉμ¬μ΄νΈμ κ²½μ°, μΈκ³ μ§λ μμ λ΄μ€ μμ΄μ½μ΄ 미리 μ μλ κ²½λ‘λ₯Ό λ°λΌ μ΄λνλ©° κΈ°μ¬μ νκΈλ ₯μ μκ°μ μΌλ‘ λνλΌ μ μμ΅λλ€.
λ³΄κ° μ΄ν΄νκΈ°: λΆλλ¬μ΄ μμ§μμ ν΅μ¬
μ λλ©μ΄μ μ ν΅μ¬μ μκ°μ νλ¦μ λ°λ₯Έ λ³νμ λλ€. μμκ° κ²½λ‘λ₯Ό λ°λΌ μμ§μΌ λ, μΌλ ¨μ μμΉλ₯Ό μ°¨μ§νκ² λ©λλ€. 보κ°(Interpolation)μ μ°μμ μΈ μμ§μμ νμμ λ§λ€μ΄λ΄κΈ° μν΄ ν΅μ¬ μ§μ (ν€νλ μ) μ¬μ΄μ μ€κ° μμΉλ₯Ό κ³μ°νλ κ³Όμ μ λλ€. κ°λ¨ν λ§ν΄, κ°μ²΄κ° μ΄λμμ μμνκ³ λλλμ§ μλ€λ©΄, 보κ°μ κ·Έ μ¬μ΄μ λͺ¨λ μ§μ μ μμλ΄λ λ° λμμ μ€λλ€.
μ λλ©μ΄μ μ ν¨κ³Όλ 보κ°μ νμ§μ λ¬λ € μμ΅λλ€. μλͺ» μ νλκ±°λ ꡬνλ λ³΄κ° μκ³ λ¦¬μ¦μ μ¬μ©μ κ²½νμ μ ν΄νλ λΆμμ νκ³ , λΆμμ°μ€λ¬μ°λ©°, κ±°μ¬λ¦¬λ μμ§μμ μ΄λν μ μμ΅λλ€. λ°λλ‘, μ μ‘°μ λ μκ³ λ¦¬μ¦μ μ§κ΄μ μ΄κ³ λ°μμ±μ΄ μ’μ μΈλ ¨λκ³ , μ μ°νλ©°, λ―Ένμ μΌλ‘ λ§μ‘±μ€λ¬μ΄ μ λλ©μ΄μ μ μ 곡ν©λλ€.
λͺ¨μ κ²½λ‘ λ³΄κ°μ ν΅μ¬ κ°λ
μκ³ λ¦¬μ¦μ μ΄ν΄νκΈ° μν΄ λͺ κ°μ§ κΈ°λ³Έ κ°λ μ νμ ν΄μΌ ν©λλ€:
- κ²½λ‘ μ μ: λͺ¨μ κ²½λ‘λ SVG κ²½λ‘ λ°μ΄ν°μ μμ‘΄ν©λλ€. μ΄ κ²½λ‘λ μΌλ ¨μ λͺ λ Ήμ΄(Mμ moveto, Lμ lineto, Cλ 3μ°¨ λ² μ§μ 곑μ , Qλ 2μ°¨ λ² μ§μ 곑μ , Aλ νμν νΈ)λ‘ μ μλ©λλ€. SVG κ²½λ‘μ 볡μ‘μ±μ νμν 보κ°μ 볡μ‘μ±μ μ§μ μ μΈ μν₯μ λ―ΈμΉ©λλ€.
- ν€νλ μ: μ λλ©μ΄μ μ μΌλ°μ μΌλ‘ νΉμ μμ μμ μμμ μνλ₯Ό μ§μ νλ ν€νλ μμΌλ‘ μ μλ©λλ€. λͺ¨μ κ²½λ‘μ κ²½μ°, μ΄ ν€νλ μμ κ²½λ‘λ₯Ό λ°λ₯Έ μμμ μμΉμ λ°©ν₯μ μ μν©λλ€.
- μ΄μ§ ν¨μ: μ΄ ν¨μλ€μ μκ° κ²½κ³Όμ λ°λ₯Έ μ λλ©μ΄μ μ λ³νμ¨μ μ μ΄ν©λλ€. μΌλ°μ μΈ μ΄μ§ ν¨μλ‘λ linear(μΌμ ν μλ), ease-in(λλ¦¬κ² μμ, λΉ λ₯΄κ² λ), ease-out(λΉ λ₯΄κ² μμ, λλ¦¬κ² λ), ease-in-out(μμκ³Ό λμ λλ¦¬κ³ μ€κ°μ λΉ λ¦) λ±μ΄ μμ΅λλ€. μ΄μ§μ μ λλ©μ΄μ μ΄ νμ€ μΈκ³μ 물리νμ λͺ¨λ°©νμ¬ μμ°μ€λ½κ³ μ κΈ°μ μΌλ‘ λκ»΄μ§κ² νλ λ° λ§€μ° μ€μν©λλ€.
- λ§€κ°λ³μν: κ²½λ‘λ λ³Έμ§μ μΌλ‘ 곡κ°μμ 곑μ μ λλ€. μ΄λ₯Ό λ°λΌ μ λλ©μ΄μ μ μ μ©νλ €λ©΄, μΌλ°μ μΌλ‘ 0κ³Ό 1 μ¬μ΄(λλ 0%μ 100%)μ κ°μ μ¬μ©νμ¬ κ³‘μ μμ λͺ¨λ μ μ λνλ΄λ λ°©λ²μ΄ νμν©λλ€. μ΄λ κ²½λ‘λ₯Ό λ°λ₯Έ μ§νλ₯ μ λνλ λλ€.
CSS λͺ¨μ κ²½λ‘ λ³΄κ° μκ³ λ¦¬μ¦: μ¬μΈ΅ λΆμ
CSS λͺ¨μ κ²½λ‘ μ¬μμ λ¨μΌνκ³ κ±°λν λ³΄κ° μκ³ λ¦¬μ¦μ κ·μ νμ§ μμ΅λλ€. λμ , SVG μ λλ©μ΄μ κ³Ό κΈ°λ³Έ λΈλΌμ°μ κΈ°μ μ κΈ°λ₯μ νμ©νλ κΈ°λ³Έ λ λλ§ μμ§μ ν΄μκ³Ό ꡬνμ μμ‘΄ν©λλ€. μ£Όμ λͺ©νλ μ μλ ν€νλ μκ³Ό μ΄μ§ ν¨μλ₯Ό μ‘΄μ€νλ©΄μ, μ£Όμ΄μ§ μκ°μ νΉμ μ§μ μμ μ§μ λ κ²½λ‘λ₯Ό λ°λ₯Έ μμμ μμΉμ λ°©ν₯μ μ ννκ² κ²°μ νλ κ²μ λλ€.
κ°λ΅μ μΌλ‘, μ΄ κ³Όμ μ λ€μκ³Ό κ°μ λ¨κ³λ‘ λλ μ μμ΅λλ€:
- κ²½λ‘ νμ±: SVG κ²½λ‘ λ°μ΄ν°λ₯Ό μ¬μ© κ°λ₯ν μνμ ννμΌλ‘ νμ±ν©λλ€. μ΄λ μ’ μ’ λ³΅μ‘ν κ²½λ‘λ₯Ό λ κ°λ¨ν μΈκ·Έλ¨ΌνΈ(μ , 곑μ , νΈ)λ‘ λΆν΄νλ μμ μ ν¬ν¨ν©λλ€.
- κ²½λ‘ κΈΈμ΄ κ³μ°: μΌκ΄λ μλμ μ μ ν μ΄μ§μ 보μ₯νκΈ° μν΄, κ²½λ‘μ μ΄ κΈΈμ΄λ₯Ό κ³μ°νλ κ²½μ°κ° λ§μ΅λλ€. μ΄λ 볡μ‘ν λ² μ§μ 곑μ κ³Ό νΈμ κ²½μ° κ°λ¨νμ§ μμ μμ μΌ μ μμ΅λλ€.
- κ²½λ‘μ λ§€κ°λ³μν: μ κ·νλ μ§ν κ°(0μμ 1)μ κ²½λ‘μμ ν΄λΉ μ§μ λ° μ μ (λ°©ν₯μ κ²°μ ν¨)μ λ§€ννλ ν¨μκ° νμν©λλ€.
- ν€νλ μ νκ°: μ λλ©μ΄μ μ νΉμ μμ μμ λΈλΌμ°μ λ νμλΌμΈμ λ°λ₯Έ νμ¬ μ§ν μν©μ κ²°μ νκ³ μ μ ν μ΄μ§ ν¨μλ₯Ό μ μ©ν©λλ€.
- κ²½λ‘λ₯Ό λ°λ₯Έ 보κ°: μ΄μ§μ΄ μ μ©λ μ§ν κ°μ μ¬μ©νμ¬, μκ³ λ¦¬μ¦μ λ§€κ°λ³μνλ κ²½λ‘μμ ν΄λΉ μ§μ μ μ°Ύμ΅λλ€. μ΄λ x, y μ’νλ₯Ό κ³μ°νλ κ²μ ν¬ν¨ν©λλ€.
- λ°©ν₯ κ³μ°: κ²½λ‘μμ κ³μ°λ μ§μ μ μ μ 벑ν°λ μμμ νμ κ°λλ₯Ό κ²°μ νλ λ° μ¬μ©λ©λλ€.
μΌλ°μ μΈ μκ³ λ¦¬μ¦μ μ κ·Ό λ°©μκ³Ό κ³Όμ
CSS μ¬μμ΄ νλ μμν¬λ₯Ό μ 곡νμ§λ§, μ΄λ¬ν λ¨κ³μ μ€μ ꡬνμλ κ°κ°μ μ₯λ¨μ μ΄ μλ λ€μν μκ³ λ¦¬μ¦ μ λ΅μ΄ ν¬ν¨λ©λλ€:
1. μ ν λ³΄κ° (μ§μ κ²½λ‘)
κ°λ¨ν μ λΆμ κ²½μ° λ³΄κ°μ κ°λ¨ν©λλ€. λ μ P1=(x1, y1)κ³Ό P2=(x2, y2), κ·Έλ¦¬κ³ μ§ν κ° 't'(0μμ 1)κ° μλ€λ©΄, μ λΆ μμ μμμ μ Pλ λ€μκ³Ό κ°μ΄ κ³μ°λ©λλ€:
P = P1 + t * (P2 - P1)
μ΄λ₯Ό νμ₯νλ©΄ λ€μκ³Ό κ°μ΅λλ€:
x = x1 + t * (x2 - x1)
y = y1 + t * (y2 - y1)
κ³Όμ : μ΄λ μ§μ μλ§ ν΄λΉλ©λλ€. μ€μ κ²½λ‘λ μ’ μ’ κ³‘μ μ λλ€.
2. λ² μ§μ 곑μ 보κ°
SVG κ²½λ‘λ λ² μ§μ 곑μ (2μ°¨ λ° 3μ°¨)μ μμ£Ό μ¬μ©ν©λλ€. λ² μ§μ 곑μ μ λ°λΌ 보κ°νλ κ²μ 곑μ μ μν 곡μμ μ¬μ©νλ κ²μ ν¬ν¨ν©λλ€:
2μ°¨ λ² μ§μ 곑μ : B(t) = (1-t)Β²Pβ + 2(1-t)tPβ + tΒ²Pβ
3μ°¨ λ² μ§μ 곑μ : B(t) = (1-t)Β³Pβ + 3(1-t)Β²tPβ + 3(1-t)tΒ²Pβ + tΒ³Pβ
μ¬κΈ°μ Pβ, Pβ, Pβ, Pβλ μ μ΄μ μ λλ€.
κ³Όμ : μ£Όμ΄μ§ 't'μ λν΄ λ² μ§μ 곑μ μ μ§μ νκ°νλ κ²μ κ°λ¨ν©λλ€. κ·Έλ¬λ λ² μ§μ 곑μ μ λ°λΌ κ· μΌν μλλ₯Ό λ¬μ±νλ κ²μ κ³μ° λΉμ©μ΄ λ§μ΄ λλλ€. 곑μ μ λ°λΌ 't'κ° μ νμ μΌλ‘ μ§νλλ€κ³ ν΄μ μ΄λ κ±°λ¦¬κ° μ νμ μΌλ‘ μ§νλμ§λ μμ΅λλ€. κ· μΌν μλλ₯Ό μ»μΌλ €λ©΄ μΌλ°μ μΌλ‘ λ€μμ΄ νμν©λλ€:
- μΈλΆν: 곑μ μ λ§μ μμ, κ±°μ μ νμ μΈ μΈκ·Έλ¨ΌνΈλ‘ λλκ³ μ΄ μΈκ·Έλ¨ΌνΈλ€μ μ€κ°μ μ¬μ΄λ₯Ό μ νμΌλ‘ 보κ°ν©λλ€. μΈκ·Έλ¨ΌνΈκ° λ§μμλ‘ μμ§μμ΄ λ λΆλλ½κ³ μ νν΄μ§μ§λ§, κ³μ° λΉμ©μ λμμ§λλ€.
- κ·Ό μ°ΎκΈ°/μ λ§€κ°λ³μν: μ΄λ νΉμ νΈ κΈΈμ΄μ ν΄λΉνλ 't' κ°μ μ°ΎκΈ° μν λ μνμ μΌλ‘ μ격νμ§λ§ 볡μ‘ν μ κ·Ό λ°©μμ λλ€.
λΈλΌμ°μ λ μ’ μ’ μ νμ±κ³Ό μ±λ₯μ κ· νμ λ§μΆκΈ° μν΄ μΈλΆνμ κ·Όμ¬ κΈ°λ²μ μ‘°ν©νμ¬ μ¬μ©ν©λλ€.
3. νΈ λ³΄κ°
νμν νΈ μμ νΉμ λ³΄κ° λ‘μ§μ΄ νμν©λλ€. μ΄ μνμ νμμ μ€μ¬, μμ λ° λ κ°λλ₯Ό κ³μ°νκ³ μ΄ κ°λλ€ μ¬μ΄λ₯Ό 보κ°νλ κ²μ ν¬ν¨ν©λλ€. νΈμ λν SVG μ¬μμ λ§€μ° μμΈνλ©° λ°μ§λ¦μ΄ 0μ΄κ±°λ μ λ€μ΄ λ무 λ©λ¦¬ λ¨μ΄μ Έ μλ κ²κ³Ό κ°μ μμΈμ μΈ κ²½μ°λ₯Ό μ²λ¦¬νλ κ²μ ν¬ν¨ν©λλ€.
κ³Όμ : νΉν μΈκ·Έλ¨ΌνΈ κ° μ ν μ νΈ κ²½λ‘κ° μ¬λ°λ₯΄κ² λ°λΌκ°κ³ μ¬λ°λ₯Έ λ°©ν₯(sweep-flag)μ΄ μ μ§λλλ‘ λ³΄μ₯νλ κ²μ λλ€.
4. μ μ λ° λ°©ν₯ κ³μ°
μμκ° μμ§μ΄λ λ°©ν₯μ ν₯νκ² νλ €λ©΄ νμ κ°λλ₯Ό κ³μ°ν΄μΌ ν©λλ€. μ΄λ μΌλ°μ μΌλ‘ κ²½λ‘μμ 보κ°λ μ§μ μμ μ μ 벑ν°λ₯Ό μ°Ύμ μνλ©λλ€. μ΄ μ μ 벑ν°μ κ°λκ° νμν νμ κ°μ μ 곡ν©λλ€.
λ² μ§μ 곑μ B(t)μ κ²½μ°, μ μ μ κ·Έ λ―ΈλΆμΈ B'(t)μ λλ€.
κ³Όμ : μ μ μ νΉμ μ§μ (μ: λΎ°μ‘±ν μ )μμ 0μ΄ λ μ μμ΄, μ μλμ§ μκ±°λ λΆμμ ν νμ μ μ΄λν μ μμ΅λλ€. μ΄λ¬ν κ²½μ°λ₯Ό μννκ² μ²λ¦¬νλ κ²μ΄ λΆλλ¬μ΄ μ λλ©μ΄μ μ μν΄ μ€μν©λλ€.
λΈλΌμ°μ ꡬν λ° ν¬λ‘μ€ λΈλΌμ°μ νΈνμ±
μΉ νμ€μ μ₯μ μ μνΈ μ΄μ©μ±μ λͺ©νλ‘ νλ€λ κ²μ λλ€. κ·Έλ¬λ λͺ¨μ κ²½λ‘ λ³΄κ°κ³Ό κ°μ 볡μ‘ν μκ³ λ¦¬μ¦μ ꡬνμ λΈλΌμ°μ (Chrome, Firefox, Safari, Edge λ±) κ°μ μ½κ°μ© λ€λ₯Ό μ μμ΅λλ€. μ΄λ‘ μΈν΄ νΉν λ§€μ° λ³΅μ‘ν κ²½λ‘ λλ μ κ΅ν νμ΄λ° ν¨μλ₯Ό μ¬μ©ν λ μ λλ©μ΄μ μ λΆλλ¬μ, μλ λλ λμμ λ―Έλ¬ν μ°¨μ΄κ° λ°μν μ μμ΅λλ€.
κΈλ‘λ² κ°λ°μλ₯Ό μν μ λ΅:
- μ² μ ν ν μ€νΈ: κΈλ‘λ² μ¬μ©μκ° μ¬μ©νλ λμ λΈλΌμ°μ μ λ°μ κ±Έμ³ λͺ¨μ κ²½λ‘ μ λλ©μ΄μ μ νμ ν μ€νΈνμμμ€. λ€μν μ§μμ λ€μν μ₯μΉ λ° μ΄μ 체μ 보κΈλ₯ μ κ³ λ €νμμμ€.
- SVG μ λλ©μ΄μ (SMIL)μ λ체/λμμΌλ‘ μ¬μ©: CSS λͺ¨μ κ²½λ‘λ κ°λ ₯νμ§λ§, μΌλΆ 볡μ‘ν μ λλ©μ΄μ μ΄λ μ격ν ν¬λ‘μ€ λΈλΌμ°μ μΌκ΄μ±μ΄ μ€μν κ²½μ°, λ μ€λλμμ§λ§ μ μ§μλλ SVG λ΄μ λκΈ°ν λ©ν°λ―Έλμ΄ ν΅ν© μΈμ΄(SMIL)κ° μ€ν κ°λ₯ν λμ λλ 보쑰 λκ΅¬κ° λ μ μμ΅λλ€.
- κ°λ₯ν λ κ²½λ‘ λ¨μν: μ΅λμ νΈνμ±κ³Ό μ±λ₯μ μν΄ μκ°μ μΆ©μ€λκ° νμ©νλ ν SVG κ²½λ‘λ₯Ό λ¨μννμμμ€. λ κ°λ¨ν λͺ¨μμΌλ‘ μΆ©λΆνλ€λ©΄ κ³Όλν μ μ΄λ μ§λμΉκ² 볡μ‘ν 곑μ μ νΌνμμμ€.
- μλ°μ€ν¬λ¦½νΈ λΌμ΄λΈλ¬λ¦¬ νμ©: GSAP(GreenSock Animation Platform)μ κ°μ λΌμ΄λΈλ¬λ¦¬λ μ κ΅ν κ²½λ‘ μ λλ©μ΄μ μ ν¬ν¨ν κ°λ ₯ν μ λλ©μ΄μ κΈ°λ₯μ μ 곡ν©λλ€. μ΄λ€μ μ’ μ’ ν¬λ‘μ€ λΈλΌμ°μ λΆμΌμΉλ₯Ό μννκ³ λ λ§μ μ μ΄ κΈ°λ₯μ μ 곡ν μ μλ μ체 μ΅μ νλ λ³΄κ° μκ³ λ¦¬μ¦μ μ 곡ν©λλ€. μλ₯Ό λ€μ΄, GSAPμ MotionPathPluginμ μ±λ₯κ³Ό μ μ°μ±μΌλ‘ μ λͺ ν©λλ€.
κΈλ‘λ² μ¬μ©μλ₯Ό μν μ±λ₯ κ³ λ € μ¬ν
κΈλ‘λ² μ¬μ©μλ₯Ό μν μ λλ©μ΄μ μ λμμΈν λ μ±λ₯μ μ€μν μμμ λλ€. μΈν°λ· μΈνλΌκ° λ κ²¬κ³ νκ±°λ ꡬν/μ μ¬μ κΈ°κΈ°λ₯Ό μ¬μ©νλ μ§μμ μ¬μ©μλ μ λλ©μ΄μ μ΄ λ리거λ UI λ©μΆ€μ μ λ°ν κ²½μ° νμ νκ² μ νλ κ²½νμ νκ² λ©λλ€.
μ΅μ ν κΈ°λ²:
- κ²½λ‘ λ³΅μ‘μ± μ΅μν: μΈκΈνλ―μ΄, λ κ°λ¨ν κ²½λ‘λ νμ±νκ³ λ³΄κ°νλ λ° λ λΉ λ¦ λλ€.
- νμ μ νλ μ μλ μ€μ΄κΈ°: λμ νλ μ μλκ° λ°λμ§νμ§λ§, λλ‘λ μ λλ©μ΄μ μ νλ μ μλλ₯Ό μ€μ΄λ κ²(μ: 60fps λμ 30fps)μ΄ μ μ¬μ νλμ¨μ΄μμ μκ°μ νμ§ μ ν μμ΄ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
- νλμ¨μ΄ κ°μ μ¬μ©: λΈλΌμ°μ λ CSS μ λλ©μ΄μ μ GPU κ°μμ μ¬μ©νλλ‘ μ΅μ νλμ΄ μμ΅λλ€. μ λλ©μ΄μ μ΄ μ΄λ₯Ό νμ©νλλ‘ μ€μ λμλμ§ νμΈνμμμ€(μ: `top`, `left` μμ± λμ `transform` μμ± μ λλ©μ΄μ ).
- μ°λ‘νλ§ λ° λλ°μ΄μ±: μ λλ©μ΄μ μ΄ μ¬μ©μ μνΈ μμ©(μ: μ€ν¬λ‘€ λλ ν¬κΈ° μ‘°μ )μ μν΄ νΈλ¦¬κ±°λλ κ²½μ°, κ³Όλν μ¬λ λλ§ λ° κ³μ°μ νΌνκΈ° μν΄ μ΄λ¬ν νΈλ¦¬κ±°κ° μ°λ‘νλ§λκ±°λ λλ°μ΄μ±λλλ‘ νμμμ€.
- μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬ κ³ λ €: μΈκΈνλ―μ΄, GSAPμ κ°μ λΌμ΄λΈλ¬λ¦¬λ μ±λ₯μ κ³ λλ‘ μ΅μ νλμ΄ μμ΅λλ€.
- μ μ§μ ν₯μ: μ λλ©μ΄μ μ΄ λΉνμ±νλμκ±°λ μ±λ₯μ΄ λ¬Έμ μΈ μ¬μ©μλ₯Ό μν΄ κΈ°λ₯μ μ μ§λμ§λ§ μ νλ κ²½νμ μ 곡νμμμ€.
μ κ·Όμ±κ³Ό λͺ¨μ κ²½λ‘
μ λλ©μ΄μ , νΉν λΉ λ₯΄κ±°λ, 볡μ‘νκ±°λ, λ°λ³΅μ μΈ μ λλ©μ΄μ μ μ κ·Όμ± λ¬Έμ λ₯Ό μΌκΈ°ν μ μμ΅λλ€. μ μ μ₯μ (λ©λ―Έ), μΈμ§ μ₯μ κ° μκ±°λ μ€ν¬λ¦° 리λμ μμ‘΄νλ μ¬μ©μμκ² μ λλ©μ΄μ μ λ°©ν₯ κ°κ°μ μκ² νκ±°λ μ κ·Ό λΆκ°λ₯ν μ μμ΅λλ€.
κΈλ‘λ² μ κ·Όμ±μ μν λͺ¨λ² μ¬λ‘:
prefers-reduced-motion
λ―Έλμ΄ μΏΌλ¦¬ μ‘΄μ€: μ΄λ κΈ°λ³Έμ μΈ CSS κΈ°λ₯μ λλ€. κ°λ°μλ μ¬μ©μκ° μμ§μ κ°μλ₯Ό μμ²νλμ§ κ°μ§νκ³ κ·Έμ λ°λΌ μ λλ©μ΄μ μ λΉνμ±ννκ±°λ λ¨μνν΄μΌ ν©λλ€. μ΄λ μ κ·Όμ± μκ΅¬κ° λ§€μ° λ€μν κΈλ‘λ² μ¬μ©μμκ² λ§€μ° μ€μν©λλ€.- μ λλ©μ΄μ μ κ°κ²°νκ³ λͺ©μ μ λ§κ² μ μ§: 무νμ λ°λ³΅λκ±°λ λͺ νν λͺ©μ μ΄ μλ μ λλ©μ΄μ μ νΌνμμμ€.
- μ μ΄ κΈ°λ₯ μ 곡: 볡μ‘νκ±°λ κΈ΄ μ λλ©μ΄μ μ κ²½μ°, μΌμ μ€μ§, μ¬μ λλ λ€μ μμν μ μλ μ μ΄ κΈ°λ₯μ μ 곡νλ κ²μ κ³ λ €νμμμ€.
- κ°λ μ± λ³΄μ₯: μ λλ©μ΄μ μ΄ νμ±νλμ΄ μμ λλ ν μ€νΈκ° μ½κΈ° μ½κ³ μνΈ μμ© κ°λ₯ν μμμ μ κ·Όν μ μλλ‘ νμμμ€.
- 보쑰 κΈ°μ λ‘ ν μ€νΈ: λͺ¨μ κ²½λ‘λ μ£Όλ‘ μκ°μ λ λλ§μ μν₯μ λ―ΈμΉμ§λ§, μ λλ©μ΄μ μ΄ μ€ν μ€μ΄κ±°λ λΉνμ±νλμμ λ κΈ°λ³Έ μ½ν μΈ μ κΈ°λ₯μ μ κ·Όν μ μλμ§ νμΈνμμμ€.
μμ: λͺ¨μ
κ²½λ‘λ₯Ό μ¬μ©ν μ ν ν¬μ΄μ κ²½μ°, μ¬μ©μκ° prefers-reduced-motion
μ νμ±ννλ€λ©΄, 볡μ‘ν κ²½λ‘ μ£Όμλ‘ μ νμ μ λλ©μ΄μ
νλ λμ , λͺ
νν ν
μ€νΈ μ€λͺ
κ³Ό ν¨κ» μΌλ ¨μ μ μ μ΄λ―Έμ§λ₯Ό νμνκ³ μ΄λ―Έμ§ μ¬μ΄μ λ―Έλ¬ν νμ΄λ ν¨κ³Όλ₯Ό μ€ μ μμ΅λλ€.
λͺ¨μ κ²½λ‘ μ λλ©μ΄μ μ κ΅μ ν λ° νμ§ν
κΈλ‘λ² μ¬μ©μλ₯Ό μν΄ λμμΈν λ, μ λλ©μ΄μ μ΄ νμ§νλ μ½ν μΈ λ λ€λ₯Έ λ¬Ένμ κΈ°λμ μ΄λ»κ² μνΈ μμ©ν μ μλμ§ κ³ λ €νμμμ€.
- ν μ€νΈ κ°λ μ±: μ λλ©μ΄μ μ΄ κ²½λ‘λ₯Ό λ°λΌ ν μ€νΈλ₯Ό μμ§μΈλ€λ©΄, νμ§νλ ν μ€νΈ(κΈΈμ΄μ λ°©ν₯μ΄ ν¬κ² λ€λ₯Ό μ μμ)κ° κ²½λ‘ λ΄μ λ§κ³ μ½κΈ° μ¬μ΄ μνλ₯Ό μ μ§νλμ§ νμΈνμμμ€. ν μ€νΈ λ°©ν₯μ±(μΌμͺ½μμ μ€λ₯Έμͺ½, μ€λ₯Έμͺ½μμ μΌμͺ½)μ νΉν μ€μν©λλ€.
- λ¬Ένμ μμ§μ±: λ€λ₯Έ λ¬ΈνκΆμμ μμ§μμ΄λ λͺ¨μκ³Ό κ΄λ ¨λ μμ§μ μλ―Έμ μ£Όμνμμμ€. ν λ¬Ένμμλ λΆλλ½κ³ μ°μν κ²½λ‘κ° λ€λ₯Έ κ³³μμλ λ€λ₯΄κ² μΈμλ μ μμ΅λλ€.
- μλμ νμ΄λ°: μΈμ§λλ μλκ° λ¬ΈνκΆμ λ°λΌ λ€λ₯Ό μ μλ€λ μ μ κ³ λ €νμμμ€. μ λλ©μ΄μ μλμ μ§μ μκ°μ΄ κ΄λ²μν μ¬μ©μμκ² νΈμνκ³ ν¨κ³Όμ μΈμ§ νμΈνμμμ€.
- μκ°λ λ° μ€μκ° λ°μ΄ν°: μ λλ©μ΄μ μ΄ μκ°μ λ―Όκ°ν μ 보λ₯Ό νμνκ±°λ μ€μ μ¬κ±΄(μ: μ§λμμ λΉν κ²½λ‘)μ λ°μνλ κ²½μ°, μμ€ν μ΄ μ μΈκ³ μ¬μ©μλ₯Ό μν΄ λ€λ₯Έ μκ°λμ λ°μ΄ν° μλ‘κ³ μΉ¨μ μ¬λ°λ₯΄κ² μ²λ¦¬νλμ§ νμΈνμμμ€.
μ€μ© μμ : μμ± κΆ€λ μ λλ©μ΄μ
μ€μ©μ μΈ μμ λ₯Ό ν΅ν΄ μ€λͺ ν΄ λ³΄κ² μ΅λλ€: νμ± μ£Όμλ₯Ό λλ μμ± μ λλ©μ΄μ . μ΄λ μμ± μ΄λ―Έμ§λ μνλ₯Ό νμνλ λ° νν μ¬μ©λλ UI ν¨ν΄μ λλ€.
1. κ²½λ‘ μ μ
SVG μ λλ νμν κ²½λ‘λ₯Ό μ¬μ©νμ¬ κΆ€λλ₯Ό λνλΌ μ μμ΅λλ€.
SVG νμ μ¬μ©:
<svg width="400" height="400" viewBox="0 0 400 400"> <!-- Planet --> <circle cx="200" cy="200" r="50" fill="blue" /> <!-- Orbit Path (Invisible) --> <path id="orbitPath" d="M 200 100 A 100 100 0 1 1 200 300 A 100 100 0 1 1 200 100" fill="none" stroke="transparent" /> </svg>
`d` μμ±μ (200, 200)μ μ€μ¬μΌλ‘ νκ³ λ°μ§λ¦μ΄ 100μΈ μμ νμ±νλ νμν κ²½λ‘λ₯Ό μ μν©λλ€. `A` λͺ λ Ήμ΄λ νμν νΈμ μ¬μ©λ©λλ€.
2. μ λλ©μ΄μ ν μμ μ μ
μ΄κ²μ μ°λ¦¬μ μμ±μ΄ λ κ²μ΄λ©°, μμ SVG μ΄λ―Έμ§λ λ°°κ²½μ΄ μλ `div`μΌ μ μμ΅λλ€.
<svg width="400" height="400" viewBox="0 0 400 400"> <!-- Planet --> <circle cx="200" cy="200" r="50" fill="blue" /> <!-- Orbit Path --> <path id="orbitPath" d="M 200 100 A 100 100 0 1 1 200 300 A 100 100 0 1 1 200 100" fill="none" stroke="transparent" /> <!-- Satellite --> <image id="satellite" href="satellite.png" width="20" height="20" /> </svg>
3. CSS λͺ¨μ κ²½λ‘ μ μ©
μμ±μ κ²½λ‘μ μ°κ²°νκ³ μ λλ©μ΄μ μ μ€μ ν©λλ€.
#satellite { animation: orbit 10s linear infinite; transform-origin: 50% 50%; /* Important for rotation */ } @keyframes orbit { to { offset-distance: 100%; /* Animate along the path */ offset-rotate: auto; /* Rotate to follow the path tangent */ } } #orbitPath { offset-path: url(#orbitPath); }
μ€λͺ :
animation: orbit 10s linear infinite;
: 'orbit'μ΄λΌλ μ΄λ¦μ μ λλ©μ΄μ μ μ μ©νλ©°, 10μ΄ λμ μ§μλκ³ , μΌμ ν μλ(linear)λ‘ μ€νλλ©°, μμν λ°λ³΅λ©λλ€.@keyframes
λ΄μoffset-distance: 100%;
: μ΄κ²μ΄ νλ CSSμμ λͺ¨μ κ²½λ‘ μ λλ©μ΄μ μ ν΅μ¬μ λλ€. μμμκ² μ μλ μ€νμ κ²½λ‘λ₯Ό λ°λΌ 100% μ΄λνλΌκ³ μ§μν©λλ€.offset-rotate: auto;
: λΈλΌμ°μ μ μμκ° λ°λ₯΄λ κ²½λ‘μ μ μ μ λ§μΆ° μλμΌλ‘ νμ νλλ‘ μ§μν©λλ€. μ΄λ μμ±μ΄ νμ μμ§μ΄λ λ°©ν₯μ ν₯νλλ‘ λ³΄μ₯ν©λλ€.offset-path: url(#orbitPath);
: μ λλ©μ΄μ λ μμμ μ μ©λλ μ΄ μμ±μ IDλ₯Ό ν΅ν΄ μ μλ κ²½λ‘μ μ°κ²°ν©λλ€.
μ΄ μμ μ λν κΈλ‘λ² κ³ λ € μ¬ν:
- μμ± μ΄λ―Έμ§(`satellite.png`)λ λ€μν νλ©΄ λ°λμ μ΅μ νλμ΄μΌ ν©λλ€.
- νμ±κ³Ό κΆ€λλ SVGμ΄λ―λ‘ λͺ¨λ ν΄μλμμ νμ₯ κ°λ₯νκ³ μ λͺ ν©λλ€.
- μ λλ©μ΄μ
μ `linear` λ° `infinite`λ‘ μ€μ λμ΄ μμ΅λλ€. λ λμ UXλ₯Ό μν΄ μ΄μ§μ΄λ μ νν μ§μ μκ°μ λμ
ν μ μμ΅λλ€. λμμ μΈ μ μ λμ€νλ μ΄λ λ κ°λ¨ν μ λλ©μ΄μ
μ μ 곡νμ¬
prefers-reduced-motion
μ κ³ λ €νμμμ€.
λͺ¨μ κ²½λ‘ λ³΄κ°μ λ―Έλ
μΉ μ λλ©μ΄μ λΆμΌλ λμμμ΄ μ§ννκ³ μμ΅λλ€. λ€μκ³Ό κ°μ κ²λ€μ κΈ°λν μ μμ΅λλ€:
- λ μ κ΅ν μκ³ λ¦¬μ¦: λΈλΌμ°μ κ° λ² μ§μ 곑μ λ° κΈ°ν 볡μ‘ν κ²½λ‘ μ νμ λν΄ λ λ°μ λκ³ ν¨μ¨μ μΈ λ³΄κ° κΈ°μ μ ꡬννμ¬ ν¨μ¬ λ λΆλλ½κ³ μ±λ₯μ΄ λ°μ΄λ μ λλ©μ΄μ μ μ 곡ν μ μμ΅λλ€.
- ν₯μλ μ μ΄: μλ‘μ΄ CSS μμ±μ΄λ νμ₯μ΄ λ³΄κ°μ λν λ μΈλ°ν μ μ΄λ₯Ό μ 곡νμ¬, κ°λ°μκ° κ²½λ‘λ₯Ό λ°λΌ μ¬μ©μ μ μ μ΄μ§μ μ μνκ±°λ κ²½λ‘ μ ν©λΆμμ νΉμ λμμ μ μν μ μκ² λ μ μμ΅λλ€.
- λ λμ λꡬ: λͺ¨μ κ²½λ‘κ° λ λ리 보κΈλ¨μ λ°λΌ, λͺ¨μ κ²½λ‘μ νΈνλλ SVG λ° CSSλ₯Ό λ΄λ³΄λΌ μ μλ ν₯μλ λμμΈ λꡬ λ° μ λλ©μ΄μ νΈμ§κΈ°λ₯Ό κΈ°λν μ μμ΅λλ€.
- ν₯μλ μ κ·Όμ± ν΅ν©: μ κ·Όμ± κΈ°λ₯κ³Όμ λ κΉμ ν΅ν©μΌλ‘ μ λλ©μ΄μ μ λν μ κ·Ό κ°λ₯ν λμμ λ μ½κ² μ 곡ν μ μμ΅λλ€.
κ²°λ‘
CSS λͺ¨μ κ²½λ‘ λ³΄κ°μ μλμ μ΄κ³ λ§€λ ₯μ μΈ μΉ κ²½νμ λ§λλ κ°λ ₯ν λꡬμ λλ€. κΈ°λ³Έμ μΈ μ ν 보κ°λΆν° λ² μ§μ 곑μ λ° νΈ μΈκ·Έλ¨ΌνΈμ 볡μ‘μ±μ μ΄λ₯΄κΈ°κΉμ§ κΈ°λ³Έ μκ³ λ¦¬μ¦μ μ΄ν΄ν¨μΌλ‘μ¨, κ°λ°μλ μκ°μ μΌλ‘ μλ¦λ€μΈ λΏλ§ μλλΌ μ±λ₯μ΄ λ°μ΄λκ³ μ κ·Ό κ°λ₯ν μ λλ©μ΄μ μ λ§λ€ μ μμ΅λλ€. κΈλ‘λ² μ¬μ©μλ₯Ό μν΄ ν¬λ‘μ€ λΈλΌμ°μ νΈνμ±, μ±λ₯ μ΅μ ν, μ κ·Όμ± λ° κ΅μ νμ μΈμ¬ν μ£Όμλ₯Ό κΈ°μΈμ΄λ κ²μ μ’μ κ΄νμΌ λΏλ§ μλλΌ, 보νΈμ μΌλ‘ κΈμ μ μΈ μ¬μ©μ κ²½νμ μ 곡νλ λ° νμμ μ λλ€. μΉ κΈ°μ μ΄ κ³μ λ°μ ν¨μ λ°λΌ, μ μ°νκ³ μ§κ΄μ μ΄λ©° μ μΈκ³μ μΌλ‘ 곡κ°λλ₯Ό νμ±νλ μ λλ©μ΄μ μ κ°λ₯μ±μ κ³μν΄μ νμ₯λ κ²μ λλ€.
μ€ν κ°λ₯ν ν΅μ°°λ ₯:
- λ¨μνκ² μμνμΈμ: κΈ°λ³Έμ μΈ SVG κ²½λ‘μ CSS λͺ¨μ κ²½λ‘ μμ±μΌλ‘ μμνμμμ€.
- μ격νκ² ν μ€νΈνμΈμ: λ€μν μ₯μΉ, λΈλΌμ°μ λ° λ€νΈμν¬ μ‘°κ±΄μμ μ λλ©μ΄μ μ νμΈνμμμ€.
- μ κ·Όμ±μ μ°μ μνμΈμ: νμ
prefers-reduced-motion
μ ꡬννμμμ€. - λΌμ΄λΈλ¬λ¦¬λ₯Ό κ³ λ €νμΈμ: 볡μ‘ν νλ‘μ νΈμ κ²½μ°, μ΅μ νλ μ±λ₯κ³Ό κΈ°λ₯μ μν΄ GSAPμ κ°μ κΈ°μ‘΄ μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©νμμμ€.
- μ΅μ μ 보λ₯Ό μ μ§νμΈμ: μ§ννλ μΉ μ λλ©μ΄μ νμ€κ³Ό λΈλΌμ°μ κΈ°λ₯μ μ£Όλͺ©νμμμ€.
μ΄λ¬ν κ°λ μ μλ¬ν¨μΌλ‘μ¨ μΉ λμμΈμ μμ€μ λμ΄κ³ μ μΈκ³ μ¬μ©μλ₯Ό μ¬λ‘μ‘κ³ μ¦κ²κ² νλ μ λλ©μ΄μ μ λ§λ€ μ μμ΅λλ€.