CSS Cubic Bezier Generator

Free toolNo sign-up
cubic-bezier(0.34, 1.56, 0.64, 1)
Drag the dots to shape the curve
01 (time)01 (progress)
Live preview · 1.2s loop
Compare against CSS keywords
your curve
linear
ease
ease-in-out
P1(0.34, 1.56)
P2(0.64, 1.00)
Duration1.2s

About this generator

Design CSS easing curves visually — drag two handles on the SVG plot and the cubic-bezier function updates in real time. Live moving-ball preview shows how the curve actually feels. Side-by-side comparison against linear, ease, and ease-in-out lets you A/B test your curve against the standard keywords.

8 curated presets — the 4 CSS keywords (ease / ease-in / ease-out / ease-in-out) plus 4 modern overshoot easings (spring, bounce-out, snap, gentle) calibrated to feel polished. Y-axis extends past 1.0 so you can tune real overshoot springs.

4 export formats — CSS (transition-timing-function + var), SCSS variable, Tailwind config block, JS array for Framer Motion / GSAP / anime.js. Permalink URL persists every adjustment. No login, no watermark, no paywall. Free and MIT-licensed.

Why use this Easing Curve Designer?

Drag-to-design
Visual cubic-bezier editor — grab the two handles, shape the curve. Eyes are better than guessing at numbers like 0.34, 1.56, 0.64, 1.
Live ball animation
Watch your curve in motion at multiple speeds. Spring overshoot, bounce, snap — they're obvious in animation, invisible in numbers.
Side-by-side comparison
Your curve runs alongside CSS keywords (linear, ease, ease-in-out) so you can SEE how it differs from defaults — not guess.
Four export formats
CSS cubic-bezier(), Tailwind config, JS array (Framer Motion / GSAP / anime.js), SCSS variable.

How to design a custom easing curve

01
Pick a preset
Eight starting points: ease, ease-in-out, spring, bounce-out, snap, gentle. Most easings are tweaks of these classics.
02
Drag the handles
Two control points (P1 violet, P2 pink). P1 controls the start of the curve, P2 the end. Y values can go below 0 or above 1 for spring/bounce effects.
03
Watch the ball
Live preview shows your curve animating a ball across the panel. Increase duration to make subtle differences visible.
04
Compare
Comparison strip runs your curve next to linear, ease, and ease-in-out at the same duration. Pick the one that feels right.
05
Export
CSS, Tailwind, JS, or SCSS. Copy or share the URL — the cubic-bezier values encode into the link.

Easing reference

Cubic-bezierKeywordUse for
cubic-bezier(.25,.1,.25,1)easeDefault browser easing — slight ease-in, gentle ease-out. Safe but unmemorable.
cubic-bezier(0,0,1,1)linearConstant velocity. Use for continuous motion (rotation, marquee). Reads as mechanical.
cubic-bezier(.42,0,.58,1)ease-in-outSymmetric S-curve. Use for transitions where both start and end matter equally (modals, drawers).
cubic-bezier(.34,1.56,.64,1)springY > 1 means overshoot. The ball passes the target then settles back — the canonical "delightful" easing for UI.
cubic-bezier(.6,.05,.4,1)snapSharp acceleration, soft landing. Use for "decisive" interactions like dismissing a card.

Common easing patterns

Spring on hover
.button {
  transition: transform 0.4s cubic-bezier(.34, 1.56, .64, 1);
}
.button:hover {
  transform: scale(1.06);
}
Custom easing as a CSS variable
:root {
  --ease-spring: cubic-bezier(.34, 1.56, .64, 1);
  --ease-snap:   cubic-bezier(.6, .05, .4, 1);
}

.modal {
  transition: transform 0.5s var(--ease-spring);
}
Framer Motion / JS
<motion.div
  animate={{ x: 100 }}
  transition={{ duration: 0.6, ease: [0.34, 1.56, 0.64, 1] }}
/>

Pro tips

01
Y can go beyond [0, 1]
Y values above 1 give overshoot (spring), below 0 give pull-back (anticipation). X must stay in [0, 1] — those are time fractions.
02
Slower duration reveals subtlety
A spring at 0.2s looks identical to ease-out. The same spring at 1s reveals its overshoot. Test at the duration you'll actually ship.
03
Spring beats ease for interactions
Hover, tap, drag — these all feel more alive with slight overshoot (spring). Reserve symmetric ease for fades and color transitions.
04
One project, two easings max
Different easings for every component reads as chaos. Pick one for "responsive" (spring) and one for "subtle" (ease-out). Apply consistently.
?

Frequently asked questions

01

Why drag-to-edit instead of typing four numbers?

Because the relationship between (x1, y1, x2, y2) and how the curve FEELS is non-obvious. Setting x1 = 0.34, y1 = 1.56 gives you a spring; setting x1 = 0.34, y1 = -0.56 gives you a recoil. Numerically these look almost identical; visually they're opposite. Drag-to-edit lets you SEE the curve shape and the live moving-ball preview at the same time — you tune by motion, not by math. Once you've got the curve you want, copy the numbers via the export. Most designers never touch the numbers directly.

02

What's an 'overshoot' easing and when should I use it?

An overshoot easing has its Y values exceed 1.0 mid-curve — meaning the animated property briefly goes past its target value before settling back. Spring (0.34, 1.56, 0.64, 1) and bounce-out (0.68, -0.55, 0.27, 1.55) are overshoot easings. Visually: a button scaling from 1.0 to 1.2 with a spring easing briefly goes to ~1.25 before settling at 1.2, giving a satisfying 'pop' that feels alive. Use for: button clicks, modal entrances, success confirmations, drag-and-drop. Don't use for: scroll-triggered reveals (the overshoot looks broken when the scroll position has already passed), continuous loops (the overshoot accumulates uncomfortably).

03

Why are spring and bounce-out useful even though they're 'unnatural' math?

Real-world objects have inertia and momentum — when you push a door it doesn't stop instantly; it overshoots slightly and damps. CSS animations without overshoot easings feel computer-generated; with overshoot easings they feel physical. Apple, Linear, Stripe, Vercel all ship spring-like easings on their interactive elements precisely because users perceive overshoot motion as 'more polished' even when they can't articulate why. The spring physics community calls this the 'illusion of life' — borrowed from Disney animation principles.

04

Can I use these in JS animation libraries like Framer Motion or GSAP?

Yes — the JS export format gives you a 4-element array (e.g. [0.34, 1.56, 0.64, 1]) that Framer Motion, GSAP, anime.js, and react-spring all accept directly as a cubic-bezier easing. Framer Motion: . GSAP: gsap.to(el, { x: 100, ease: 'cubic-bezier(0.34, 1.56, 0.64, 1)' }) (or pass to CustomEase). For react-spring, use {tension, friction} instead — spring physics is calculated, not curve-defined. For motion path / scroll-driven, use ScrollTrigger + the same easing.

05

Why does my Y-axis go to 1.8 instead of stopping at 1?

Standard cubic-bezier curves keep Y between 0 and 1 (linear progress). Overshoot easings need Y values > 1 to produce the 'overshoot the target' effect. The generator's Y slider extends to 1.8 (and to -0.5 for recoil) so you can dial in springs and bounces. CSS itself accepts any Y value — only the X must be in [0, 1] because X represents time progression which can't go backwards. If you stay in the 0-1 Y range, you get a 'natural' easing without overshoot.

06

Is this free for commercial use?

Free, MIT-licensed, zero attribution required, no watermark, no signup. Use on any project — personal, client, enterprise — without permission.

Search CodeFronts

Loading…