cubic-bezier() defines a custom easing curve for transitions and animations using four numbers — the X and Y of two control handles. cubic-bezier(0.25, 0.1, 0.25, 1) is the default “ease” keyword. Our free cubic-bezier generator ships a draggable visual editor, a live ball-and-square animation that plays the curve, and 14 named presets (ease, ease-in, ease-out, plus the Material Design and iOS spring curves).The default CSS easing keyword (ease) starts slow, accelerates, then slows down — fine for most quick state transitions, but bland for hero animations and microinteractions. cubic-bezier() lets you define an easing curve precisely. Drag the curve to start fast and end slow, overshoot the target, anticipate before moving, or stay still then snap into place. The right easing turns a generic UI into one that feels intentional.
The challenge is that bezier coordinates are unreadable. cubic-bezier(0.4, 0, 0.2, 1) is Material Design’s standard curve. cubic-bezier(0.68, -0.55, 0.265, 1.55) is “back” easing with overshoot. You can’t picture either by reading the numbers. Our cubic-bezier generator shows the curve graphically with two draggable handles, animates a sample element with each curve change, and outputs the CSS in real time.
The 14 named presets and what they feel like
| Preset | Bezier values | Feel |
|---|---|---|
linear |
0, 0, 1, 1 | Constant speed — for indeterminate spinners |
ease |
0.25, 0.1, 0.25, 1 | Default — smooth, slightly weighted near end |
ease-in |
0.42, 0, 1, 1 | Slow start, fast end — for elements leaving |
ease-out |
0, 0, 0.58, 1 | Fast start, slow end — for elements entering |
ease-in-out |
0.42, 0, 0.58, 1 | Symmetric — for back-and-forth movement |
| Material Standard | 0.4, 0, 0.2, 1 | Material Design 3 default |
| iOS Default | 0.25, 0.46, 0.45, 0.94 | Native iOS feel — close to ease-out |
| Back (overshoot) | 0.68, -0.55, 0.265, 1.55 | Anticipates and overshoots — playful |
| Snap | 0.9, 0, 0.1, 1 | Holds, then snaps in — for confident states |
How the curve works (in human terms)
The four numbers in cubic-bezier(x1, y1, x2, y2) are the X and Y of two control handles between the start (always 0,0) and end (always 1,1) of the curve. The X axis is time (0 = start, 1 = end of the duration). The Y axis is progress (0 = initial position, 1 = final position). The handles pull the curve in the direction of their position — drag a handle up and the curve overshoots; drag it down and the curve eases.
X must be between 0 and 1; Y can go above 1 (overshoot) or below 0 (anticipate). The visual editor enforces the X constraint and lets Y go outside the box for those expressive curves.
How to design a bezier curve in your browser
- Open the cubic-bezier generator
- Pick a preset (or start from ease) and drag the two handles to shape the curve
- Watch the live preview — a square moves left-to-right with the easing applied
- Adjust the duration (250ms to 2s) and the curve in tandem to land on the right feel
- Click Copy CSS to grab the
transition-timing-functiondeclaration
Where the bezier value goes in real CSS
Two places use it: transition-timing-function and animation-timing-function. Inside the transition shorthand:
.button {
transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1);
}
.button:hover {
transform: translateY(-2px);
}
For keyframe animations, set the timing function on the animation as a whole or per keyframe (@keyframes entries can have their own timing function for staged easing).
Common gotchas
- linear-with-overrides for staged motion. If you need different easing per phase of an animation, use
linear()(CSS Easing 2 — Chrome 113+) which lets you describe a polyline of stops, or chain multiple keyframes with their own timing functions. - Overshoot Y values can break perceived motion. A curve with Y > 1 returns the element past its target, then back. For “natural” overshoot, keep the second Y between 1.05 and 1.2; higher than 1.5 looks cartoony.
- Don’t animate
top,left, orwidth. These trigger layout. Always animatetransformandopacityfor 60fps performance, regardless of the easing curve. - iOS spring physics aren’t bezier curves. Native iOS uses spring-physics easing (mass, stiffness, damping). The closest CSS approximation is
cubic-bezier(0.25, 0.46, 0.45, 0.94)for the standard iOS feel, but real spring curves bounce; bezier curves don’t. - steps() is not bezier. The
steps()timing function produces discrete jumps for sprite animations. It’s a different family fromcubic-bezier()— pick one based on whether you want continuous motion or a frame-by-frame walk cycle. - Match curve to direction. Use ease-out for elements entering the viewport (they decelerate into place); use ease-in for elements leaving (they accelerate away). Symmetric curves (ease, ease-in-out) are best for scrubbed timelines and back-and-forth states.
When NOT to use cubic-bezier
For physical-feeling spring animations (think iOS sheet open/close), use a JavaScript spring physics library — Framer Motion, react-spring, GSAP — rather than fighting bezier curves to approximate spring damping. For frame-perfect sprite animations, use steps(). For purely linear progress (loading bars, unbounded spinners), linear is simpler and renders identically. For micro-interactions where the curve is barely noticed (under 200ms transitions), the default ease works fine — bezier customisation matters most for animations between 250ms and 1s.
Frequently asked questions
What’s the difference between cubic-bezier and ease keywords?
The keywords (ease, ease-in, ease-out, ease-in-out, linear) are predefined cubic-bezier curves. cubic-bezier() lets you define any curve. The keywords cover 80% of cases; you reach for cubic-bezier() when you want a specific feel like Material Design’s standard curve or playful overshoot.
Can the bezier handles go outside the 0–1 box?
Y can — values above 1 produce overshoot; below 0 produce anticipation (the element moves backward briefly before going forward). X cannot — it must be between 0 and 1, since X represents time. The visual editor enforces this constraint.
Should I use cubic-bezier for everything?
No. Use ease-out for entering elements, ease-in for leaving, ease-in-out for symmetric motion, and reach for custom cubic-bezier() when you need a specific brand feel (Material, iOS) or expressive overshoot. Most apps standardise on 1–3 custom curves project-wide for consistency.
What’s the new linear() function?
CSS Easing 2’s linear() (Chrome 113+, Safari 17.2+) lets you describe a polyline of stops — useful for approximating spring physics or staged motion in a single CSS rule. It’s not a replacement for cubic-bezier() for typical UI transitions; it’s a new tool for complex timelines.
Is my data uploaded?
No. The generator runs in your browser. Your curve values, preview animation, and downloaded CSS stay on your device.
Does cubic-bezier work on all browsers?
Yes — universal support since Chrome 4 (2010), Firefox 4, Safari 4. It’s one of the safest CSS features. Even mobile browsers have stable rendering.
Related tools and guides
- CSS Cubic Bezier Generator
- CSS Loader Generator
- CSS Gradient Generator
- CSS Glassmorphism Generator
- All CSS tools
![Cubic Bezier Generator: CSS Easing Curves [2026]](https://simpletool.io/blog/wp-content/uploads/2026/05/cubic-bezier-generator.png)
![JWT Decoder Online: Inspect Tokens in Browser [2026]](https://simpletool.io/blog/wp-content/uploads/2026/05/jwt-decoder-online.png)
![URL Slug Generator: SEO-Friendly URLs in Seconds [2026]](https://simpletool.io/blog/wp-content/uploads/2026/05/url-slug-generator.png)
![HTML Minifier: Compress HTML Safely in Browser [2026]](https://simpletool.io/blog/wp-content/uploads/2026/05/html-minifier.png)
![Base64 Encoder Decoder: Text & Files in Browser [2026]](https://simpletool.io/blog/wp-content/uploads/2026/05/base64-encoder-decoder.png)
![RGB to HEX Converter: Convert Any Color [2026]](https://simpletool.io/blog/wp-content/uploads/2026/05/rgb-to-hex-converter.png)
![Barcode Generator: Code 128, EAN-13, UPC, ITF [2026]](https://simpletool.io/blog/wp-content/uploads/2026/05/barcode-generator.png)
![CSS Minifier: Shrink Stylesheets 30–45% in Browser [2026]](https://simpletool.io/blog/wp-content/uploads/2026/05/css-minifier.png)
![Random Name Picker & List Randomizer Online [2026]](https://simpletool.io/blog/wp-content/uploads/2026/05/list-randomizer.png)
![Blur Face Online: Photo Censor in Browser [2026]](https://simpletool.io/blog/wp-content/uploads/2026/05/blur-face-censor.png)