offset-path, 왜 필요할까?

CSS 애니메이션 하면 보통 transform: translateX()@keyframes로 직선 이동을 떠올리기 마련입니다. 하지만 곡선, 원, 복잡한 SVG 경로를 따라 요소를 움직이고 싶을 때는 어떻게 해야 할까요?

바로 offset-path 가 그 해결책입니다. 이 속성은 요소가 따라 움직일 경로를 CSS에서 직접 정의할 수 있게 해줍니다. 원래 motion-path라는 이름으로 시작했지만, W3C 스펙이 개정되면서 offset-* 계열로 이름이 변경되었어요. 아직 두 문법 모두 동작하지만, 미래를 위해 offset-path 사용을 권장합니다.

.thing-that-moves {
  /* 구형 문법 (Blink 브라우저, 2015년경) */
  motion-path: path("M 5 5 m -4, 0 a 4,4 0 1,0 8,0 a 4,4 0 1,0 -8,0");
  
  /* 신형 문법 (Chrome 안정화, 2016년 12월경) */
  offset-path: path("M 5 5 m -4, 0 a 4,4 0 1,0 8,0 a 4,4 0 1,0 -8,0");
}

이 속성은 애니메이션 가능한 속성이 아닙니다. 대신 경로를 정의하는 역할을 하고, 실제 움직임은 offset-distance@keyframes로 제어합니다.

CSS offset-path animation on a laptop screen showing a moving element along a path Algorithm Concept Visual

실전 예제: offset-path로 원형 경로 애니메이션

가장 기본적인 사용법을 코드로 먼저 봅시다. 아래는 주황색 원이 원형 경로를 따라 계속 도는 예제입니다.

<div class="circle"></div>
.circle {
  width: 40px;
  height: 40px;
  background: orange;
  border-radius: 50%;
  
  /* SVG 경로: 반지름 4의 원 (좌표계 단위는 픽셀) */
  offset-path: path("M 5 5 m -4, 0 a 4,4 0 1,0 8,0 a 4,4 0 1,0 -8,0");
  
  animation: move 3s linear infinite;
}

@keyframes move {
  100% {
    /* 신형 문법 */
    offset-distance: 100%;
    
    /* 구형 문법 (브라우저 호환성) */
    motion-offset: 100%;
  }
}

⚠️ 주의: offset-distance를 애니메이션할 때, from 키프레임을 생략하면 기본값 0%에서 시작합니다. to 또는 100%만 작성해도 됩니다.

경로 데이터는 어디서 얻나?

SVG 편집 툴(예: Illustrator, Figma)로 곡선을 그리고 d 속성 값을 복사해 path()에 그대로 넣으면 됩니다. CSS로 가져올 때는 단위 없는 값을 사용합니다.

  • HTML 요소에 적용 시 좌표는 픽셀 단위로 해석됩니다.
  • SVG 내부 요소에 적용 시 해당 SVG의 viewBox 좌표계를 따릅니다.

자동 회전 제어: offset-rotate

요소가 경로를 따라갈 때 자동으로 방향을 바꾸는 것이 기본 동작입니다. offset-rotate로 이 동작을 세밀하게 조정할 수 있습니다.

.mover {
  offset-rotate: auto;        /* 기본값: 진행 방향을 향함 */
  offset-rotate: reverse;     /* 반대 방향 */
  offset-rotate: 30deg;       /* 고정 각도 */
  offset-rotate: auto 30deg;  /* 진행 방향 + 30도 회전 */
}

이 기능 덕분에 마치 자동차가 도로를 따라 핸들을 돌리는 듯한 자연스러운 움직임을 표현할 수 있습니다.

Developer writing CSS code for offset-path animation on a modern laptop System Abstract Visual

offset-path의 한계와 주의사항

지원 값의 제한

스펙상으로 offset-pathpath(), none, shape(), url(), circle(), ellipse() 등 여러 값을 지원해야 하지만, 현실적으로 path()none만 제대로 동작합니다. url()로 SVG 내 <path> ID를 참조하는 방식은 아직 브라우저 지원이 불안정합니다.

브라우저 호환성

  • Chrome/Edge: 55+부터 안정적 지원
  • Firefox: 72+부터 지원
  • Safari: 16.0+부터 지원
  • IE: 당연히 미지원

실무 팁: 구형 브라우저를 고려해야 한다면 motion-* 구문도 함께 선언해 두는 것이 안전합니다. 또는 GreenSock(GSAP) 같은 라이브러리를 사용하는 것도 방법입니다.

국내 개발 환경에서의 적용 맥락

한국 웹 개발 현장에서는 아직 offset-path가 널리 쓰이지 않습니다. 대부분 requestAnimationFrame이나 라이브러리에 의존하는 경우가 많죠. 하지만 순수 CSS만으로도 구현할 수 있다는 점에서 성능 최적화 측면에서 이점이 있습니다. 특히 모바일 웹에서 GPU 가속을 활용할 수 있어 부드러운 애니메이션을 구현할 때 유용합니다.

다음 단계 학습 방향

  • Web Animations API: offset-path를 JS로 제어하는 방법을 익히면 동적 경로 변경이 가능해집니다.
  • SMIL 애니메이션: SVG 네이티브 animateMotion과 비교해보면 각각의 장단점을 이해할 수 있습니다.
  • clip-path와의 조합: offset-path로 움직이면서 동시에 clip-path로 마스킹하는 복합 효과에 도전해보세요.

Web animation example with CSS offset-path on a desk setup Developer Related Image

마무리하며

CSS offset-path는 복잡한 경로 애니메이션을 순수 CSS로 해결할 수 있는 강력한 도구입니다. motion-path에서 offset-path로의 명칭 변경으로 혼란을 겪을 수 있지만, 핵심 개념은 동일합니다. SVG 경로 데이터만 준비되면 누구나 쉽게 적용할 수 있어요.

요약:

  1. offset-path로 경로를 정의하고
  2. offset-distance로 진행률을 애니메이션하며
  3. offset-rotate로 방향을 조정한다.

이 글이 도움이 되셨다면, 함께 보면 좋은 글들을 확인해보세요.

함께 보면 좋은 글

근거자료: 이 글의 내용은 CSS-Tricks의 offset-path 알마낙 문서를 기반으로 작성되었습니다.

본 콘텐츠는 신뢰할 수 있는 출처를 바탕으로 AI 도구를 활용하여 초안이 작성되었으며, 편집자의 검토를 거쳐 발행되었습니다. 전문가의 조언을 대체하지 않습니다.