Created
August 22, 2021 14:18
-
-
Save iprodev/d1878026fb5d6d50b40c1839e9d3f8cc to your computer and use it in GitHub Desktop.
This file contains 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
(function (global, factory) { | |
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : | |
typeof define === 'function' && define.amd ? define(factory) : | |
(global = global || self, global.Animator = factory()); | |
}(this, function () { | |
var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame, | |
cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame, | |
pow = Math.pow, | |
sqrt = Math.sqrt, | |
sin = Math.sin, | |
cos = Math.cos, | |
PI = Math.PI, | |
c1 = 1.70158, | |
c2 = c1 * 1.525, | |
c3 = c1 + 1, | |
c4 = ( 2 * PI ) / 3, | |
c5 = ( 2 * PI ) / 4.5; | |
// x is the fraction of animation progress, in the range 0..1 | |
function bounceOut(x) { | |
var n1 = 7.5625, | |
d1 = 2.75; | |
if ( x < 1/d1 ) { | |
return n1*x*x; | |
} else if ( x < 2/d1 ) { | |
return n1*(x-=(1.5/d1))*x + .75; | |
} else if ( x < 2.5/d1 ) { | |
return n1*(x-=(2.25/d1))*x + .9375; | |
} else { | |
return n1*(x-=(2.625/d1))*x + .984375; | |
} | |
} | |
var easings = { | |
easeInQuad: function (x) { | |
return x * x; | |
}, | |
easeOutQuad: function (x) { | |
return 1 - ( 1 - x ) * ( 1 - x ); | |
}, | |
easeInOutQuad: function (x) { | |
return x < 0.5 ? | |
2 * x * x : | |
1 - pow( -2 * x + 2, 2 ) / 2; | |
}, | |
easeInCubic: function (x) { | |
return x * x * x; | |
}, | |
easeOutCubic: function (x) { | |
return 1 - pow( 1 - x, 3 ); | |
}, | |
easeInOutCubic: function (x) { | |
return x < 0.5 ? | |
4 * x * x * x : | |
1 - pow( -2 * x + 2, 3 ) / 2; | |
}, | |
easeInQuart: function (x) { | |
return x * x * x * x; | |
}, | |
easeOutQuart: function (x) { | |
return 1 - pow( 1 - x, 4 ); | |
}, | |
easeInOutQuart: function (x) { | |
return x < 0.5 ? | |
8 * x * x * x * x : | |
1 - pow( -2 * x + 2, 4 ) / 2; | |
}, | |
easeInQuint: function (x) { | |
return x * x * x * x * x; | |
}, | |
easeOutQuint: function (x) { | |
return 1 - pow( 1 - x, 5 ); | |
}, | |
easeInOutQuint: function (x) { | |
return x < 0.5 ? | |
16 * x * x * x * x * x : | |
1 - pow( -2 * x + 2, 5 ) / 2; | |
}, | |
easeInSine: function (x) { | |
return 1 - cos( x * PI/2 ); | |
}, | |
easeOutSine: function (x) { | |
return sin( x * PI/2 ); | |
}, | |
easeInOutSine: function (x) { | |
return -( cos( PI * x ) - 1 ) / 2; | |
}, | |
easeInExpo: function (x) { | |
return x === 0 ? 0 : pow( 2, 10 * x - 10 ); | |
}, | |
easeOutExpo: function (x) { | |
return x === 1 ? 1 : 1 - pow( 2, -10 * x ); | |
}, | |
easeInOutExpo: function (x) { | |
return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? | |
pow( 2, 20 * x - 10 ) / 2 : | |
( 2 - pow( 2, -20 * x + 10 ) ) / 2; | |
}, | |
easeInCirc: function (x) { | |
return 1 - sqrt( 1 - pow( x, 2 ) ); | |
}, | |
easeOutCirc: function (x) { | |
return sqrt( 1 - pow( x - 1, 2 ) ); | |
}, | |
easeInOutCirc: function (x) { | |
return x < 0.5 ? | |
( 1 - sqrt( 1 - pow( 2 * x, 2 ) ) ) / 2 : | |
( sqrt( 1 - pow( -2 * x + 2, 2 ) ) + 1 ) / 2; | |
}, | |
easeInElastic: function (x) { | |
return x === 0 ? 0 : x === 1 ? 1 : | |
-pow( 2, 10 * x - 10 ) * sin( ( x * 10 - 10.75 ) * c4 ); | |
}, | |
easeOutElastic: function (x) { | |
return x === 0 ? 0 : x === 1 ? 1 : | |
pow( 2, -10 * x ) * sin( ( x * 10 - 0.75 ) * c4 ) + 1; | |
}, | |
easeInOutElastic: function (x) { | |
return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? | |
-( pow( 2, 20 * x - 10 ) * sin( ( 20 * x - 11.125 ) * c5 )) / 2 : | |
pow( 2, -20 * x + 10 ) * sin( ( 20 * x - 11.125 ) * c5 ) / 2 + 1; | |
}, | |
easeInBack: function (x) { | |
return c3 * x * x * x - c1 * x * x; | |
}, | |
easeOutBack: function (x) { | |
return 1 + c3 * pow( x - 1, 3 ) + c1 * pow( x - 1, 2 ); | |
}, | |
easeInOutBack: function (x) { | |
return x < 0.5 ? | |
( pow( 2 * x, 2 ) * ( ( c2 + 1 ) * 2 * x - c2 ) ) / 2 : | |
( pow( 2 * x - 2, 2 ) *( ( c2 + 1 ) * ( x * 2 - 2 ) + c2 ) + 2 ) / 2; | |
}, | |
easeInBounce: function (x) { | |
return 1 - bounceOut( 1 - x ); | |
}, | |
easeOutBounce: bounceOut, | |
easeInOutBounce: function (x) { | |
return x < 0.5 ? | |
( 1 - bounceOut( 1 - 2 * x ) ) / 2 : | |
( 1 + bounceOut( 2 * x - 1 ) ) / 2; | |
} | |
}; | |
return function (options) { | |
var self = this, | |
start, timeFraction; | |
this.options = Object.assign({ | |
easing: "linear", | |
duration: 300, | |
draw: function () {} | |
}, options); | |
this.currentFrame = null; | |
this.progress = null; | |
const tick = function (time) { | |
// timeFraction goes from 0 to 1 | |
timeFraction = (time - start) / options.duration; | |
if (timeFraction > 1) timeFraction = 1; | |
// calculate the current animation state | |
self.progress = (easings[options.easing] ? easings[options.easing] : easings.linear)(timeFraction); | |
options.draw(self.progress); // draw it | |
if (timeFraction < 1) { | |
self.currentFrame = requestAnimationFrame(tick); | |
} | |
}; | |
this.stop = function () { | |
cancelAnimationFrame(self.currentFrame); | |
self.progress = 0; | |
return self; | |
}; | |
this.start = function () { | |
start = performance.now(); | |
self.currentFrame = requestAnimationFrame(tick); | |
return self; | |
}; | |
return this; | |
} | |
})); |
This file contains 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
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="utf-8"> | |
<title>Animator</title> | |
</head> | |
<body> | |
<script type="text/javascript"> | |
// Initiate Animator | |
var animation = new Animator({ | |
duration: 500, | |
easing: 'easeOutExpo', | |
draw: function (progress) { | |
console.log(progress); | |
} | |
}); | |
// Start the animation | |
animation.start(); | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment