利用原生JS与jQuery实现数字线性变化的动画
发布时间 - 2026-01-10 23:15:26 点击率:次前言

大家应该都有所体会,在一些数据展示的专题页里,有时候希望数字能动态从某一个数变化到另一个数,以此来吸引用户眼球,突出数据。于是有了下文。
在这里,我用了两种方式:一种是原生的JavaScript,另一种是jQuery插件。
数字线性变化的原理很简单,就是让数字增量变化,并循环动画。
原生JS版
首先获取DOM元素。为了兼容到IE6,兼容性方法如下:
var domUtil = {
// 获取DOM元素
get: function(query) {
var _this = this;
if(document.querySelector) {
return document.querySelector(query);
} else {
var elements = document;
var queryStrArray = query.split(/ +/);
for(var i = 0; i < queryStrArray.length; i++) {
var domName = queryStrArray[i];
elements = _this.getElementsOfParentNode(domName, elements);
}
if(elements.length == 1) {
return elements[0];
} else {
return elements;
}
}
},
// 获取DOM元素
getElementsOfParentNode: function(domName, parentNode) {
var _this = this;
parentNode = parentNode || document;
domName = domName.trim();
var regExps = {
id: /^#/,
class: /^/
};
if(regExps.id.test(domName)) {
domName = domName.replace(/^\#/g, "");
return parentNode.getElementById(domName);
} else if(regExps.class.test(domName)) {
domName = domName.replace(/^./g, "");
return _this.getElementsByClassName(domName, parentNode);
} else {
return parentNode.getElementsByTagName(domName);
}
},
// 获取class元素的兼容方法
getElementsByClassName: function(className, parentNode) {
if(parentNode.getElementsByClassName){
return parentNode.getElementsByClassName(className);
} else {
className = className.replace(/^ +| +$/g,"");
var classArray = className.split(/ +/);
var eles = parentNode.getElementsByTagName("*");
for(var i = 0;i < classArray.length; i++){
var classEles = [];
var reg = new RegExp("(^| )" + classArray[i] + "( |$)");
for(var j = 0;j < eles.length; j++){
var ele = eles[j];
if(reg.test(ele.className)){
classEles.push(ele);
}
}
eles = classEles;
}
return eles;
}
}
};
/*
* 数字动画(目前仅支持数字动画的线性变化)
* options参数:
* element {String} DOM元素query字符串
* from {Number} 起始数字
* to {Number} 终点数字
* duration {Number} 动画时间
* callback {Function} 数字变化时的回调函数
*/
var animatingNumber = 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;
var curNum = _this.startNum;
var animateTime = 0;
var range = _this.endNum - _this.startNum;
var timerStep = Math.abs( Math.floor(_this.duration / range) );
timerStep = timerStep > 20 ? timerStep : 20;
var numStep = (range / _this.duration) * timerStep;
_this.stop();
(function animate() {
_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(typeof this.callback == 'function') {
this.callback(curNum);
}
animate();
if(curNum >= _this.endNum) {
_this.stop();
}
}, timerStep);
})();
}
};
animatingNumber.create = function(options) {
return new animatingNumber(options);
};
使用:
<p>Number: <span class='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) {
var settings = {
element: this,
startNum: options.from,
endNum: options.to,
duration: options.duration || 2000,
callback: options.callback
};
var timer = null;
var methods = {
start: function() {
var _this = this;
_this.animate();
},
stop: function() {
if(timer) {
clearTimeout(timer);
timer = null;
}
},
animate: function() {
var _this = this;
var curNum = settings.startNum;
var animateTime = 0;
var range = settings.endNum - settings.startNum;
var timerStep = Math.abs( Math.floor(settings.duration / range) );
timerStep = timerStep > 20 ? timerStep : 20;
var numStep = (range / settings.duration) * timerStep;
_this.stop();
(function animate() {
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(typeof settings.callback == 'function') {
settings.callback(curNum);
}
animate();
if(curNum >= settings.endNum) {
_this.stop();
}
}, timerStep);
})();
}
};
return this.each(function() {
return methods.start();
});
};
})( jQuery );
使用:
<p>Number: <span class='dynamicNum'></span></p>
<script>
$('.dynamicNum').animatingNumber({
from: 1,
to: 1000,
duration: 2000
});
</script>
最后
好了,以上就是这篇文章的全部内容了,后期会考虑加上缓动函数的选择项。希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# jquery
# 数字递增动画
# 数字动态变化
# js
# 动画展示数字变化
# jquery轻量级数字动画插件countUp.js使用详解
# js随机生成字母数字组合的字符串 随机动画数字
# js实现一个逐步递增的数字动画
# 回调
# 在这里
# 好了
# 两种
# 用了
# 很简单
# 这篇文章
# 并把
# 方法如下
# 后期
# 有疑问
# getElementsOfParentNode
# domName
# parentNode
# classEles
# trim
# queryStrArray
# elements
# split
# length
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
高端企业智能建站程序:SEO优化与响应式模板定制开发
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
详解CentOS6.5 安装 MySQL5.1.71的方法
如何在景安服务器上快速搭建个人网站?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
Linux后台任务运行方法_nohup与&使用技巧【技巧】
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
Laravel如何创建自定义Artisan命令?(代码示例)
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
JavaScript如何实现路由_前端路由原理是什么
微信小程序 wx.uploadFile无法上传解决办法
香港服务器WordPress建站指南:SEO优化与高效部署策略
MySQL查询结果复制到新表的方法(更新、插入)
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
如何快速搭建自助建站会员专属系统?
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
如何用PHP工具快速搭建高效网站?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
iOS发送验证码倒计时应用
java获取注册ip实例
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
北京网站制作的公司有哪些,北京白云观官方网站?
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
javascript日期怎么处理_如何格式化输出
Linux安全能力提升路径_长期防护思维说明【指导】
如何快速生成ASP一键建站模板并优化安全性?
lovemo网页版地址 lovemo官网手机登录
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Laravel如何实现事件和监听器?(Event & Listener实战)
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
Python正则表达式进阶教程_复杂匹配与分组替换解析
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Laravel如何实现多对多模型关联?(Eloquent教程)
简历在线制作网站免费版,如何创建个人简历?
Thinkphp 中 distinct 的用法解析
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
简单实现Android文件上传
HTML 中如何正确使用模板变量为元素的 name 属性赋值
如何挑选优质建站一级代理提升网站排名?
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel怎么调用外部API_Laravel Http Client客户端使用
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程

