κ²½λ‘ μ’νκ³ λ³ν λ° κ²½λ‘ μ’ν λ³νμ λν ν¬κ΄μ μΈ κ°μ΄λλ‘ CSS λͺ¨μ κ²½λ‘μ κ°λ ₯ν κΈ°λ₯μ νμ©νμΈμ. μ λλ©μ΄μ μ μ λ°νκ² μ μ΄νκ³ λ©μ§ μκ° ν¨κ³Όλ₯Ό λ§λλ λ°©λ²μ μμ보μΈμ.
CSS λͺ¨μ κ²½λ‘ μ’νκ³ λ³ν: κ²½λ‘ μ’ν λ³νμ λν μ¬μΈ΅ λΆμ
CSS λͺ¨μ κ²½λ‘λ₯Ό μ¬μ©νλ©΄ μ§μ λ κ²½λ‘λ₯Ό λ°λΌ HTML μμλ₯Ό μ λλ©μ΄μ ν μ μμ΄ μΉ μ λλ©μ΄μ μ λν μ°½μμ μΈ κ°λ₯μ±μ μΈκ³κ° μ΄λ¦½λλ€. κ·Έλ¬λ λͺ¨μ κ²½λ‘λ₯Ό μ§μ μΌλ‘ λ§μ€ν°νλ €λ©΄ κΈ°λ³Έ μ’νκ³μ μνλ ν¨κ³Όλ₯Ό μ»κΈ° μν΄ μ’νκ³λ₯Ό λ³ννλ λ°©λ²μ μ΄ν΄ν΄μΌ ν©λλ€. μ΄ λ¬Έμμμλ κ²½λ‘ μ’νκ³ λ³ν λ° κ²½λ‘ μ’ν λ³νμ λν ν¬κ΄μ μΈ κ°μ΄λλ₯Ό μ 곡νμ¬ λ©μ§κ³ μ λ°ν μ λλ©μ΄μ μ λ§λ€ μ μλ μ§μμ μ 곡ν©λλ€.
CSS λͺ¨μ κ²½λ‘ μμ± μ΄ν΄
μ’νκ³ λ³νμ λν΄ μμΈν μμ보기 μ μ CSS λͺ¨μ κ²½λ‘λ₯Ό μ μνλ ν΅μ¬ μμ±μ κ°λ΅νκ² μ΄ν΄λ³΄κ² μ΅λλ€.
motion-path: μ΄ μμ±μ μμκ° μ΄λν κ²½λ‘λ₯Ό μ μν©λλ€. λ€μμ ν¬ν¨ν λ€μν κ°μ νμ©ν©λλ€.url(): λ¬Έμ λ΄ λλ μΈλΆ νμΌμ μ μλ SVG κ²½λ‘λ₯Ό μ°Έμ‘°ν©λλ€. μ΄κ²μ΄ κ°μ₯ μΌλ°μ μ΄κ³ μ μ°ν μ κ·Ό λ°©μμ λλ€.path(): κ²½λ‘ λ°μ΄ν° λͺ λ Ή(μ:M10 10 L 100 100)μ μ¬μ©νμ¬ μΈλΌμΈ SVG κ²½λ‘λ₯Ό μ μν©λλ€.geometry-box: κΈ°λ³Έ λͺ¨μ(μ¬κ°ν, μ, νμ)μ λͺ¨μ κ²½λ‘λ‘ μ§μ ν©λλ€.motion-offset: μ΄ μμ±μ λͺ¨μ κ²½λ‘λ₯Ό λ°λΌ μμμ μμΉλ₯Ό κ²°μ ν©λλ€.0%κ°μ μμλ₯Ό κ²½λ‘μ μμ λΆλΆμ λ°°μΉνκ³100%λ λ λΆλΆμ λ°°μΉν©λλ€. 0%μ 100% μ¬μ΄μ κ°μ κ²½λ‘λ₯Ό λ°λΌ λΉλ‘μ μΌλ‘ μμλ₯Ό λ°°μΉν©λλ€.motion-rotation: μμκ° κ²½λ‘λ₯Ό λ°λΌ μ΄λν λ μμμ νμ μ μ μ΄ν©λλ€.auto(μμμ λ°©ν₯μ κ²½λ‘μ μ μ μ λ§μΆ€),auto reverse(μμμ λ°©ν₯μ λ°λ λ°©ν₯μΌλ‘ λ§μΆ€) λλ νΉμ κ°λ κ°(μ:45deg)κ³Ό κ°μ κ°μ νμ©ν©λλ€.
κ²½λ‘ μ’νκ³: μ μ΄λ₯Ό μν κΈ°λ°
κ³ κΈ λͺ¨μ κ²½λ‘ κΈ°μ μ μ¬λ μ΄μ λ κ²½λ‘ μ체μ μ’νκ³λ₯Ό μ΄ν΄νλ λ° μμ΅λλ€. SVG κ²½λ‘ λ°μ΄ν°λ₯Ό μ¬μ©νμ¬ κ²½λ‘λ₯Ό μ μνκ±°λ μΈλΆ SVGλ₯Ό μ°Έμ‘°νλ©΄ κ²½λ‘λ μ체 μ’νκ³ λ΄μ μ μλ©λλ€. μ΄ μ’νκ³λ μ λλ©μ΄μ λλ HTML μμμ λ 립μ μ λλ€.
λ€μκ³Ό κ°μ΄ μ μλ SVG `
<svg width="200" height="200">
<path id="myPath" d="M10 10 C 90 10, 90 90, 10 90" fill="none" stroke="black"/>
</svg>
μ΄ μμμ κ²½λ‘λ 200x200 SVG λ·°ν¬νΈ λ΄μ μ μλ©λλ€. μ’ν M10 10 λ° C 90 10, 90 90, 10 90λ μ΄ SVG μ’νκ³λ₯Ό κΈ°μ€μΌλ‘ ν©λλ€. μ΄ κ²½λ‘λ₯Ό λ°λΌ μ λλ©μ΄μ
λλ μμλ μ΄ μ’νκ³μ λν΄ λ³Έμ§μ μΌλ‘ μμ§ λͺ»ν©λλ€.
λ¬Έμ : μμ λ°©ν₯μ κ²½λ‘μ λ§μΆκΈ°
λͺ¨μ κ²½λ‘μ κ°μ₯ μΌλ°μ μΈ λ¬Έμ μ€ νλλ μμμ λ°©ν₯μ κ²½λ‘μ μ μ μ λ§μΆλ κ²μ λλ€. κΈ°λ³Έμ μΌλ‘ μμκ° μ¬λ°λ₯΄κ² νμ νμ§ μμ λΆμμ°μ€λ½κ±°λ λ°λμ§νμ§ μμ μ λλ©μ΄μ ν¨κ³Όκ° λ°μν μ μμ΅λλ€. μ’νκ³ λ³νμ μ΄ν΄νλ κ²μ΄ μ€μν μ΄μ κ° λ°λ‘ μ¬κΈ°μ μμ΅λλ€.
κ²½λ‘ μ’ν λ³ν: κ°κ²© μ’νκΈ°
κ²½λ‘ μ’ν λ³νμ μμμ μ’νκ³λ₯Ό κ²½λ‘μ μ’νκ³μ μΌμΉνλλ‘ λ³ννλ κ²μ ν¬ν¨ν©λλ€. μ΄λ κ² νλ©΄ μμμ λ°©ν₯μ΄ κ²½λ‘μ λ°©ν₯κ³Ό μ¬λ°λ₯΄κ² μ λ ¬λ©λλ€.
λ€μκ³Ό κ°μ μ¬λ¬ κΈ°μ μ κ²½λ‘ μ’ν λ³νμ μ¬μ©ν μ μμ΅λλ€.
1. `motion-rotation: auto` λλ `motion-rotation: auto reverse` μ¬μ©
μ΄κ²μ κ°μ₯ κ°λ¨ν μ κ·Ό λ°©μμ΄λ©° κΈ°λ³Έμ μΈ μλ리μ€μ μ’ μ’ μΆ©λΆν©λλ€. `auto` κ°μ λΈλΌμ°μ μ μμμ λ°©ν₯μ κ²½λ‘μ μ μ μ μλμΌλ‘ λ§μΆλλ‘ μ§μν©λλ€. `auto reverse`λ μμλ₯Ό λ°λ λ°©ν₯μΌλ‘ μ λ ¬ν©λλ€. μ΄λ μμμ μμ°μ€λ¬μ΄ λ°©ν₯μ΄ κ²½λ‘μ μ ν©ν λ μ μλν©λλ€.
μ:
.element {
motion-path: url(#myPath);
motion-rotation: auto;
animation: move 5s linear infinite;
}
@keyframes move {
to { motion-offset: 100%; }
}
κ³ λ € μ¬ν:
- μ΄ μ κ·Ό λ°©μμ μμμ κΈ°λ³Έ λ°©ν₯μ΄ μ μ νλ€κ³ κ°μ ν©λλ€. μμλ₯Ό λ νμ ν΄μΌ νλ κ²½μ° μΆκ° λ³νμ μ¬μ©ν΄μΌ ν©λλ€.
- λΈλΌμ°μ λ μ’ν λ³νμ μμμ μΌλ‘ μ²λ¦¬ν©λλ€.
2. CSS `transform` μμ± μ μ©
λ³΄λ€ μ λ°ν μ μ΄λ₯Ό μν΄ CSS `transform` μμ±μ μ¬μ©νμ¬ μμμ νμ μ μλμΌλ‘ μ‘°μ ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ μμμ μμ°μ€λ¬μ΄ λ°©ν₯κ³Ό μνλ κ²½λ‘ μ λ ¬ μ¬μ΄μ λͺ¨λ μ€νμ μ 보μ ν μ μμ΅λλ€.
μ:
.element {
motion-path: url(#myPath);
motion-rotation: auto;
transform: rotate(90deg); /* μμλ₯Ό 90λ νμ ν©λλ€. */
animation: move 5s linear infinite;
}
@keyframes move {
to { motion-offset: 100%; }
}
μ΄ μμμλ `transform: rotate(90deg)`λ₯Ό μ¬μ©νμ¬ μμλ₯Ό 90λ νμ νμ΅λλ€. μ΄λ κ² νλ©΄ μμκ° μ΄λν λ κ²½λ‘μ μ¬λ°λ₯΄κ² μ λ ¬λ©λλ€.
κ³ λ € μ¬ν:
- `transform` μμ±μ `motion-rotation: auto`μμ μ 곡νλ μλ νμ μ μΆκ°λ‘ μ μ©λ©λλ€.
- μνλ μ λ ¬μ μ»κΈ° μν΄ λ€μν νμ κ°λλ₯Ό μ€νν΄ λ³΄μΈμ.
3. κ³ κΈ μ’ν λ³νμ μν JavaScript μ¬μ©
볡μ‘ν μλ리μ€λ μμμ λ°©ν₯μ λ§€μ° μ λ°νκ² μ μ΄ν΄μΌ νλ κ²½μ° JavaScriptλ₯Ό μ¬μ©νμ¬ μ’ν λ³νμ μνν μ μμ΅λλ€. μ¬κΈ°μλ κ° μ§μ μμ κ²½λ‘μ μ μ μ νλ‘κ·Έλλ° λ°©μμΌλ‘ κ³μ°νκ³ μμμ μ μ ν νμ λ³νμ μ μ©νλ μμ μ΄ ν¬ν¨λ©λλ€.
κ΄λ ¨ λ¨κ³:
- κ²½λ‘ κΈΈμ΄ κ°μ Έμ€κΈ°: SVG κ²½λ‘ μμμ `getTotalLength()` λ©μλλ₯Ό μ¬μ©νμ¬ κ²½λ‘μ μ΄ κΈΈμ΄λ₯Ό νμΈν©λλ€.
- κ²½λ‘λ₯Ό λ°λΌ μ κ³μ°: `getPointAtLength()` λ©μλλ₯Ό μ¬μ©νμ¬ κ²½λ‘λ₯Ό λ°λΌ νΉμ 거리μμ μ μ μ’νλ₯Ό κ²μν©λλ€.
- μ μ κ³μ°: κ²½λ‘λ₯Ό λ°λΌ λ κ°μ μΈμ ν μ μ¬μ΄μ μ°¨μ΄λ₯Ό μ°Ύμ κ° μ§μ μμ μ μ 벑ν°λ₯Ό κ³μ°ν©λλ€.
- κ°λ κ³μ°: `Math.atan2()`λ₯Ό μ¬μ©νμ¬ λΌλμ λ¨μλ‘ μ μ 벑ν°μ κ°λλ₯Ό κ³μ°ν©λλ€.
- νμ λ³ν μ μ©: κ³μ°λ κ°λλ₯Ό μ¬μ©νμ¬ μμμ `rotate()` λ³νμ μ μ©ν©λλ€.
μ(μ€λͺ ):
const path = document.getElementById('myPath');
const element = document.querySelector('.element');
const pathLength = path.getTotalLength();
function updateElementPosition(progress) {
const point = path.getPointAtLength(progress * pathLength);
const tangentPoint = path.getPointAtLength(Math.min((progress + 0.01) * pathLength, pathLength)); // μ½κ° μμ μ§μ κ°μ Έμ€κΈ°
const angle = Math.atan2(tangentPoint.y - point.y, tangentPoint.x - point.x) * 180 / Math.PI;
element.style.transform = `translate(${point.x}px, ${point.y}px) rotate(${angle}deg)`;
}
// requestAnimationFrameμ μ¬μ©νμ¬ μμμ μμΉλ₯Ό λΆλλ½κ² μ
λ°μ΄νΈν©λλ€.
let animationProgress = 0;
function animate() {
animationProgress += 0.01; // μ λλ©μ΄μ
μλ μ‘°μ
if (animationProgress > 1) animationProgress = 0;
updateElementPosition(animationProgress);
requestAnimationFrame(animate);
}
animate();
κ³ λ € μ¬ν:
- μ΄ μ κ·Ό λ°©μμ κ°μ₯ μ λ°ν μ μ΄λ₯Ό μ 곡νμ§λ§ JavaScript νλ‘κ·Έλλ°μ΄ νμν©λλ€.
- CSS `motion-rotation: auto` λλ `transform`μ μ¬μ©νλ κ²λ³΄λ€ κ³μ° λΉμ©μ΄ λ λ§μ΄ λλλ€.
- νΉν 볡μ‘ν κ²½λ‘ λλ μ λλ©μ΄μ μ κ²½μ° μ±λ₯μ λ―ΈμΉλ μν₯μ μ΅μννλλ‘ μ½λλ₯Ό μ΅μ νν©λλ€.
μ€μ©μ μΈ μ: λͺ¨μ κ²½λ‘μ κΈλ‘λ² μ ν리μΌμ΄μ
CSS λͺ¨μ κ²½λ‘λ μκ°μ μΌλ‘ λ§€λ ₯μ μ΄κ³ λ§€λ ₯μ μΈ λ€μν μ λλ©μ΄μ μ λ§λλ λ° μ¬μ©ν μ μμ΅λλ€. λͺ κ°μ§ μλ λ€μκ³Ό κ°μ΅λλ€.
- λνν μ ν ν¬μ΄: μ£Όμ μμμ κ°μ‘°νλ μ λλ©μ΄μ μμλ‘ μ ν κΈ°λ₯μ μλ΄ν©λλ€. μ΄λ μ μ μκ±°λ μ¬μ΄νΈμμ μ νμ μ μΈκ³μ μΌλ‘ μ 보μ΄λ λ° μ¬μ©ν μ μμ΅λλ€.
- μ λλ©μ΄μ μΈν¬κ·Έλν½: μ λλ©μ΄μ μ°¨νΈμ κ·Έλνλ‘ λ°μ΄ν°λ₯Ό λ§€λ ₯μ μ΄κ³ μκ°μ μΌλ‘ λ§€λ ₯μ μΈ λ°©μμΌλ‘ μ μν©λλ€. μ±μ₯ λλ νλ½μ λνλ΄λ μ λλ©μ΄μ μ μ΄ μλ κΈλ‘λ² κ²½μ λν₯μ 보μ¬μ£Όλ μΈν¬κ·Έλν½μ μμν΄ λ³΄μΈμ.
- λμ λ‘κ³ : μ¬μ©μ μνΈ μμ©μ λ°μνκ±°λ μκ°μ΄ μ§λ¨μ λ°λΌ λ³κ²½λλ μ λλ©μ΄μ λ‘κ³ λ₯Ό λ§λλλ€. μ±μ₯ μ λ΅μ λνλ΄λ κ²½λ‘λ₯Ό λ°λΌ λ³νλλ νμ¬ λ‘κ³ λ κ΅μ μ μΈ μ²μ€μκ² μ΄νν©λλ€.
- μ€ν¬λ‘€ μ λλ©μ΄μ : μ¬μ©μκ° νμ΄μ§λ₯Ό μλλ‘ μ€ν¬λ‘€ν λ μ λλ©μ΄μ μ νΈλ¦¬κ±°νμ¬ λμ± λͺ°μ κ° μκ³ λνν νκ²½μ λ§λλλ€. μλ₯Ό λ€μ΄ μ μΈκ³ μ¬λ¬ λμλ₯Ό μκ°νλ μΉμ¬μ΄νΈμμ μ¬μ©μκ° μ€ν¬λ‘€ν λ κ° λμμ μ λ³΄κ° μ¬λΌμ΄λ μΈλ μ μμ΅λλ€.
- κ²μ κ°λ°: λͺ¨μ κ²½λ‘λ₯Ό μ¬μ©νμ¬ κ²μ μΊλ¦ν°μ κ°μ²΄μ μμ§μμ μ μ΄νμ¬ λμ± μλμ μ΄κ³ λ§€λ ₯μ μΈ κ²μ νλ μ΄λ₯Ό λ§λλλ€. μ΄λ μ μΈκ³ κ²μ κ°λ°μμκ² μ μ©λ©λλ€.
μ±λ₯ κ³ λ € μ¬ν
CSS λͺ¨μ κ²½λ‘λ λ§μ μ΄μ μ μ 곡νμ§λ§ μ±λ₯μ λ―ΈμΉλ μν₯μ κ³ λ €νλ κ²μ΄ μ€μν©λλ€. 볡μ‘ν κ²½λ‘μ μ¦μ μ λ°μ΄νΈλ νΉν λͺ¨λ°μΌ μ₯μΉμμ λΈλΌμ°μ μ λ λλ§ μ±λ₯μ μν₯μ λ―ΈμΉ μ μμ΅λλ€.
λͺ¨μ κ²½λ‘ μ±λ₯μ μ΅μ ννκΈ° μν λͺ κ°μ§ νμ λ€μκ³Ό κ°μ΅λλ€.
- κ²½λ‘ λ¨μν: μνλ μκ°μ ν¨κ³Όλ₯Ό λ¬μ±νλ κ°μ₯ κ°λ¨ν κ²½λ‘ λ°μ΄ν°λ₯Ό μ¬μ©ν©λλ€. λ² μ§μ΄ 곑μ μμ μ μ΄μ μ μλ₯Ό μ€μ λλ€.
- νλμ¨μ΄ κ°μ μ¬μ©: `transform: translateZ(0);` μ€νμΌμ μ μ©νμ¬ μ λλ©μ΄μ λλ μμκ° νλμ¨μ΄ κ°μλλμ§ νμΈν©λλ€. μ΄λ κ² νλ©΄ λΈλΌμ°μ κ° λ λλ§μ GPUλ₯Ό μ¬μ©νλλ‘ κ°μ νμ¬ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
- μ λ°μ΄νΈ λλ°μ΄μ€ λλ μ€λ‘ν: JavaScriptλ₯Ό μ¬μ©νμ¬ μμμ μμΉλ₯Ό μ λ°μ΄νΈνλ κ²½μ° μ λ°μ΄νΈλ₯Ό λλ°μ΄μ€νκ±°λ μ€λ‘ννμ¬ κ³μ° λ° λ λλ§ λΉλλ₯Ό μ€μ λλ€.
- λ€μν μ₯μΉμμ ν μ€νΈ: λ€μν μ₯μΉμ λΈλΌμ°μ μμ μ λλ©μ΄μ μ μ² μ ν ν μ€νΈνμ¬ μ΅μ μ μ±λ₯μ 보μ₯ν©λλ€.
μ κ·Όμ± κ³ λ € μ¬ν
CSS λͺ¨μ κ²½λ‘λ₯Ό μ¬μ©ν λ μ κ·Όμ±μ κ³ λ €νμ¬ μ₯μ κ° μλ μ¬μ©μλ₯Ό ν¬ν¨νμ¬ λͺ¨λ μ¬μ©μκ° μ λλ©μ΄μ μ μ¬μ©ν μ μλλ‘ νλ κ²μ΄ μ€μν©λλ€.
λͺ κ°μ§ μ κ·Όμ± λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€.
- λ체 λ°©λ² μ 곡: μ λλ©μ΄μ μ μ μλ μ 보μ μ‘μΈμ€ν μ μλ λ체 λ°©λ²μ μ 곡ν©λλ€. μλ₯Ό λ€μ΄ μ λλ©μ΄μ μ½ν μΈ μ λν ν μ€νΈ κΈ°λ° μ€λͺ μ μ 곡ν©λλ€.
- κ³Όλν μ λλ©μ΄μ νΌνκΈ°: νμ΄μ§μ μ λλ©μ΄μ μμ μ νν©λλ€. κ³Όλν μ λλ©μ΄μ μ μΌλΆ μ¬μ©μμκ² μ£Όμλ₯Ό μ°λ§νκ² νκ±°λ νΌλμ€λ½κ² ν μ μμ΅λλ€.
- μ¬μ©μ κΈ°λ³Έ μ€μ μ‘΄μ€: λͺ¨μ κ°μμ λν μ¬μ©μμ κΈ°λ³Έ μ€μ μ μ‘΄μ€ν©λλ€. `prefers-reduced-motion` λ―Έλμ΄ μΏΌλ¦¬λ₯Ό μ¬μ©νμ¬ μ¬μ©μκ° λͺ¨μ κ°μλ₯Ό μμ²νλμ§ κ°μ§νκ³ κ·Έμ λ°λΌ μ λλ©μ΄μ μ μ‘°μ ν©λλ€.
- ν€λ³΄λ μ κ·Όμ± λ³΄μ₯: λͺ¨λ λνν μμκ° ν€λ³΄λλ₯Ό ν΅ν΄ μ κ·Όν μ μλμ§ νμΈν©λλ€.
κ²°λ‘ : λ§€λ ₯μ μΈ μΉ κ²½νμ μν λͺ¨μ κ²½λ‘ λ§μ€ν°λ§
CSS λͺ¨μ κ²½λ‘λ λ§€λ ₯μ μ΄κ³ μκ°μ μΌλ‘ λ©μ§ μΉ μ λλ©μ΄μ μ λ§λ€ μ μλ κ°λ ₯ν λ°©λ²μ μ 곡ν©λλ€. κ²½λ‘ μ’νκ³λ₯Ό μ΄ν΄νκ³ κ²½λ‘ μ’ν λ³ν κΈ°μ μ λ§μ€ν°νλ©΄ μ΄ κΈ°μ μ λͺ¨λ μ μ¬λ ₯μ λ°ννκ³ μ§μ μΌλ‘ λλΌμ΄ μΉ κ²½νμ λ§λ€ μ μμ΅λλ€. μλμ μΈ μ ν ν¬μ΄, μ λλ©μ΄μ μΈν¬κ·Έλν½ λλ λ§€νΉμ μΈ κ²μμ ꡬμΆνλ CSS λͺ¨μ κ²½λ‘λ μ°½μμ μΈ λΉμ μ μ€ννλ λ° νμν λꡬλ₯Ό μ 곡ν©λλ€.
μ λλ©μ΄μ μ΄ μ μΈκ³ λͺ¨λ μ¬μ©μμκ² μλ¦λ΅κ³ μ μ©νλλ‘ μ±λ₯κ³Ό μ κ·Όμ±μ μ°μ μμλ₯Ό μ§μ νλ κ²μ μμ§ λ§μΈμ. μΉ κΈ°μ μ΄ κ³μ λ°μ ν¨μ λ°λΌ CSS λͺ¨μ κ²½λ‘μ κ°μ κΈ°μ μ λ§μ€ν°νλ κ²μ μ μΈκ³ μ²μ€μ κ΄μ¬μ μ¬λ‘μ‘λ νμ μ μ΄κ³ λ§€λ ₯μ μΈ μΉ κ²½νμ λ§λλ λ° μ€μν©λλ€.