Skip to content
Tutorial

CSS와 JavaScript로 SVG 애니메이션: 개발자를 위한 코드 예제 (2026)

CSS 키프레임, GSAP, Framer Motion, 바닐라 JavaScript를 사용한 SVG 애니메이션 실전 코드 예제. 로더, 트랜지션, 호버 효과, 스크롤 애니메이션을 위한 프로덕션 레디 스니펫.

Robin Monteiro2026년 2월 2일2026년 10월 10일8 min
Use this article with an AI assistant:
.md
CSS와 JavaScript로 SVG 애니메이션: 개발자를 위한 코드 예제 (2026)
R
Robin Monteiro

Founder of VectoSolve

Self-taught developer, founder and sole developer of VectoSolve since 2024. He builds the conversion engine and the cutting, embroidery and 3D printing exports.

How this article was made: drafted with AI assistance, then edited and fact-checked before publication. About the author

Image vectorizationCutting machine filesEmbroidery filesSVG
Free previewNo signupFull-quality output

2026년에 SVG 애니메이션이 중요한 이유

SVG 애니메이션은 현대 웹 인터페이스의 중추가 되었습니다. 사용자를 체크아웃 플로우로 안내하는 미묘한 마이크로 인터랙션부터 브랜드 아이덴티티를 정의하는 풀스크린 히어로 애니메이션까지, 애니메이션 SVG는 다른 어떤 포맷도 따라올 수 없는 해상도 독립적이고, 가볍고, 접근성 높은 모션을 제공합니다.

래스터 기반 애니메이션(GIF, 애니메이션 PNG 또는 비디오)과 달리, SVG는 모든 화면 크기에 완벽하게 스케일링되고, 4K 및 Retina 디스플레이에서도 선명하게 유지되며, 이미 알고 있는 CSS와 JavaScript로 조작할 수 있습니다. 2026년, Core Web Vitals가 검색 순위에 직접 영향을 미치는 지금, SVG 애니메이션 마스터는 선택이 아닌 필수입니다.

SVG 애니메이션 기법: CSS, JavaScript, AI 기반 접근 방식

SVG를 위한 CSS 애니메이션 기초

CSS는 SVG 애니메이션을 위한 첫 번째이자 종종 최고의 도구입니다. 브라우저의 컴포지터 스레드가 transform과 opacity 속성의 CSS 애니메이션을 메인 스레드에 영향 없이 처리하여, 부드러운 60fps 성능을 무료로 제공합니다.

CSS 트랜지션: 가장 심플한 접근

.svg-icon {
  transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
  transform-origin: center;
}
.svg-icon:hover {
  transform: scale(1.15);
}

.svg-icon path {
  transition: fill 0.25s ease-in-out, stroke 0.25s ease-in-out;
  fill: #6366f1;
}
.svg-icon:hover path {
  fill: #818cf8;
}

팁: SVG 요소에서는 항상 transform-origin을 명시적으로 설정하세요. 기본적으로 중앙에 설정되는 HTML 요소와 달리, SVG 요소는 기본적으로 SVG 뷰포트 원점(0, 0)을 사용합니다.

CSS 키프레임 애니메이션: 완전한 창의적 제어

@keyframes pulse {
  0% { transform: scale(1); opacity: 1; }
  50% { transform: scale(1.4); opacity: 0.6; }
  100% { transform: scale(1); opacity: 1; }
}
.notification-dot {
  animation: pulse 2s ease-in-out infinite;
  transform-origin: center;
}

@keyframes draw-path {
  from { stroke-dashoffset: 1000; }
  to { stroke-dashoffset: 0; }
}
.draw-line {
  stroke-dasharray: 1000;
  animation: draw-path 2.5s ease-out forwards;
}

stroke-dasharray를 사용한 드로잉 기법은 웹에서 가장 인기 있는 SVG 애니메이션 중 하나입니다. 대시 길이를 경로의 전체 길이와 같게 설정한 다음, 오프셋을 최대값에서 0으로 애니메이션하여 경로가 실시간으로 그려지는 듯한 착시를 만듭니다.

CSS Transform: 성능의 최적 지점

@keyframes spin {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}

@keyframes float-and-rotate {
  0% { transform: translateY(0px) rotate(0deg); }
  25% { transform: translateY(-10px) rotate(5deg); }
  50% { transform: translateY(-18px) rotate(0deg); }
  75% { transform: translateY(-10px) rotate(-5deg); }
  100% { transform: translateY(0px) rotate(0deg); }
}
.floating-element {
  animation: float-and-rotate 4s ease-in-out infinite;
  transform-origin: center;
}

컴포지터 세이프 속성: transform과 opacity만이 컴포지터 스레드에서의 실행이 보장됩니다. fill, stroke, width, height 또는 d를 애니메이션하면 레이아웃 재계산이 트리거됩니다.


JavaScript 애니메이션 접근 방식

CSS가 한계에 도달했을 때 — 동적 값, 스크롤 트리거, 물리 시뮬레이션 또는 복잡한 타임라인 — JavaScript가 인계합니다.

Web Animations API (WAAPI)

const logo = document.querySelector("#svg-logo");

const fadeIn = logo.animate(
  [
    { opacity: 0, transform: "translateY(20px) scale(0.95)" },
    { opacity: 1, transform: "translateY(0) scale(1)" }
  ],
  {
    duration: 800,
    easing: "cubic-bezier(0.22, 1, 0.36, 1)",
    fill: "forwards"
  }
);

fadeIn.finished.then(() => {
  console.log("로고 애니메이션 완료");
  animateSubElements();
});
SVG 애니메이션: 패스 드로잉과 모핑 효과

GSAP: 업계 표준 라이브러리

