Design springs and easing curves. Export pure CSS.
Springs ship as linear(). How it works
Keyboard shortcuts
- Space
- Play
- B
- Compare: keep the current curve as B
- 1 – 6
- Switch scene
- C
- Copy the exported code
- ⌘Z / Ctrl+Z
- Undo
- ⇧⌘Z / Ctrl+Shift+Z
- Redo
- Arrow keys
- Move a focused bezier handle (Shift: bigger steps)
- ?
- Show this list
Curve
Load into
Springs
Bezier curves
How to read it
Top row: where the element sits on each frame, so bunched ticks mean slow motion. Bottom row: the same frames in time order, each bar the distance travelled, so the settle is easy to read. Keys are circled.
Critically damped: fastest without overshoot.
s
How long it feels. It fully settles in 588 ms, the exported duration.
Stiffness and damping
Mass is fixed at 1; only the ratio matters.
Preview
Publish changes?
Your edits will be visible to everyone.
CancelPublish
How to read it
Top row: where the element sits on each frame, so bunched ticks mean slow motion. Bottom row: the same frames in time order, each bar the distance travelled, so the settle is easy to read. Keys are circled.
Export
:root {
--ease-snappy: linear(0, 0.0201 2.33%, 0.0834 5.17%, 0.1586 7.67%, 0.4603 16.83%, 0.5555 20.17%, 0.6382 23.5%, 0.7082 26.83%, 0.7666 30.17%, 0.8166 33.67%, 0.8602 37.5%, 0.8992 42%, 0.9296 46.83%, 0.9712 58.5%, 0.9913 73.67%, 1);
--ease-snappy-duration: 588ms;
}
.element {
transition: transform var(--ease-snappy-duration) var(--ease-snappy);
}
/* Browsers without linear() support (pre-2023) fall back to ease-out. */
@supports not (transition-timing-function: linear(0, 1)) {
:root { --ease-snappy: ease-out; }
}16 stops · 213 chars · max error 0.0047