SVG Path Morphing

최초 작성일: 2025. 03. 31.

개요

코드로 SVG Morphing 제어하기

최근 결과물

시작

개인 프로젝트에서 사용할 로딩 인디케이터가 필요했는데 SVG 아이콘들이 차례대로 변형되는 애니메이션 인디케이터를 만들고 싶었다. 이걸 코드가 아닌 다른 방식으로 해결할 수도 있겠지만, 주기적으로 새 아이콘들이 추가되기 때문에 재사용의 편의를 생각하며 코드로 구현할 방법을 찾아보기로 했다.

FFXIV Paladin Job IconFFXIV Monk Job IconFFXIV Warrior Job Icon

이런 SVG 아이콘들이 대상이다

1차 시도: flubber 활용

방법을 찾아보다가 SVG Morphing(SVG Path Morphing이라는 것이 더 정확한 표현이라고 생각한다)에 대해서 알게 되었다. SVG Morphing 기능을 제공하는 라이브러리를 몇 개 찾을 수 있었는데, 내가 보기에 그중 결과물이 가장 자연스러워 보이는 것은 flubber였다.

flubber의 interpolate 함수는 변환 대상의 두 SVG path 사이의 중간 path들을 여러 개 생성해서 애니메이션을 처리할 수 있도록 도와준다. 변환 과정 중간의 path를 계산하는 데에 flubber를 이용했고, 시간에 따른 path 변환 처리 코드를 직접 구현하는 것을 최소화하기 위해 motion 라이브러리를 적극 활용해 다음과 같이 구현했다.

FFXIV Job Icons Loop

flubber를 활용한 방법의 아쉬운 점

2차 시도: Gooey effect 활용

flubber의 경우 자연스러움 측면에서 아쉬운 부분이 있었다. 그러다 우연히 gooey effect 트릭을 알게 되었다. CSS 필터의 blur와 contrast를 이용해 두 SVG가 변형되는 것처럼 보이는 효과를 줄 수 있다.

복잡한 SVG를 대상으로도 flubber의 비해 자연스러운 결과물을 볼 수 있다.

Gooey effect를 활용한 방법의 아쉬운 점

참고