Create any shape. Animate reveals. No SVG, no extra HTML.
Click any shape to see it previewed and get the copy-paste CSS. All shapes use the same element — just clip-path changes.
0% 0% = top-left corner.
100% 0% = top-right.
100% 100% = bottom-right.
50% 50% = center.
Points connect clockwise to form the visible shape.
polygon() to polygon() shapes with the same number of vertices.
A 4-point polygon can animate to another 4-point polygon. A circle() cannot directly animate to a polygon().
To animate between incompatible shapes, convert both to polygon() and pad with duplicate vertices.
All transitions are CSS-only. Click any demo to replay the animation. Works with transition, @keyframes, and hover.
Points 2 and 4 expand from 0% to 100% — same vertex count so the browser interpolates smoothly.
Perfect for page transitions — a circle expands from the click point. Change at X% Y% to expand from any origin.
Both shapes have 5 vertices — the browser morphs between them smoothly. Duplicate the last point to balance vertex counts.
The right inset collapses from 100% to 0% — creating a wipe. Always wrap in prefers-reduced-motion.
clip-path animations can be visually intense. Wrap them in @media (prefers-reduced-motion: reduce) to set clip-path: none or skip the transition for users who have motion sensitivity settings enabled.
Every pattern below is pure CSS — no SVG files, no extra HTML elements, no image masks.
The bottom-right corner is at 75% while the bottom-left is at 100%. Swap values for opposite diagonal.
Works on <img> elements directly. No wrapper div needed. Shapes are crisp at any resolution.
calc() inside polygon() creates the pointed notch without knowing the element's width.
A negative margin-top on the following section pulls it under the clipped area for a seamless overlap.
clip-path on ::before creates decorative shapes behind elements — no extra HTML, no SVG files needed.
Unlike border-radius, inset() clips the element — allowing smooth animation to other clip-path shapes and working on images without a wrapper.
shape() brings SVG path commands directly into CSS — move, line, curve, arc — with CSS units like px, %, and rem.
It became Baseline (all major browsers) in February 2026. Unlike path(), it supports responsive CSS units.