GreenSock Animation Platform(GSAP)은 2026년에도 가장 검증된 애니메이션 라이브러리입니다. SVG 전용 플러그인이 수백 줄의 커스텀 코드가 필요할 엣지 케이스를 처리합니다.

import { gsap } from "gsap";

gsap.from("#hero-svg", {
  opacity: 0, scale: 0.8, rotation: -5,
  duration: 1.2, ease: "back.out(1.7)",
  transformOrigin: "center center"
});

const tl = gsap.timeline({ defaults: { ease: "power2.out" } });

tl.from("#bg-circle", { scale: 0, duration: 0.6 })
  .from("#icon-paths path", {
    strokeDashoffset: 500, duration: 1, stagger: 0.15
  }, "-=0.3")
  .from("#label-text", { opacity: 0, y: 15, duration: 0.5 }, "-=0.5");

SMIL 애니메이션: 아직 살아있지만, 절제하여 사용

<svg viewBox="0 0 100 100">
  <circle cx="50" cy="50" r="20" fill="#6366f1">
    <animate attributeName="r" values="20;25;20" dur="2s" repeatCount="indefinite" />
    <animate attributeName="opacity" values="1;0.6;1" dur="2s" repeatCount="indefinite" />
  </circle>
</svg>

성능 최적화 심화

/* 좋은 예: 컴포지터 스레드 애니메이션 */
.optimized {
  transition: transform 0.3s, opacity 0.3s;
}
.optimized:hover {
  transform: translateY(-4px) scale(1.02);
  opacity: 0.9;
}

/* 나쁜 예: 메인 스레드 애니메이션 */
.unoptimized {
  transition: top 0.3s, width 0.3s, fill 0.3s;
}

SVG 복잡도 줄이기

  • 패스 단순화: SVGO 또는 VectoSolve의 내장 최적화 도구 사용
  • 숨겨진 요소 제거
  • 그룹 평탄화: 불필요한 <g> 중첩은 오버헤드 추가
  • 반복 형상에 심볼 사용

접근성: 사용자 설정 존중

.animated-element {
  animation: slide-in 0.6s ease-out forwards;
}

@media (prefers-reduced-motion: reduce) {
  .animated-element {
    animation: none;
    opacity: 1;
  }
}
const prefersReduced = window.matchMedia(
  "(prefers-reduced-motion: reduce)"
).matches;

if (prefersReduced) {
  element.style.opacity = "1";
} else {
  element.animate(
    [{ opacity: 0 }, { opacity: 1 }],
    { duration: 600, easing: "ease-out" }
  );
}

WCAG 2.2 성공 기준 2.3.3은 인터랙션으로 트리거되는 모션 애니메이션을 비활성화할 수 있도록 권장합니다. 이는 점점 더 법적 요구사항이 되고 있습니다.


CSS vs JavaScript vs AI: 올바른 접근 방식 선택

기준CSS 애니메이션JavaScript (WAAPI/GSAP)AI (VectoSolve)
설정 복잡도의존성 제로최소 ~ 중간업로드 및 설정
성능우수우수 / 매우 좋음우수
동적 값제한적완전 제어AI가 결정
패스 모핑미지원라이브러리 필요내장
최적 용도호버, 루프, 트랜지션복잡한 인터랙션, 데이터 시각화빠른 프로토타이핑

프레임워크 통합: React와 Next.js

import { useRef, useEffect } from "react";

function AnimatedIcon({ isActive }) {
  const pathRef = useRef(null);

  useEffect(() => {
    const path = pathRef.current;
    if (!path) return;

    const prefersReduced = window.matchMedia(
      "(prefers-reduced-motion: reduce)"
    ).matches;

    if (prefersReduced) {
      path.style.strokeDashoffset = "0";
      return;
    }

    const length = path.getTotalLength();
    path.style.strokeDasharray = length;
    path.style.strokeDashoffset = length;

    const animation = path.animate(
      [{ strokeDashoffset: length }, { strokeDashoffset: 0 }],
      { duration: 1200, easing: "ease-out", fill: "forwards" }
    );

    return () => animation.cancel();
  }, [isActive]);

  return (
    <svg viewBox="0 0 64 64" role="img" aria-label="상태">
      <path ref={pathRef} d="M18 44 L26 32 L34 38 L46 20"
        fill="none" stroke="currentColor" strokeWidth="2.5"
        strokeLinecap="round" />
    </svg>
  );
}

핵심 요점과 다음 단계

  1. CSS로 시작 — 간단한 호버 효과, 로딩 상태, 루프 애니메이션용
  2. Web Animations API로 전환 — 동적 제어나 재생 조작이 필요할 때
  3. GSAP 도입 — 복잡한 타임라인, 스크롤 애니메이션, SVG 모핑용
  4. AI 도구 고려 — 빠른 프로토타이핑에 VectoSolve의 SVG 애니메이터 등
  5. 항상 최적화 — 컴포지터 세이프 속성 사용 및 prefers-reduced-motion 존중

최고의 SVG 애니메이션은 사용자가 거의 인식하지 못하는 것 — 자연스럽게 느껴지고, 즉시 로드되며, 정적인 것을 선호하는 사람들을 위해 우아하게 폴백됩니다.


속성컴포지터 (빠름)레이아웃 트리거 (느림)
transform예 — GPU 가속아니오
opacity예 — GPU 가속아니오
width / height아니오예 — 리플로우 발생
top / left아니오예 — 리플로우 발생
fill / stroke아니오리페인트만 (보통)
Tags:
SVG 애니메이션
CSS 애니메이션
웹 개발
모션 디자인
튜토리얼
Share:

Try VectoSolve Now

Convert your images to high-quality SVG vectors with AI

AI-Powered Vectorization

Ready to vectorize your images?

Convert your PNG, JPG, and other images to high-quality, scalable SVG vectors in seconds.