前言
大家应该都有所体会,在一些数据展示的专题页里,有时候希望数字能动态从某一个数变化到另一个数,以此来吸引用户眼球,突出数据。于是有了下文。
在这里,我用了两种方式:一种是原生的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>
最后
好了,以上就是这篇文章的全部内容了,后期会考虑加上缓动函数的选择项。希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
本文向大家介绍原生JS实现不断变化的标签,包括了原生JS实现不断变化的标签的使用技巧和注意事项,需要的朋友参考一下 上图为博客右侧截取的GIF图,下图为代码效果 HTML: css: JS: 此效果主要通过间隔取两数之间的随机数来改变标签的样式。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍原生js实现jquery函数animate()动画效果的简单实例,包括了原生js实现jquery函数animate()动画效果的简单实例的使用技巧和注意事项,需要的朋友参考一下 通过在公司一个月的实习,慢慢的对css跟html算是比较熟悉了,这几天开始研究js,今天用js写了一个jquery的animate函数,测试了下,性能还可以。个人觉得jquery并不是万能的,因为是个框架,所
本文向大家介绍原生js实现对Ajax的封装(仿jquery),包括了原生js实现对Ajax的封装(仿jquery)的使用技巧和注意事项,需要的朋友参考一下 前言 众所周知,jquery在我们日常开发中的使用频率非常高,与js相比,我们省去了冗长的获取元素的代码,不用考虑一些麻烦的兼容问题,更加方便的动画实现,以及更加方便的方法调用让我们觉得jquery真是越用越舒服。但是jquery说到底还是对j
本文向大家介绍利用Angularjs和原生JS分别实现动态效果的输入框,包括了利用Angularjs和原生JS分别实现动态效果的输入框的使用技巧和注意事项,需要的朋友参考一下 在刚开始没有给输入框添加焦点之前,没有任何效果。见下图: 然后点击其中任何一个,焦点就会触发一个动画,动画的结果见图二: 中间的输入登录密码文字,会自动添加到顶部(原谅我没有截取到动画过程的图片)。 我测试了一下,这样的效果
本文向大家介绍原生js实现拖拽移动与缩放效果,包括了原生js实现拖拽移动与缩放效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了js实现拖拽移动与缩放效果的具体代码,供大家参考,具体内容如下 效果图如下-实现了简单的拖拽和缩放功能 第一步—简单的拖拽功能 效果如下,简单的拖拽 第二步—简单的缩放功能 1.设置方位 2.给原型绑定缩放的方法 效果图如下 最终效果,盒子可以拖动,可以缩
本文向大家介绍瀑布流的实现方式(原生js+jquery+css3),包括了瀑布流的实现方式(原生js+jquery+css3)的使用技巧和注意事项,需要的朋友参考一下 前言 项目需求要弄个瀑布流的页面,用的是waterfall这个插件,感觉还是可以的,项目赶就没自己的动手写。最近闲来没事,就自己写个。大致思路理清楚,还是挺好实现的... 原生javascript版 jquery版本 大致思路