countup.js
Advanced tools
Comparing version 1.8.2 to 1.8.3
358
countUp.js
/* | ||
countUp.js | ||
by @inorganik | ||
countUp.js | ||
by @inorganik | ||
@@ -17,183 +17,207 @@ */ | ||
// make sure requestAnimationFrame and cancelAnimationFrame are defined | ||
// polyfill for browsers without native support | ||
// by Opera engineer Erik Möller | ||
var lastTime = 0; | ||
var vendors = ['webkit', 'moz', 'ms', 'o']; | ||
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { | ||
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; | ||
window.cancelAnimationFrame = | ||
window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; | ||
} | ||
if (!window.requestAnimationFrame) { | ||
window.requestAnimationFrame = function(callback, element) { | ||
var currTime = new Date().getTime(); | ||
var timeToCall = Math.max(0, 16 - (currTime - lastTime)); | ||
var id = window.setTimeout(function() { callback(currTime + timeToCall); }, | ||
timeToCall); | ||
lastTime = currTime + timeToCall; | ||
return id; | ||
}; | ||
} | ||
if (!window.cancelAnimationFrame) { | ||
window.cancelAnimationFrame = function(id) { | ||
clearTimeout(id); | ||
}; | ||
} | ||
// make sure requestAnimationFrame and cancelAnimationFrame are defined | ||
// polyfill for browsers without native support | ||
// by Opera engineer Erik Möller | ||
var lastTime = 0; | ||
var vendors = ['webkit', 'moz', 'ms', 'o']; | ||
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { | ||
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; | ||
window.cancelAnimationFrame = | ||
window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; | ||
} | ||
if (!window.requestAnimationFrame) { | ||
window.requestAnimationFrame = function(callback, element) { | ||
var currTime = new Date().getTime(); | ||
var timeToCall = Math.max(0, 16 - (currTime - lastTime)); | ||
var id = window.setTimeout(function() { callback(currTime + timeToCall); }, | ||
timeToCall); | ||
lastTime = currTime + timeToCall; | ||
return id; | ||
}; | ||
} | ||
if (!window.cancelAnimationFrame) { | ||
window.cancelAnimationFrame = function(id) { | ||
clearTimeout(id); | ||
}; | ||
} | ||
var self = this; | ||
var self = this; | ||
self.version = function () { return '1.8.3'; }; | ||
// default options | ||
self.options = { | ||
useEasing : true, // toggle easing | ||
useGrouping : true, // 1,000,000 vs 1000000 | ||
separator : ',', // character to use as a separator | ||
decimal : '.', // character to use as a decimal | ||
easingFn: null, // optional custom easing closure function, default is Robert Penner's easeOutExpo | ||
formattingFn: null, // optional custom formatting function, default is self.formatNumber below | ||
prefix: '', // optional text before the result | ||
suffix: '' // optional text after the result | ||
}; | ||
// extend default options with passed options object | ||
if (options && typeof options === 'object') { | ||
for (var key in self.options) { | ||
if (options.hasOwnProperty(key)) { | ||
self.options[key] = options[key]; | ||
} | ||
} | ||
} | ||
if (self.options.separator === '') { self.options.useGrouping = false; } | ||
function formatNumber(num) { | ||
num = num.toFixed(self.decimals); | ||
num += ''; | ||
var x, x1, x2, rgx; | ||
x = num.split('.'); | ||
x1 = x[0]; | ||
x2 = x.length > 1 ? self.options.decimal + x[1] : ''; | ||
rgx = /(\d+)(\d{3})/; | ||
if (self.options.useGrouping) { | ||
while (rgx.test(x1)) { | ||
x1 = x1.replace(rgx, '$1' + self.options.separator + '$2'); | ||
} | ||
} | ||
return self.options.prefix + x1 + x2 + self.options.suffix; | ||
} | ||
// Robert Penner's easeOutExpo | ||
function easeOutExpo(t, b, c, d) { | ||
return c * (-Math.pow(2, -10 * t / d) + 1) * 1024 / 1023 + b; | ||
} | ||
function ensureNumber(n) { | ||
return (typeof n === 'number' && !isNaN(n)); | ||
} | ||
// default options | ||
self.options = { | ||
useEasing: true, // toggle easing | ||
useGrouping: true, // 1,000,000 vs 1000000 | ||
separator: ',', // character to use as a separator | ||
decimal: '.', // character to use as a decimal | ||
easingFn: easeOutExpo, // optional custom easing function, default is Robert Penner's easeOutExpo | ||
formattingFn: formatNumber, // optional custom formatting function, default is formatNumber above | ||
prefix: '', // optional text before the result | ||
suffix: '' // optional text after the result | ||
}; | ||
self.version = function () { return '1.8.2'; }; | ||
// extend default options with passed options object | ||
if (options && typeof options === 'object') { | ||
for (var key in self.options) { | ||
if (options.hasOwnProperty(key) && options[key]) { | ||
self.options[key] = options[key]; | ||
} | ||
} | ||
} | ||
self.d = (typeof target === 'string') ? document.getElementById(target) : target; | ||
self.startVal = Number(startVal); | ||
self.endVal = Number(endVal); | ||
self.countDown = (self.startVal > self.endVal); | ||
self.frameVal = self.startVal; | ||
self.decimals = Math.max(0, decimals || 0); | ||
self.dec = Math.pow(10, self.decimals); | ||
self.duration = Number(duration) * 1000 || 2000; | ||
if (self.options.separator === '') self.options.useGrouping = false; | ||
self.formatNumber = function(nStr) { | ||
nStr = nStr.toFixed(self.decimals); | ||
nStr += ''; | ||
var x, x1, x2, rgx; | ||
x = nStr.split('.'); | ||
x1 = x[0]; | ||
x2 = x.length > 1 ? self.options.decimal + x[1] : ''; | ||
rgx = /(\d+)(\d{3})/; | ||
if (self.options.useGrouping) { | ||
while (rgx.test(x1)) { | ||
x1 = x1.replace(rgx, '$1' + self.options.separator + '$2'); | ||
} | ||
} | ||
return self.options.prefix + x1 + x2 + self.options.suffix; | ||
}; | ||
// Robert Penner's easeOutExpo | ||
self.easeOutExpo = function(t, b, c, d) { | ||
return c * (-Math.pow(2, -10 * t / d) + 1) * 1024 / 1023 + b; | ||
}; | ||
self.initialize = function() { | ||
if (self.initialized) return true; | ||
self.d = (typeof target === 'string') ? document.getElementById(target) : target; | ||
if (!self.d) { | ||
console.error('[CountUp] target is null or undefined', self.d); | ||
return false; | ||
} | ||
self.startVal = Number(startVal); | ||
self.endVal = Number(endVal); | ||
// error checks | ||
if (ensureNumber(self.startVal) && ensureNumber(self.endVal)) { | ||
self.decimals = Math.max(0, decimals || 0); | ||
self.dec = Math.pow(10, self.decimals); | ||
self.duration = Number(duration) * 1000 || 2000; | ||
self.countDown = (self.startVal > self.endVal); | ||
self.frameVal = self.startVal; | ||
self.initialized = true; | ||
return true; | ||
} | ||
else { | ||
console.error('[CountUp] startVal or endVal is not a number', self.startVal, self.endVal); | ||
return false; | ||
} | ||
}; | ||
self.easingFn = self.options.easingFn ? self.options.easingFn : self.easeOutExpo; | ||
self.formattingFn = self.options.formattingFn ? self.options.formattingFn : self.formatNumber; | ||
// Print value to target | ||
self.printValue = function(value) { | ||
var result = self.options.formattingFn(value); | ||
// Print value to target | ||
self.printValue = function(value) { | ||
var result = self.formattingFn(value); | ||
if (self.d.tagName === 'INPUT') { | ||
this.d.value = result; | ||
} | ||
else if (self.d.tagName === 'text' || self.d.tagName === 'tspan') { | ||
this.d.textContent = result; | ||
} | ||
else { | ||
this.d.innerHTML = result; | ||
} | ||
}; | ||
if (self.d.tagName === 'INPUT') { | ||
this.d.value = result; | ||
} | ||
else if (self.d.tagName === 'text' || self.d.tagName === 'tspan') { | ||
this.d.textContent = result; | ||
} | ||
else { | ||
this.d.innerHTML = result; | ||
} | ||
}; | ||
self.count = function(timestamp) { | ||
self.count = function(timestamp) { | ||
if (!self.startTime) { self.startTime = timestamp; } | ||
if (!self.startTime) { self.startTime = timestamp; } | ||
self.timestamp = timestamp; | ||
var progress = timestamp - self.startTime; | ||
self.remaining = self.duration - progress; | ||
self.timestamp = timestamp; | ||
var progress = timestamp - self.startTime; | ||
self.remaining = self.duration - progress; | ||
// to ease or not to ease | ||
if (self.options.useEasing) { | ||
if (self.countDown) { | ||
self.frameVal = self.startVal - self.options.easingFn(progress, 0, self.startVal - self.endVal, self.duration); | ||
} else { | ||
self.frameVal = self.options.easingFn(progress, self.startVal, self.endVal - self.startVal, self.duration); | ||
} | ||
} else { | ||
if (self.countDown) { | ||
self.frameVal = self.startVal - ((self.startVal - self.endVal) * (progress / self.duration)); | ||
} else { | ||
self.frameVal = self.startVal + (self.endVal - self.startVal) * (progress / self.duration); | ||
} | ||
} | ||
// to ease or not to ease | ||
if (self.options.useEasing) { | ||
if (self.countDown) { | ||
self.frameVal = self.startVal - self.easingFn(progress, 0, self.startVal - self.endVal, self.duration); | ||
} else { | ||
self.frameVal = self.easingFn(progress, self.startVal, self.endVal - self.startVal, self.duration); | ||
} | ||
} else { | ||
if (self.countDown) { | ||
self.frameVal = self.startVal - ((self.startVal - self.endVal) * (progress / self.duration)); | ||
} else { | ||
self.frameVal = self.startVal + (self.endVal - self.startVal) * (progress / self.duration); | ||
} | ||
} | ||
// don't go past endVal since progress can exceed duration in the last frame | ||
if (self.countDown) { | ||
self.frameVal = (self.frameVal < self.endVal) ? self.endVal : self.frameVal; | ||
} else { | ||
self.frameVal = (self.frameVal > self.endVal) ? self.endVal : self.frameVal; | ||
} | ||
// don't go past endVal since progress can exceed duration in the last frame | ||
if (self.countDown) { | ||
self.frameVal = (self.frameVal < self.endVal) ? self.endVal : self.frameVal; | ||
} else { | ||
self.frameVal = (self.frameVal > self.endVal) ? self.endVal : self.frameVal; | ||
} | ||
// decimal | ||
self.frameVal = Math.round(self.frameVal*self.dec)/self.dec; | ||
// decimal | ||
self.frameVal = Math.round(self.frameVal*self.dec)/self.dec; | ||
// format and print value | ||
self.printValue(self.frameVal); | ||
// format and print value | ||
self.printValue(self.frameVal); | ||
// whether to continue | ||
if (progress < self.duration) { | ||
self.rAF = requestAnimationFrame(self.count); | ||
} else { | ||
if (self.callback) self.callback(); | ||
} | ||
}; | ||
// start your animation | ||
self.start = function(callback) { | ||
if (!self.initialize()) return; | ||
self.callback = callback; | ||
self.rAF = requestAnimationFrame(self.count); | ||
}; | ||
// toggles pause/resume animation | ||
self.pauseResume = function() { | ||
if (!self.paused) { | ||
self.paused = true; | ||
cancelAnimationFrame(self.rAF); | ||
} else { | ||
self.paused = false; | ||
delete self.startTime; | ||
self.duration = self.remaining; | ||
self.startVal = self.frameVal; | ||
requestAnimationFrame(self.count); | ||
} | ||
}; | ||
// reset to startVal so animation can be run again | ||
self.reset = function() { | ||
self.paused = false; | ||
delete self.startTime; | ||
self.initialized = false; | ||
if (self.initialize()) { | ||
cancelAnimationFrame(self.rAF); | ||
self.printValue(self.startVal); | ||
} | ||
}; | ||
// pass a new endVal and start animation | ||
self.update = function (newEndVal) { | ||
if (!self.initialize()) return; | ||
cancelAnimationFrame(self.rAF); | ||
self.paused = false; | ||
delete self.startTime; | ||
self.startVal = self.frameVal; | ||
self.endVal = Number(newEndVal); | ||
if (ensureNumber(self.endVal)) { | ||
self.countDown = (self.startVal > self.endVal); | ||
self.rAF = requestAnimationFrame(self.count); | ||
} else { | ||
console.error('[CountUp] update() - new endVal is not a number', newEndVal); | ||
} | ||
}; | ||
// whether to continue | ||
if (progress < self.duration) { | ||
self.rAF = requestAnimationFrame(self.count); | ||
} else { | ||
if (self.callback) { self.callback(); } | ||
} | ||
}; | ||
// start your animation | ||
self.start = function(callback) { | ||
self.callback = callback; | ||
self.rAF = requestAnimationFrame(self.count); | ||
return false; | ||
}; | ||
// toggles pause/resume animation | ||
self.pauseResume = function() { | ||
if (!self.paused) { | ||
self.paused = true; | ||
cancelAnimationFrame(self.rAF); | ||
} else { | ||
self.paused = false; | ||
delete self.startTime; | ||
self.duration = self.remaining; | ||
self.startVal = self.frameVal; | ||
requestAnimationFrame(self.count); | ||
} | ||
}; | ||
// reset to startVal so animation can be run again | ||
self.reset = function() { | ||
self.paused = false; | ||
delete self.startTime; | ||
self.startVal = startVal; | ||
cancelAnimationFrame(self.rAF); | ||
self.printValue(self.startVal); | ||
}; | ||
// pass a new endVal and start animation | ||
self.update = function (newEndVal) { | ||
cancelAnimationFrame(self.rAF); | ||
self.paused = false; | ||
delete self.startTime; | ||
self.startVal = self.frameVal; | ||
self.endVal = Number(newEndVal); | ||
self.countDown = (self.startVal > self.endVal); | ||
self.rAF = requestAnimationFrame(self.count); | ||
}; | ||
// format startVal on initialization | ||
self.printValue(self.startVal); | ||
// format startVal on initialization | ||
if (self.initialize()) self.printValue(self.startVal); | ||
}; |
@@ -14,4 +14,4 @@ | ||
countUp.js | ||
by @inorganik | ||
countUp.js | ||
by @inorganik | ||
@@ -29,183 +29,207 @@ */ | ||
// make sure requestAnimationFrame and cancelAnimationFrame are defined | ||
// polyfill for browsers without native support | ||
// by Opera engineer Erik Möller | ||
var lastTime = 0; | ||
var vendors = ['webkit', 'moz', 'ms', 'o']; | ||
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { | ||
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; | ||
window.cancelAnimationFrame = | ||
window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; | ||
} | ||
if (!window.requestAnimationFrame) { | ||
window.requestAnimationFrame = function(callback, element) { | ||
var currTime = new Date().getTime(); | ||
var timeToCall = Math.max(0, 16 - (currTime - lastTime)); | ||
var id = window.setTimeout(function() { callback(currTime + timeToCall); }, | ||
timeToCall); | ||
lastTime = currTime + timeToCall; | ||
return id; | ||
}; | ||
} | ||
if (!window.cancelAnimationFrame) { | ||
window.cancelAnimationFrame = function(id) { | ||
clearTimeout(id); | ||
}; | ||
} | ||
// make sure requestAnimationFrame and cancelAnimationFrame are defined | ||
// polyfill for browsers without native support | ||
// by Opera engineer Erik Möller | ||
var lastTime = 0; | ||
var vendors = ['webkit', 'moz', 'ms', 'o']; | ||
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { | ||
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; | ||
window.cancelAnimationFrame = | ||
window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; | ||
} | ||
if (!window.requestAnimationFrame) { | ||
window.requestAnimationFrame = function(callback, element) { | ||
var currTime = new Date().getTime(); | ||
var timeToCall = Math.max(0, 16 - (currTime - lastTime)); | ||
var id = window.setTimeout(function() { callback(currTime + timeToCall); }, | ||
timeToCall); | ||
lastTime = currTime + timeToCall; | ||
return id; | ||
}; | ||
} | ||
if (!window.cancelAnimationFrame) { | ||
window.cancelAnimationFrame = function(id) { | ||
clearTimeout(id); | ||
}; | ||
} | ||
var self = this; | ||
var self = this; | ||
self.version = function () { return '1.8.3'; }; | ||
// default options | ||
self.options = { | ||
useEasing : true, // toggle easing | ||
useGrouping : true, // 1,000,000 vs 1000000 | ||
separator : ',', // character to use as a separator | ||
decimal : '.', // character to use as a decimal | ||
easingFn: null, // optional custom easing closure function, default is Robert Penner's easeOutExpo | ||
formattingFn: null, // optional custom formatting function, default is self.formatNumber below | ||
prefix: '', // optional text before the result | ||
suffix: '' // optional text after the result | ||
}; | ||
// extend default options with passed options object | ||
if (options && typeof options === 'object') { | ||
for (var key in self.options) { | ||
if (options.hasOwnProperty(key)) { | ||
self.options[key] = options[key]; | ||
} | ||
} | ||
} | ||
if (self.options.separator === '') { self.options.useGrouping = false; } | ||
function formatNumber(num) { | ||
num = num.toFixed(self.decimals); | ||
num += ''; | ||
var x, x1, x2, rgx; | ||
x = num.split('.'); | ||
x1 = x[0]; | ||
x2 = x.length > 1 ? self.options.decimal + x[1] : ''; | ||
rgx = /(\d+)(\d{3})/; | ||
if (self.options.useGrouping) { | ||
while (rgx.test(x1)) { | ||
x1 = x1.replace(rgx, '$1' + self.options.separator + '$2'); | ||
} | ||
} | ||
return self.options.prefix + x1 + x2 + self.options.suffix; | ||
} | ||
// Robert Penner's easeOutExpo | ||
function easeOutExpo(t, b, c, d) { | ||
return c * (-Math.pow(2, -10 * t / d) + 1) * 1024 / 1023 + b; | ||
} | ||
function ensureNumber(n) { | ||
return (typeof n === 'number' && !isNaN(n)); | ||
} | ||
// default options | ||
self.options = { | ||
useEasing: true, // toggle easing | ||
useGrouping: true, // 1,000,000 vs 1000000 | ||
separator: ',', // character to use as a separator | ||
decimal: '.', // character to use as a decimal | ||
easingFn: easeOutExpo, // optional custom easing function, default is Robert Penner's easeOutExpo | ||
formattingFn: formatNumber, // optional custom formatting function, default is formatNumber above | ||
prefix: '', // optional text before the result | ||
suffix: '' // optional text after the result | ||
}; | ||
self.version = function () { return '1.8.2'; }; | ||
// extend default options with passed options object | ||
if (options && typeof options === 'object') { | ||
for (var key in self.options) { | ||
if (options.hasOwnProperty(key) && options[key]) { | ||
self.options[key] = options[key]; | ||
} | ||
} | ||
} | ||
self.d = (typeof target === 'string') ? document.getElementById(target) : target; | ||
self.startVal = Number(startVal); | ||
self.endVal = Number(endVal); | ||
self.countDown = (self.startVal > self.endVal); | ||
self.frameVal = self.startVal; | ||
self.decimals = Math.max(0, decimals || 0); | ||
self.dec = Math.pow(10, self.decimals); | ||
self.duration = Number(duration) * 1000 || 2000; | ||
if (self.options.separator === '') self.options.useGrouping = false; | ||
self.formatNumber = function(nStr) { | ||
nStr = nStr.toFixed(self.decimals); | ||
nStr += ''; | ||
var x, x1, x2, rgx; | ||
x = nStr.split('.'); | ||
x1 = x[0]; | ||
x2 = x.length > 1 ? self.options.decimal + x[1] : ''; | ||
rgx = /(\d+)(\d{3})/; | ||
if (self.options.useGrouping) { | ||
while (rgx.test(x1)) { | ||
x1 = x1.replace(rgx, '$1' + self.options.separator + '$2'); | ||
} | ||
} | ||
return self.options.prefix + x1 + x2 + self.options.suffix; | ||
}; | ||
// Robert Penner's easeOutExpo | ||
self.easeOutExpo = function(t, b, c, d) { | ||
return c * (-Math.pow(2, -10 * t / d) + 1) * 1024 / 1023 + b; | ||
}; | ||
self.initialize = function() { | ||
if (self.initialized) return true; | ||
self.d = (typeof target === 'string') ? document.getElementById(target) : target; | ||
if (!self.d) { | ||
console.error('[CountUp] target is null or undefined', self.d); | ||
return false; | ||
} | ||
self.startVal = Number(startVal); | ||
self.endVal = Number(endVal); | ||
// error checks | ||
if (ensureNumber(self.startVal) && ensureNumber(self.endVal)) { | ||
self.decimals = Math.max(0, decimals || 0); | ||
self.dec = Math.pow(10, self.decimals); | ||
self.duration = Number(duration) * 1000 || 2000; | ||
self.countDown = (self.startVal > self.endVal); | ||
self.frameVal = self.startVal; | ||
self.initialized = true; | ||
return true; | ||
} | ||
else { | ||
console.error('[CountUp] startVal or endVal is not a number', self.startVal, self.endVal); | ||
return false; | ||
} | ||
}; | ||
self.easingFn = self.options.easingFn ? self.options.easingFn : self.easeOutExpo; | ||
self.formattingFn = self.options.formattingFn ? self.options.formattingFn : self.formatNumber; | ||
// Print value to target | ||
self.printValue = function(value) { | ||
var result = self.options.formattingFn(value); | ||
// Print value to target | ||
self.printValue = function(value) { | ||
var result = self.formattingFn(value); | ||
if (self.d.tagName === 'INPUT') { | ||
this.d.value = result; | ||
} | ||
else if (self.d.tagName === 'text' || self.d.tagName === 'tspan') { | ||
this.d.textContent = result; | ||
} | ||
else { | ||
this.d.innerHTML = result; | ||
} | ||
}; | ||
if (self.d.tagName === 'INPUT') { | ||
this.d.value = result; | ||
} | ||
else if (self.d.tagName === 'text' || self.d.tagName === 'tspan') { | ||
this.d.textContent = result; | ||
} | ||
else { | ||
this.d.innerHTML = result; | ||
} | ||
}; | ||
self.count = function(timestamp) { | ||
self.count = function(timestamp) { | ||
if (!self.startTime) { self.startTime = timestamp; } | ||
if (!self.startTime) { self.startTime = timestamp; } | ||
self.timestamp = timestamp; | ||
var progress = timestamp - self.startTime; | ||
self.remaining = self.duration - progress; | ||
self.timestamp = timestamp; | ||
var progress = timestamp - self.startTime; | ||
self.remaining = self.duration - progress; | ||
// to ease or not to ease | ||
if (self.options.useEasing) { | ||
if (self.countDown) { | ||
self.frameVal = self.startVal - self.options.easingFn(progress, 0, self.startVal - self.endVal, self.duration); | ||
} else { | ||
self.frameVal = self.options.easingFn(progress, self.startVal, self.endVal - self.startVal, self.duration); | ||
} | ||
} else { | ||
if (self.countDown) { | ||
self.frameVal = self.startVal - ((self.startVal - self.endVal) * (progress / self.duration)); | ||
} else { | ||
self.frameVal = self.startVal + (self.endVal - self.startVal) * (progress / self.duration); | ||
} | ||
} | ||
// to ease or not to ease | ||
if (self.options.useEasing) { | ||
if (self.countDown) { | ||
self.frameVal = self.startVal - self.easingFn(progress, 0, self.startVal - self.endVal, self.duration); | ||
} else { | ||
self.frameVal = self.easingFn(progress, self.startVal, self.endVal - self.startVal, self.duration); | ||
} | ||
} else { | ||
if (self.countDown) { | ||
self.frameVal = self.startVal - ((self.startVal - self.endVal) * (progress / self.duration)); | ||
} else { | ||
self.frameVal = self.startVal + (self.endVal - self.startVal) * (progress / self.duration); | ||
} | ||
} | ||
// don't go past endVal since progress can exceed duration in the last frame | ||
if (self.countDown) { | ||
self.frameVal = (self.frameVal < self.endVal) ? self.endVal : self.frameVal; | ||
} else { | ||
self.frameVal = (self.frameVal > self.endVal) ? self.endVal : self.frameVal; | ||
} | ||
// don't go past endVal since progress can exceed duration in the last frame | ||
if (self.countDown) { | ||
self.frameVal = (self.frameVal < self.endVal) ? self.endVal : self.frameVal; | ||
} else { | ||
self.frameVal = (self.frameVal > self.endVal) ? self.endVal : self.frameVal; | ||
} | ||
// decimal | ||
self.frameVal = Math.round(self.frameVal*self.dec)/self.dec; | ||
// decimal | ||
self.frameVal = Math.round(self.frameVal*self.dec)/self.dec; | ||
// format and print value | ||
self.printValue(self.frameVal); | ||
// format and print value | ||
self.printValue(self.frameVal); | ||
// whether to continue | ||
if (progress < self.duration) { | ||
self.rAF = requestAnimationFrame(self.count); | ||
} else { | ||
if (self.callback) self.callback(); | ||
} | ||
}; | ||
// start your animation | ||
self.start = function(callback) { | ||
if (!self.initialize()) return; | ||
self.callback = callback; | ||
self.rAF = requestAnimationFrame(self.count); | ||
}; | ||
// toggles pause/resume animation | ||
self.pauseResume = function() { | ||
if (!self.paused) { | ||
self.paused = true; | ||
cancelAnimationFrame(self.rAF); | ||
} else { | ||
self.paused = false; | ||
delete self.startTime; | ||
self.duration = self.remaining; | ||
self.startVal = self.frameVal; | ||
requestAnimationFrame(self.count); | ||
} | ||
}; | ||
// reset to startVal so animation can be run again | ||
self.reset = function() { | ||
self.paused = false; | ||
delete self.startTime; | ||
self.initialized = false; | ||
if (self.initialize()) { | ||
cancelAnimationFrame(self.rAF); | ||
self.printValue(self.startVal); | ||
} | ||
}; | ||
// pass a new endVal and start animation | ||
self.update = function (newEndVal) { | ||
if (!self.initialize()) return; | ||
cancelAnimationFrame(self.rAF); | ||
self.paused = false; | ||
delete self.startTime; | ||
self.startVal = self.frameVal; | ||
self.endVal = Number(newEndVal); | ||
if (ensureNumber(self.endVal)) { | ||
self.countDown = (self.startVal > self.endVal); | ||
self.rAF = requestAnimationFrame(self.count); | ||
} else { | ||
console.error('[CountUp] update() - new endVal is not a number', newEndVal); | ||
} | ||
}; | ||
// whether to continue | ||
if (progress < self.duration) { | ||
self.rAF = requestAnimationFrame(self.count); | ||
} else { | ||
if (self.callback) { self.callback(); } | ||
} | ||
}; | ||
// start your animation | ||
self.start = function(callback) { | ||
self.callback = callback; | ||
self.rAF = requestAnimationFrame(self.count); | ||
return false; | ||
}; | ||
// toggles pause/resume animation | ||
self.pauseResume = function() { | ||
if (!self.paused) { | ||
self.paused = true; | ||
cancelAnimationFrame(self.rAF); | ||
} else { | ||
self.paused = false; | ||
delete self.startTime; | ||
self.duration = self.remaining; | ||
self.startVal = self.frameVal; | ||
requestAnimationFrame(self.count); | ||
} | ||
}; | ||
// reset to startVal so animation can be run again | ||
self.reset = function() { | ||
self.paused = false; | ||
delete self.startTime; | ||
self.startVal = startVal; | ||
cancelAnimationFrame(self.rAF); | ||
self.printValue(self.startVal); | ||
}; | ||
// pass a new endVal and start animation | ||
self.update = function (newEndVal) { | ||
cancelAnimationFrame(self.rAF); | ||
self.paused = false; | ||
delete self.startTime; | ||
self.startVal = self.frameVal; | ||
self.endVal = Number(newEndVal); | ||
self.countDown = (self.startVal > self.endVal); | ||
self.rAF = requestAnimationFrame(self.count); | ||
}; | ||
// format startVal on initialization | ||
self.printValue(self.startVal); | ||
// format startVal on initialization | ||
if (self.initialize()) self.printValue(self.startVal); | ||
}; | ||
@@ -212,0 +236,0 @@ |
@@ -1,1 +0,1 @@ | ||
!function(a,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t(require,exports,module):a.CountUp=t()}(this,function(a,t,n){var e=function(a,t,n,e,r,i){for(var o=0,s=["webkit","moz","ms","o"],m=0;m<s.length&&!window.requestAnimationFrame;++m)window.requestAnimationFrame=window[s[m]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[s[m]+"CancelAnimationFrame"]||window[s[m]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(a,t){var n=(new Date).getTime(),e=Math.max(0,16-(n-o)),r=window.setTimeout(function(){a(n+e)},e);return o=n+e,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(a){clearTimeout(a)});var u=this;if(u.options={useEasing:!0,useGrouping:!0,separator:",",decimal:".",easingFn:null,formattingFn:null,prefix:"",suffix:""},i&&"object"==typeof i)for(var l in u.options)i.hasOwnProperty(l)&&(u.options[l]=i[l]);""===u.options.separator&&(u.options.useGrouping=!1),u.version=function(){return"1.8.2"},u.d="string"==typeof a?document.getElementById(a):a,u.startVal=Number(t),u.endVal=Number(n),u.countDown=u.startVal>u.endVal,u.frameVal=u.startVal,u.decimals=Math.max(0,e||0),u.dec=Math.pow(10,u.decimals),u.duration=1e3*Number(r)||2e3,u.formatNumber=function(a){a=a.toFixed(u.decimals),a+="";var t,n,e,r;if(t=a.split("."),n=t[0],e=t.length>1?u.options.decimal+t[1]:"",r=/(\d+)(\d{3})/,u.options.useGrouping)for(;r.test(n);)n=n.replace(r,"$1"+u.options.separator+"$2");return u.options.prefix+n+e+u.options.suffix},u.easeOutExpo=function(a,t,n,e){return n*(-Math.pow(2,-10*a/e)+1)*1024/1023+t},u.easingFn=u.options.easingFn?u.options.easingFn:u.easeOutExpo,u.formattingFn=u.options.formattingFn?u.options.formattingFn:u.formatNumber,u.printValue=function(a){var t=u.formattingFn(a);"INPUT"===u.d.tagName?this.d.value=t:"text"===u.d.tagName||"tspan"===u.d.tagName?this.d.textContent=t:this.d.innerHTML=t},u.count=function(a){u.startTime||(u.startTime=a),u.timestamp=a;var t=a-u.startTime;u.remaining=u.duration-t,u.options.useEasing?u.countDown?u.frameVal=u.startVal-u.easingFn(t,0,u.startVal-u.endVal,u.duration):u.frameVal=u.easingFn(t,u.startVal,u.endVal-u.startVal,u.duration):u.countDown?u.frameVal=u.startVal-(u.startVal-u.endVal)*(t/u.duration):u.frameVal=u.startVal+(u.endVal-u.startVal)*(t/u.duration),u.countDown?u.frameVal=u.frameVal<u.endVal?u.endVal:u.frameVal:u.frameVal=u.frameVal>u.endVal?u.endVal:u.frameVal,u.frameVal=Math.round(u.frameVal*u.dec)/u.dec,u.printValue(u.frameVal),t<u.duration?u.rAF=requestAnimationFrame(u.count):u.callback&&u.callback()},u.start=function(a){return u.callback=a,u.rAF=requestAnimationFrame(u.count),!1},u.pauseResume=function(){u.paused?(u.paused=!1,delete u.startTime,u.duration=u.remaining,u.startVal=u.frameVal,requestAnimationFrame(u.count)):(u.paused=!0,cancelAnimationFrame(u.rAF))},u.reset=function(){u.paused=!1,delete u.startTime,u.startVal=t,cancelAnimationFrame(u.rAF),u.printValue(u.startVal)},u.update=function(a){cancelAnimationFrame(u.rAF),u.paused=!1,delete u.startTime,u.startVal=u.frameVal,u.endVal=Number(a),u.countDown=u.startVal>u.endVal,u.rAF=requestAnimationFrame(u.count)},u.printValue(u.startVal)};return e}); | ||
!function(a,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t(require,exports,module):a.CountUp=t()}(this,function(a,t,e){var n=function(a,t,e,n,i,r){function o(a){a=a.toFixed(c.decimals),a+="";var t,e,n,i;if(t=a.split("."),e=t[0],n=t.length>1?c.options.decimal+t[1]:"",i=/(\d+)(\d{3})/,c.options.useGrouping)for(;i.test(e);)e=e.replace(i,"$1"+c.options.separator+"$2");return c.options.prefix+e+n+c.options.suffix}function l(a,t,e,n){return e*(-Math.pow(2,-10*a/n)+1)*1024/1023+t}function s(a){return"number"==typeof a&&!isNaN(a)}for(var u=0,m=["webkit","moz","ms","o"],d=0;d<m.length&&!window.requestAnimationFrame;++d)window.requestAnimationFrame=window[m[d]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[m[d]+"CancelAnimationFrame"]||window[m[d]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(a,t){var e=(new Date).getTime(),n=Math.max(0,16-(e-u)),i=window.setTimeout(function(){a(e+n)},n);return u=e+n,i}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(a){clearTimeout(a)});var c=this;if(c.version=function(){return"1.8.3"},c.options={useEasing:!0,useGrouping:!0,separator:",",decimal:".",easingFn:l,formattingFn:o,prefix:"",suffix:""},r&&"object"==typeof r)for(var f in c.options)r.hasOwnProperty(f)&&r[f]&&(c.options[f]=r[f]);""===c.options.separator&&(c.options.useGrouping=!1),c.initialize=function(){return!!c.initialized||(c.d="string"==typeof a?document.getElementById(a):a,c.d?(c.startVal=Number(t),c.endVal=Number(e),s(c.startVal)&&s(c.endVal)?(c.decimals=Math.max(0,n||0),c.dec=Math.pow(10,c.decimals),c.duration=1e3*Number(i)||2e3,c.countDown=c.startVal>c.endVal,c.frameVal=c.startVal,c.initialized=!0,!0):(console.error("[CountUp] startVal or endVal is not a number",c.startVal,c.endVal),!1)):(console.error("[CountUp] target is null or undefined",c.d),!1))},c.printValue=function(a){var t=c.options.formattingFn(a);"INPUT"===c.d.tagName?this.d.value=t:"text"===c.d.tagName||"tspan"===c.d.tagName?this.d.textContent=t:this.d.innerHTML=t},c.count=function(a){c.startTime||(c.startTime=a),c.timestamp=a;var t=a-c.startTime;c.remaining=c.duration-t,c.options.useEasing?c.countDown?c.frameVal=c.startVal-c.options.easingFn(t,0,c.startVal-c.endVal,c.duration):c.frameVal=c.options.easingFn(t,c.startVal,c.endVal-c.startVal,c.duration):c.countDown?c.frameVal=c.startVal-(c.startVal-c.endVal)*(t/c.duration):c.frameVal=c.startVal+(c.endVal-c.startVal)*(t/c.duration),c.countDown?c.frameVal=c.frameVal<c.endVal?c.endVal:c.frameVal:c.frameVal=c.frameVal>c.endVal?c.endVal:c.frameVal,c.frameVal=Math.round(c.frameVal*c.dec)/c.dec,c.printValue(c.frameVal),t<c.duration?c.rAF=requestAnimationFrame(c.count):c.callback&&c.callback()},c.start=function(a){c.initialize()&&(c.callback=a,c.rAF=requestAnimationFrame(c.count))},c.pauseResume=function(){c.paused?(c.paused=!1,delete c.startTime,c.duration=c.remaining,c.startVal=c.frameVal,requestAnimationFrame(c.count)):(c.paused=!0,cancelAnimationFrame(c.rAF))},c.reset=function(){c.paused=!1,delete c.startTime,c.initialized=!1,c.initialize()&&(cancelAnimationFrame(c.rAF),c.printValue(c.startVal))},c.update=function(a){c.initialize()&&(cancelAnimationFrame(c.rAF),c.paused=!1,delete c.startTime,c.startVal=c.frameVal,c.endVal=Number(a),s(c.endVal)?(c.countDown=c.startVal>c.endVal,c.rAF=requestAnimationFrame(c.count)):console.error("[CountUp] update() - new endVal is not a number",a))},c.initialize()&&c.printValue(c.startVal)};return n}); |
{ | ||
"name": "countup.js", | ||
"description": "Animates a numerical value by counting to it", | ||
"version": "1.8.2", | ||
"version": "1.8.3", | ||
"license": "MIT", | ||
@@ -6,0 +6,0 @@ "main": "./dist/countUp.min.js", |
Sorry, the diff of this file is not supported yet
1034
67270