Last active
March 12, 2021 17:46
-
-
Save jonobr1/a63e07e9cb6b0afc5700 to your computer and use it in GitHub Desktop.
A collection of Easing functions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Port of Penner Easing Equations into human legible dot-notation syntax. | |
* | |
* @author Robert Penner / http://robertpenner.com/easing/ | |
* @author jonobr1 / http://jonobr1.com/ | |
* | |
* License: http://robertpenner.com/easing_terms_of_use.html | |
* | |
*/ | |
(function() { | |
var root = this; | |
var previousEasing = root.Easing || {}; | |
var Easing = root.Easing = { | |
noConflict: function() { | |
root.Easing = previousEasing; | |
return Easing; | |
}, | |
setDefault: function(func) { | |
Easing.defaultEasing = func; | |
return Easing; | |
}, | |
/** | |
* t: Current Time | |
* b: Start Value | |
* c: End Value | |
* d: Duration | |
*/ | |
swing: function (t, b, c, d) { | |
return Easing[Easing.defaultEasing](t, b, c, d); | |
}, | |
Quadratic: { | |
In: function (t, b, c, d) { | |
return c * (t /= d) * t + b; | |
}, | |
Out: function(t, b, c, d) { | |
return -c * (t /= d) * (t - 2) + b; | |
}, | |
InOut: function (t, b, c, d) { | |
if ((t /= d / 2) < 1) return c / 2 * t * t + b; | |
return - c / 2 * ((-- t)*(t - 2) - 1) + b; | |
} | |
}, | |
Cubic: { | |
In: function (t, b, c, d) { | |
return c * (t /= d) * t * t + b; | |
}, | |
Out: function (t, b, c, d) { | |
return c * ((t = t / d - 1) * t * t + 1) + b; | |
}, | |
InOut: function (t, b, c, d) { | |
if ((t /= d / 2) < 1) return c / 2 * t * t * t + b; | |
return c / 2 * ((t -= 2) * t * t + 2) + b; | |
} | |
}, | |
Quartic: { | |
In: function (t, b, c, d) { | |
return c * (t /= d) * t * t * t + b; | |
}, | |
Out: function (t, b, c, d) { | |
return - c * ((t = t / d - 1) * t * t * t - 1) + b; | |
}, | |
InOut: function (t, b, c, d) { | |
if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b; | |
return - c / 2 * ((t -= 2) * t * t * t - 2) + b; | |
} | |
}, | |
Quintic: { | |
In: function (t, b, c, d) { | |
return c * (t /=d ) * t * t * t * t + b; | |
}, | |
Out: function (t, b, c, d) { | |
return c * ((t = t / d - 1) * t * t * t * t + 1) + b; | |
}, | |
InOut: function (t, b, c, d) { | |
if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b; | |
return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; | |
} | |
}, | |
Sine: { | |
In: function (t, b, c, d) { | |
return - c * Math.cos(t / d * (Math.PI / 2)) + c + b; | |
}, | |
Out: function (t, b, c, d) { | |
return c * Math.sin(t / d * (Math.PI / 2)) + b; | |
}, | |
InOut: function (t, b, c, d) { | |
return - c / 2 * (Math.cos(Math.PI * t / d) - 1) + b; | |
} | |
}, | |
Exponential: { | |
In: function (t, b, c, d) { | |
return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b; | |
}, | |
Out: function (t, b, c, d) { | |
return (t == d) ? b + c : c * ( - Math.pow(2, - 10 * t / d) + 1) + b; | |
}, | |
InOut: function (t, b, c, d) { | |
if (t == 0) return b; | |
if (t == d) return b + c; | |
if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b; | |
return c / 2 * ( - Math.pow(2, - 10 * --t) + 2) + b; | |
} | |
}, | |
Circular: { | |
In: function (t, b, c, d) { | |
return - c * (Math.sqrt(1 - (t /= d) * t) - 1) + b; | |
}, | |
Out: function (t, b, c, d) { | |
return c * Math.sqrt(1 - (t = t / d - 1) * t) + b; | |
}, | |
InOut: function (t, b, c, d) { | |
if ((t /= d / 2) < 1) return - c / 2 * (Math.sqrt(1 - t * t) - 1) + b; | |
return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; | |
} | |
}, | |
Elastic: { | |
In: function (t, b, c, d) { | |
var s = 1.70158; | |
var p = 0; | |
var a = c; | |
if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!p) p = d * 0.3; | |
if (a < Math.abs(c)) { | |
a = c; | |
s = p / 4; | |
} | |
else { | |
s = p / ( 2 * Math.PI) * Math.asin(c / a); | |
} | |
return - (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; | |
}, | |
Out: function (t, b, c, d) { | |
var s = 1.70158; | |
var p = 0; | |
var a = c; | |
if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!p) p = d * 0.3; | |
if (a < Math.abs(c)) { | |
a = c; | |
s = p / 4; | |
} | |
else { | |
s = p / (2 * Math.PI) * Math.asin(c / a); | |
} | |
return a * Math.pow(2, - 10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p ) + c + b; | |
}, | |
InOut: function (t, b, c, d) { | |
var s = 1.70158; | |
var p = 0; | |
var a = c; | |
if (t == 0) return b; if ((t /= d / 2) == 2) return b + c; if (!p) p = d * (0.3 * 1.5); | |
if (a < Math.abs(c)) { | |
a = c; | |
s = p / 4; | |
} else { | |
s = p / (2 * Math.PI) * Math.asin(c / a); | |
} | |
if (t < 1) return - 0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; | |
return a*Math.pow(2, - 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p ) * 0.5 + c + b; | |
} | |
}, | |
Back: { | |
In: function (t, b, c, d, s) { | |
if (s == undefined) s = 1.70158; | |
return c * (t /= d) * t * ((s + 1) * t - s) + b; | |
}, | |
Out: function (t, b, c, d, s) { | |
if (s == undefined) s = 1.70158; | |
return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; | |
}, | |
InOut: function (t, b, c, d, s) { | |
if (s == undefined) s = 1.70158; | |
if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; | |
return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; | |
} | |
}, | |
Bounce: { | |
In: function (t, b, c, d) { | |
return c - Easing.OutBounce(d - t, 0, c, d) + b; | |
}, | |
Out: function (t, b, c, d) { | |
if ((t /= d) < (1 / 2.75)) { | |
return c * (7.5625 * t * t) + b; | |
} else if (t < (2 / 2.75)) { | |
return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b; | |
} else if (t < (2.5 / 2.75)) { | |
return c * (7.5625 * (t-=(2.25 / 2.75)) * t + 0.9375) + b; | |
} else { | |
return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b; | |
} | |
}, | |
InOut: function (t, b, c, d) { | |
if (t < d / 2) return Easing.InBounce(t * 2, 0, c, d) * 0.5 + b; | |
return Easing.OutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b; | |
} | |
} | |
}; | |
Easing.setDefault(Easing.Quadratic.Out); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment