# d3-ease *Easing* is a method of distorting time to control apparent motion in animation. It is most commonly used for [slow-in, slow-out](https://en.wikipedia.org/wiki/12_basic_principles_of_animation#Slow_In_and_Slow_Out). By easing time, [animated transitions](https://github.com/d3/d3-transition) are smoother and exhibit more plausible motion. The easing types in this module implement the [ease method](#ease_ease), which takes a normalized time *t* and returns the corresponding “eased” time *tʹ*. Both the normalized time and the eased time are typically in the range [0,1], where 0 represents the start of the animation and 1 represents the end; some easing types, such as [elastic](#easeElastic), may return eased times slightly outside this range. A good easing type should return 0 if *t* = 0 and 1 if *t* = 1. See the [easing explorer](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4) for a visual demonstration. These easing types are largely based on work by [Robert Penner](http://robertpenner.com/easing/). ## Installing If you use NPM, `npm install d3-ease`. Otherwise, download the [latest release](https://github.com/d3/d3-ease/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-ease.v1.min.js) or as part of [D3 4.0](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: ```html ``` [Try d3-ease in your browser.](https://tonicdev.com/npm/d3-ease) ## API Reference # ease(t) Given the specified normalized time *t*, typically in the range [0,1], returns the “eased” time *tʹ*, also typically in [0,1]. 0 represents the start of the animation and 1 represents the end. A good implementation returns 0 if *t* = 0 and 1 if *t* = 1. See the [easing explorer](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4) for a visual demonstration. For example, to apply [cubic](#easeCubic) easing: ```js var te = d3.easeCubic(t); ``` Similarly, to apply custom [elastic](#easeElastic) easing: ```js // Before the animation starts, create your easing function. var customElastic = d3.easeElastic.period(0.4); // During the animation, apply the easing function. var te = customElastic(t); ``` # d3.easeLinear(t) [<>](https://github.com/d3/d3-ease/blob/master/src/linear.js "Source") Linear easing; the identity function; *linear*(*t*) returns *t*. [linear](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#linear) # d3.easePolyIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/poly.js#L3 "Source") Polynomial easing; raises *t* to the specified [exponent](#poly_exponent). If the exponent is not specified, it defaults to 3, equivalent to [cubicIn](#easeCubicIn). [polyIn](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#polyIn) # d3.easePolyOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/poly.js#L15 "Source") Reverse polynomial easing; equivalent to 1 - [polyIn](#easePolyIn)(1 - *t*). If the [exponent](#poly_exponent) is not specified, it defaults to 3, equivalent to [cubicOut](#easeCubicOut). [polyOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#polyOut) # d3.easePoly(t) [<>](https://github.com/d3/d3-ease/blob/master/src/poly.js "Source")
# d3.easePolyInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/poly.js#L27 "Source") Symmetric polynomial easing; scales [polyIn](#easePolyIn) for *t* in [0, 0.5] and [polyOut](#easePolyOut) for *t* in [0.5, 1]. If the [exponent](#poly_exponent) is not specified, it defaults to 3, equivalent to [cubic](#easeCubic). [polyInOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#polyInOut) # poly.exponent(e) [<>](https://github.com/d3/d3-ease/blob/master/src/poly.js#L1 "Source") Returns a new polynomial easing with the specified exponent *e*. For example, to create equivalents of [linear](#easeLinear), [quad](#easeQuad), and [cubic](#easeCubic): ```js var linear = d3.easePoly.exponent(1), quad = d3.easePoly.exponent(2), cubic = d3.easePoly.exponent(3); ``` # d3.easeQuadIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/quad.js#L1 "Source") Quadratic easing; equivalent to [polyIn](#easePolyIn).[exponent](#poly_exponent)(2). [quadIn](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#quadIn) # d3.easeQuadOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/quad.js#L5 "Source") Reverse quadratic easing; equivalent to 1 - [quadIn](#easeQuadIn)(1 - *t*). Also equivalent to [polyOut](#easePolyOut).[exponent](#poly_exponent)(2). [quadOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#quadOut) # d3.easeQuad(t) [<>](https://github.com/d3/d3-ease/blob/master/src/quad.js "Source")
# d3.easeQuadInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/quad.js#L9 "Source") Symmetric quadratic easing; scales [quadIn](#easeQuadIn) for *t* in [0, 0.5] and [quadOut](#easeQuadOut) for *t* in [0.5, 1]. Also equivalent to [poly](#easePoly).[exponent](#poly_exponent)(2). [quadInOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#quadInOut) # d3.easeCubicIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/cubic.js#L1 "Source") Cubic easing; equivalent to [polyIn](#easePolyIn).[exponent](#poly_exponent)(3). [cubicIn](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#cubicIn) # d3.easeCubicOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/cubic.js#L5 "Source") Reverse cubic easing; equivalent to 1 - [cubicIn](#easeCubicIn)(1 - *t*). Also equivalent to [polyOut](#easePolyOut).[exponent](#poly_exponent)(3). [cubicOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#cubicOut) # d3.easeCubic(t) [<>](https://github.com/d3/d3-ease/blob/master/src/cubic.js "Source")
# d3.easeCubicInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/cubic.js#L9 "Source") Symmetric cubic easing; scales [cubicIn](#easeCubicIn) for *t* in [0, 0.5] and [cubicOut](#easeCubicOut) for *t* in [0.5, 1]. Also equivalent to [poly](#easePoly).[exponent](#poly_exponent)(3). [cubicInOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#cubicInOut) # d3.easeSinIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/sin.js#L4 "Source") Sinusoidal easing; returns sin(*t*). [sinIn](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#sinIn) # d3.easeSinOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/sin.js#L8 "Source") Reverse sinusoidal easing; equivalent to 1 - [sinIn](#easeSinIn)(1 - *t*). [sinOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#sinOut) # d3.easeSin(t) [<>](https://github.com/d3/d3-ease/blob/master/src/sin.js "Source")
# d3.easeSinInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/sin.js#L12 "Source") Symmetric sinusoidal easing; scales [sinIn](#easeSinIn) for *t* in [0, 0.5] and [sinOut](#easeSinOut) for *t* in [0.5, 1]. [sinInOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#sinInOut) # d3.easeExpIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/exp.js#L1 "Source") Exponential easing; raises 2 to the exponent 10 \* (*t* - 1). [expIn](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#expIn) # d3.easeExpOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/exp.js#L5 "Source") Reverse exponential easing; equivalent to 1 - [expIn](#easeExpIn)(1 - *t*). [expOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#expOut) # d3.easeExp(t) [<>](https://github.com/d3/d3-ease/blob/master/src/exp.js "Source")
# d3.easeExpInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/exp.js#L9 "Source") Symmetric exponential easing; scales [expIn](#easeExpIn) for *t* in [0, 0.5] and [expOut](#easeExpOut) for *t* in [0.5, 1]. [expInOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#expInOut) # d3.easeCircleIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/circle.js#L1 "Source") Circular easing. [circleIn](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#circleIn) # d3.easeCircleOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/circle.js#L5 "Source") Reverse circular easing; equivalent to 1 - [circleIn](#easeCircleIn)(1 - *t*). [circleOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#circleOut) # d3.easeCircle(t) [<>](https://github.com/d3/d3-ease/blob/master/src/circle.js "Source")
# d3.easeCircleInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/circle.js#L9 "Source") Symmetric circular easing; scales [circleIn](#easeCircleIn) for *t* in [0, 0.5] and [circleOut](#easeCircleOut) for *t* in [0.5, 1]. [circleInOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#circleInOut) # d3.easeElasticIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/elastic.js#L5 "Source") Elastic easing, like a rubber band. The [amplitude](#elastic_amplitude) and [period](#elastic_period) of the oscillation are configurable; if not specified, they default to 1 and 0.3, respectively. [elasticIn](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#elasticIn) # d3.easeElastic(t) [<>](https://github.com/d3/d3-ease/blob/master/src/elastic.js "Source")
# d3.easeElasticOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/elastic.js#L18 "Source") Reverse elastic easing; equivalent to 1 - [elasticIn](#easeElasticIn)(1 - *t*). [elasticOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#elasticOut) # d3.easeElasticInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/elastic.js#L31 "Source") Symmetric elastic easing; scales [elasticIn](#easeElasticIn) for *t* in [0, 0.5] and [elasticOut](#easeElasticOut) for *t* in [0.5, 1]. [elasticInOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#elasticInOut) # elastic.amplitude(a) [<>](https://github.com/d3/d3-ease/blob/master/src/elastic.js#L40 "Source") Returns a new elastic easing with the specified amplitude *a*. # elastic.period(p) [<>](https://github.com/d3/d3-ease/blob/master/src/elastic.js#L41 "Source") Returns a new elastic easing with the specified period *p*. # d3.easeBackIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/back.js#L3 "Source") [Anticipatory](https://en.wikipedia.org/wiki/12_basic_principles_of_animation#Anticipation) easing, like a dancer bending his knees before jumping off the floor. The degree of [overshoot](#back_overshoot) is configurable; it not specified, it defaults to 1.70158. [backIn](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#backIn) # d3.easeBackOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/back.js#L15 "Source") Reverse anticipatory easing; equivalent to 1 - [backIn](#easeBackIn)(1 - *t*). [backOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#backOut) # d3.easeBack(t) [<>](https://github.com/d3/d3-ease/blob/master/src/back.js "Source")
# d3.easeBackInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/back.js#L27 "Source") Symmetric anticipatory easing; scales [backIn](#easeBackIn) for *t* in [0, 0.5] and [backOut](#easeBackOut) for *t* in [0.5, 1]. [backInOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#backInOut) # back.overshoot(s) [<>](https://github.com/d3/d3-ease/blob/master/src/back.js#L1 "Source") Returns a new back easing with the specified overshoot *s*. # d3.easeBounceIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/bounce.js#L12 "Source") Bounce easing, like a rubber ball. [bounceIn](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#bounceIn) # d3.easeBounce(t) [<>](https://github.com/d3/d3-ease/blob/master/src/bounce.js "Source")
# d3.easeBounceOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/bounce.js#L16 "Source") Reverse bounce easing; equivalent to 1 - [bounceIn](#easeBounceIn)(1 - *t*). [bounceOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#bounceOut) # d3.easeBounceInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/bounce.js#L20 "Source") Symmetric bounce easing; scales [bounceIn](#easeBounceIn) for *t* in [0, 0.5] and [bounceOut](#easeBounceOut) for *t* in [0.5, 1]. [bounceInOut](http://bl.ocks.org/mbostock/248bac3b8e354a9103c4/#bounceInOut)