The offset-path property defines the route an element follows. That route can be a custom SVG-style path(), a basic shape such as circle(), or none.
Pair it with offset-distance to place or animate the element along the path. offset-rotate and offset-anchor control facing and which point sticks to the path. The initial value is none. It is not inherited, and it creates a stacking context.
Baseline · Formerly motion-path.
Not deprecated. Early drafts used motion-path. Use offset-path in new code. path() and circle() are the safest starters; ray() and some newer shapes still vary by browser.
List the corners. Four percentage points make a rectangle inside the containing box.
The path is the outline. The marker walks each edge in order, then closes the shape.
Percentages are relative to the containing block. Resize the stage and the route scales with it.
Same distance trick. Animating to 100% completes one full lap of the polygon.
Edge Cases & Pitfalls
If the element does not follow a route, one of these is usually why.
none
Default is none
Without a path value, distance has nowhere to travel. Set path(), circle(), or another shape first.
distance
Path alone parks at the start
Initial offset-distance is 0. Animate or change distance to move along the route.
name
Not motion-path anymore
Old drafts used motion-path. Use offset-path in modern CSS. Some demos still show both for legacy.
ray
ray() support varies
Stick to path() and circle() for widest support. Treat ray() and newer shapes as progressive enhancement.
a11y
Respect reduced motion
Looping path animations can distract. Prefer a static distance, or pause motion, when prefers-reduced-motion is reduce.
Compatibility
Browser Support
offset-path is a browser CSS property for Motion Path. Node.js, Deno, and Bun do not apply it.
✓ Baseline · Widely available since 2022
offset-path
Chrome 55+, Firefox 72+, Safari 15.4+, Edge 79+, Opera 42+. Internet Explorer has no native support.
94%Modern browser support
Google Chrome55+ · Desktop & Mobile
Full support
Mozilla Firefox72+ · Desktop & Mobile
Full support
Apple Safari15.4+ · macOS & iOS
Full support
Microsoft Edge79+ · Chromium
Full support
Opera42+ · Modern versions
Full support
Samsung Internet6.2+ · Android
Full support
Internet ExplorerNo support
None
offset-pathWidely supported
Bottom line: Safe for modern demos with path() and circle(). Some values such as ray() and newer basic shapes still have uneven support — check before relying on them.
Remember
Key Takeaways
Role: define the route the element follows.
Starters:path() for custom routes, circle() for orbits.
Motion: animate offset-distance; the path stays fixed.
Default:none. Formerly motion-path. Not inherited.
One line:offset-path draws the route; offset-distance walks it.
Frequently Asked Questions
It defines the route an element follows. Pair it with offset-distance to place or animate the element along that route.
none. With none, there is no motion path and the element stays in normal layout.
Yes. Early drafts used motion-path. Modern browsers use offset-path. Prefer offset-path in new code.
Start with path() for a custom line or curve, or circle() for a simple orbit. Animate offset-distance from 0% to 100% to travel the path.
A path alone parks the element at distance 0. Change or animate offset-distance to move along the path.
It is Baseline and widely available since March 2022: Chrome 55+, Firefox 72+, Safari 15.4+, and Edge 79+. Some values such as ray() have uneven support. It is a browser CSS property, not a Node.js feature.