利用原生JS与jQuery实现数字线性变化的动画
前言
大家应该都有所体会,在一些数据展示的专题页里,有时候希望数字能动态从某一个数变化到另一个数,以此来吸引用户眼球,突出数据。于是有了下文。
在这里,我用了两种方式:一种是原生的JavaScript,另一种是jQuery插件。
数字线性变化的原理很简单,就是让数字增量变化,并循环动画。
原生JS版
首先获取DOM元素。为了兼容到IE6,兼容性方法如下:
vardomUtil={
//获取DOM元素
get:function(query){
var_this=this;
if(document.querySelector){
returndocument.querySelector(query);
}else{
varelements=document;
varqueryStrArray=query.split(/+/);
for(vari=0;i<queryStrArray.length;i++){
vardomName=queryStrArray[i];
elements=_this.getElementsOfParentNode(domName,elements);
}
if(elements.length==1){
returnelements[0];
}else{
returnelements;
}
}
},
//获取DOM元素
getElementsOfParentNode:function(domName,parentNode){
var_this=this;
parentNode=parentNode||document;
domName=domName.trim();
varregExps={
id:/^#/,
class:/^/
};
if(regExps.id.test(domName)){
domName=domName.replace(/^\#/g,"");
returnparentNode.getElementById(domName);
}elseif(regExps.class.test(domName)){
domName=domName.replace(/^./g,"");
return_this.getElementsByClassName(domName,parentNode);
}else{
returnparentNode.getElementsByTagName(domName);
}
},
//获取class元素的兼容方法
getElementsByClassName:function(className,parentNode){
if(parentNode.getElementsByClassName){
returnparentNode.getElementsByClassName(className);
}else{
className=className.replace(/^+|+$/g,"");
varclassArray=className.split(/+/);
vareles=parentNode.getElementsByTagName("*");
for(vari=0;i<classArray.length;i++){
varclassEles=[];
varreg=newRegExp("(^|)"+classArray[i]+"(|$)");
for(varj=0;j<eles.length;j++){
varele=eles[j];
if(reg.test(ele.className)){
classEles.push(ele);
}
}
eles=classEles;
}
returneles;
}
}
};
/*
*数字动画(目前仅支持数字动画的线性变化)
*options参数:
*element{String}DOM元素query字符串
*from{Number}起始数字
*to{Number}终点数字
*duration{Number}动画时间
*callback{Function}数字变化时的回调函数
*/
varanimatingNumber=function(options){
this.element=domUtil.get(options.element);
this.startNum=options.from;
this.endNum=options.to;
this.duration=options.duration||2000;
this.callback=options.callback;
this.timer=null;
};
animatingNumber.prototype={
start:function(){
var_this=this;
_this.animate();
},
stop:function(){
if(this.timer){
clearTimeout(this.timer);
this.timer=null;
}
},
animate:function(){
var_this=this;
varcurNum=_this.startNum;
varanimateTime=0;
varrange=_this.endNum-_this.startNum;
vartimerStep=Math.abs(Math.floor(_this.duration/range));
timerStep=timerStep>20?timerStep:20;
varnumStep=(range/_this.duration)*timerStep;
_this.stop();
(functionanimate(){
_this.timer=setTimeout(function(){
curNum=Math.ceil(curNum+numStep);
if((_this.endNum>_this.startNum&&curNum>=_this.endNum)||(_this.endNum<_this.startNum&&curNum<=_this.endNum)){
curNum=_this.endNum;
}
_this.element.innerText=curNum;
animateTime++;
if(typeofthis.callback=='function'){
this.callback(curNum);
}
animate();
if(curNum>=_this.endNum){
_this.stop();
}
},timerStep);
})();
}
};
animatingNumber.create=function(options){
returnnewanimatingNumber(options);
};
使用:
<p>Number:<spanclass='dynamicNum'>500</span></p>
<script>
animatingNumber.create({
element:'.dynamicNum',
from:1,
to:500,
duration:2000
}).start();
</script>
jQuery插件版
原理同上,只是DOM元素获取使用jQuery方法,并把数字动画方法封装成jQuery插件。
如下:
/*
*数字动画(目前仅支持数字动画的线性变化)
*options参数:
*from{Number}起始数字
*to{Number}终点数字
*duration{Number}动画时间
*callback{Function}数字变化时的回调函数
*/
(function($){
$.fn.animatingNumber=function(options){
varsettings={
element:this,
startNum:options.from,
endNum:options.to,
duration:options.duration||2000,
callback:options.callback
};
vartimer=null;
varmethods={
start:function(){
var_this=this;
_this.animate();
},
stop:function(){
if(timer){
clearTimeout(timer);
timer=null;
}
},
animate:function(){
var_this=this;
varcurNum=settings.startNum;
varanimateTime=0;
varrange=settings.endNum-settings.startNum;
vartimerStep=Math.abs(Math.floor(settings.duration/range));
timerStep=timerStep>20?timerStep:20;
varnumStep=(range/settings.duration)*timerStep;
_this.stop();
(functionanimate(){
timer=setTimeout(function(){
curNum=Math.ceil(curNum+numStep);
if((settings.endNum>settings.startNum&&curNum>=settings.endNum)||(settings.endNum<settings.startNum&&curNum<=settings.endNum)){
curNum=settings.endNum;
}
settings.element.text(curNum);
animateTime++;
if(typeofsettings.callback=='function'){
settings.callback(curNum);
}
animate();
if(curNum>=settings.endNum){
_this.stop();
}
},timerStep);
})();
}
};
returnthis.each(function(){
returnmethods.start();
});
};
})(jQuery);
使用:
<p>Number:<spanclass='dynamicNum'></span></p>
<script>
$('.dynamicNum').animatingNumber({
from:1,
to:1000,
duration:2000
});
</script>
最后
好了,以上就是这篇文章的全部内容了,后期会考虑加上缓动函数的选择项。希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。