Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

An easing function controls how an animation’s progress changes over time: it can keep motion constant, accelerate or decelerate it, or make it jump between discrete states. It changes the route from the start value to the end value—not those values themselves.

What an easing function changes

Think of an animation as progress moving from 0 to 1 over its duration. The horizontal axis is elapsed time; the vertical axis is how far the animated property has advanced. An easing function maps the time-based input progress to output progress, shaping the animation’s pace.

For example, a 300-millisecond transition can move an element the same distance at every moment, or start slowly and accelerate. Both can have the same duration and endpoints. The easing function determines the change in rate, which can make motion feel deliberate, weighty, or segmented.

How the main CSS easing options compare

Option Output and motion Control and considerations
linear Continuous, constant-rate progress. Simple and predictable; no acceleration or deceleration.
ease, ease-in, ease-out, ease-in-out Continuous cubic Bézier curves that shape acceleration and deceleration. Convenient named curves; use cubic-bezier() for custom control points.
steps() Discrete jumps between output levels. Specify the number of intervals and where jumps occur; suited to frame-like or segmented states.
linear() Continuous piecewise-linear progress with potentially several slopes. Specify output stops and optional input percentages; check browser support for the syntax you use.

What the common ease keywords mean

The CSS keywords are defined curves, not informal descriptions. Their corresponding cubic Bézier values are:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • ease: cubic-bezier(0.25, 0.1, 0.25, 1)
  • ease-in: cubic-bezier(0.42, 0, 1, 1)
  • ease-out: cubic-bezier(0, 0, 0.58, 1)
  • ease-in-out: cubic-bezier(0.42, 0, 0.58, 1)

Choose ease-in when motion should begin gently and accelerate. Choose ease-out when it should start quickly and arrive gently. Choose ease-in-out when both the beginning and ending should be gentle. The general-purpose ease curve also changes speed, but follows its own fixed curve.

How to read cubic-bezier()

A cubic Bézier easing function has fixed endpoints at (0, 0) and (1, 1), plus two author-controlled control points: P1 and P2. CSS writes their coordinates as cubic-bezier(x1, y1, x2, y2). The x coordinates must be between 0 and 1; the y coordinates shape the curve and can extend beyond that range, allowing output progress to overshoot.

In the following example, the transition takes 300 milliseconds and uses the identity curve, so progress is even:

.panel {
  transition: transform 300ms linear;
}

To customize the pace, replace linear with a keyword or a cubic-bezier() value. Adjusting the control points changes how quickly the curve gains or loses progress. The endpoints remain the same, while y values outside the usual 0-to-1 output range can create an overshoot effect.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

When to use steps()

Use a step function when the animation should hold a state and then jump, rather than move smoothly between values. It divides the input time into equal intervals; the position argument determines how the jumps line up with those intervals.

.spinner {
  animation: tick 1s steps(8, end) infinite;
}

This requests eight discrete steps per cycle, with the step position set to end. Step timing is useful for sprite-sheet animation, digital counters, segmented indicators, or any effect whose intermediate states should remain distinct. The related keywords step-start and step-end correspond to steps(1, start) and steps(1, end). Position terms also include jump-start, jump-end, jump-none, jump-both, start, and end.

Rank #4
Blank Flip Book Paper with Holes - 240 Sheets (480 Pages) Flipbook Animation Paper : Works with Flip Book Kit Light Pads: for Drawing, Sketching Supplies/Comic Book Kit - Drawing Paper Animation Kit
  • Complete animation paper set … A great animation starter kit! Our 240 sheet (480 pages) flipbook paper with holes is quality 4.5inch x 2.5inch 120 gsm flippable paper and binding screws!
  • Perfect starter kits ... No more making your own flipbooks with scraps and staples. Our kits come with 2 sizes of binding screws, allowing you to trace and make flipbooks of many different sizes!
  • Individual pages ... Creating your own movies and animation has never been easier. No more limits on your animations that sewn binding books give you - With individual pages YOU get to decide!
  • Tracing made easy ... With our beautiful thick individual pages it is much easier to use with a light source, such as flip book light pads (not included) to trace your animations
  • Easy drawing ... No more spiral binding or pesky sewn book spines getting in your way. Our sketch pad paper is individual and free, just like your stop motion animations
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

What CSS linear() does

CSS Easing Functions Level 2 defines linear() for a piecewise-linear timing curve. Unlike the linear keyword, which keeps one constant rate, this function lets you provide multiple output stops and optional input percentages to change the slope at different points.

animation-timing-function: linear(0, 0.2 30%, 0.8 70%, 1);

Here, the listed output stops describe progress values, and the percentages specify input-progress positions for stops that include them. This is useful when a custom motion needs several distinct rates but does not need a smooth Bézier curve.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Choose an easing function for the motion

  • For steady movement, use linear.
  • For smooth acceleration or deceleration, start with an ease keyword, then use cubic-bezier() if you need more precise control.
  • For motion that must hold discrete frames or states, use steps().
  • For several straight-line changes in rate, consider linear().
  • If overshoot is intended, a custom Bézier curve can provide it; consider whether that effect fits the interface.

There is no universally best easing curve. The right choice depends on whether the motion should feel steady, accelerate, settle gently, or communicate discrete states. For production use, check current browser compatibility for newer linear() syntax and step-position forms; MDN notes that the latest standard syntax is not implemented uniformly everywhere.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.