Skip to content

createMotionPath

Demo

Animates an element along an SVG <path> track. Returns an object with translateX, translateY, and rotate properties to spread into useAnimate options. Part of useSvg.

Usage

Motion path

Spread the object returned by createMotionPath into useAnimate options. The track element must be mounted before calling createMotionPath, so call it inside onMounted.

vue
<script setup lang="ts">
import { onMounted, useTemplateRef } from "vue"
import { useAnimate, useSvg } from "@juleshry/vue-animejs"

const dot = useTemplateRef<HTMLDivElement>("dot")
const track = useTemplateRef<SVGPathElement>("track")

const { createMotionPath } = useSvg()

useAnimate(dot, {
  ...createMotionPath(track),
  duration: 2000,
  ease: "linear",
  loop: true,
})
</script>

<template>
  <div style="position: relative; height: 100px">
    <svg viewBox="0 0 300 100" style="position: absolute; inset: 0; width: 100%; height: 100%">
      <path ref="track" d="M0 50 C75 0, 225 100, 300 50" fill="none" />
    </svg>
    <div ref="dot" style="position: absolute; width: 12px; height: 12px; border-radius: 50%; background: currentColor" />
  </div>
</template>

Path offset

Pass an offset value (01) to start the animation at a specific point along the path instead of the beginning.

vue
<script setup lang="ts">
import { onMounted, useTemplateRef } from "vue"
import { useAnimate, useSvg } from "@juleshry/vue-animejs"

const dot = useTemplateRef<HTMLDivElement>("dot")
const track = useTemplateRef<SVGPathElement>("track")

const { createMotionPath } = useSvg()

useAnimate(dot, {
  // Start halfway along the path
  ...createMotionPath(track, 0.5),
  duration: 2000,
  ease: "linear",
  loop: true,
})
</script>

<template>
  <div style="position: relative; height: 100px">
    <svg viewBox="0 0 300 100" style="position: absolute; inset: 0; width: 100%; height: 100%">
      <path ref="track" d="M0 50 C75 0, 225 100, 300 50" fill="none" />
    </svg>
    <div ref="dot" style="position: absolute; width: 12px; height: 12px; border-radius: 50%; background: currentColor" />
  </div>
</template>

Type Declarations

Show Type Declarations
ts
export interface UseSvgReturn {
  /** Creates a motion-path object from an SVG `<path>`. Spread the result into `useAnimate` options to animate `translateX`, `translateY`, and `rotate` along the path. */
  createMotionPath: (path: MaybeRef<TargetsParam>, offset?: MaybeRef<number>) => ReturnType<typeof svg.createMotionPath>
}

Behavior

  • createMotionPath must be called after the track element is mounted — wrap the call in onMounted or a watcher with flush: 'post'.
  • The returned object contains translateX, translateY, and rotate properties that Anime.js drives along the path geometry. Spread them directly into the options object.
  • The offset parameter shifts the starting position along the path (0 = start, 1 = end). Useful for staggering multiple elements on the same track.

WARNING

createMotionPath spreads into the options object at call time — it is not reactive. If the track element changes after mount, call createMotionPath again with the new ref value.

Source

Github