The transition-timing-function property sets the easing curve of a transition — how the change accelerates across its transition-duration.
The initial value is ease. Keywords like linear and ease-in-out are fixed curves; cubic-bezier() and steps() let you customize. It is not inherited. Pair it with transition-property and duration, or the transition shorthand.
Baseline · Widely available.
Not deprecated. Standard-track CSS. Prefer keyword easings first; add cubic-bezier() or steps() when you need a custom feel. Respect prefers-reduced-motion for large motion.
Use steps(n). The duration is split into n equal intervals.
Here: four stops. The box jumps four times across the track.
end / jump-end. The last jump lands as the transition finishes (default style).
Not a blend. Stepped easing is discrete — great for frame-like effects.
Edge Cases & Pitfalls
If easing looks identical for every keyword, check these first.
duration
Needs a positive duration
With transition-duration: 0s, every timing function looks the same — instant.
bezier
cubic-bezier x values must be 0–1
The first and third parameters (x1, x2) must stay between 0 and 1. Y values may go outside that range for overshoot.
lists
Multiple easings follow transition-property
Comma-separated timing functions map in order to the property list. Too few values repeat; too many are truncated.
steps
steps() is not a smooth blend
It jumps. Use it on purpose for discrete motion; do not expect a soft ease.
a11y
Large motion can distract
Offer shorter or reduced motion under @media (prefers-reduced-motion: reduce) when transitions are large.
Compatibility
Browser Support
transition-timing-function is a browser CSS property for transition easing. Node.js, Deno, and Bun do not apply it.
✓ Baseline · Widely available
transition-timing-function
Keyword easings, cubic-bezier(), and steps() are widely supported across modern browsers. jump-* step keywords are modern; older engines often used start/end.
97%Core support
Google Chrome26+
Full support
Mozilla Firefox16+
Full support
Apple Safari9+
Full support
Microsoft Edge12+
Full support
Opera12.1+
Full support
Samsung Internet1.5+
Full support
Internet Explorer10+
Full support
transition-timing-functionWidely supported
Bottom line: Safe to teach for ease, linear, ease-in/out, cubic-bezier, and classic steps. Prefer unprefixed standard syntax. It is not a runtime API.
Remember
Key Takeaways
Role: shape how a transition accelerates across its duration.
Initial value:ease — natural soft start and finish.
linear vs ease: constant speed versus varying speed.
Custom:cubic-bezier() for curves; steps() for jumps.
One line: duration sets how long; timing-function sets how the speed feels during that time.
Frequently Asked Questions
It sets the easing curve of a transition — how fast the change moves at the start, middle, and end of the duration.
The initial value is ease: slow start, faster middle, slow finish. It equals cubic-bezier(0.25, 0.1, 0.25, 1).
ease varies speed for a more natural feel. linear keeps a constant speed from start to finish.
cubic-bezier(x1, y1, x2, y2) defines a custom curve. x1 and x2 must be between 0 and 1; y values can go outside that range for overshoot.
steps(n) jumps through n equal stops instead of blending smoothly — useful for frame-like or discrete motion.
It is Baseline Widely available across modern browsers. It is a browser CSS property, not a Node.js feature.