num.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /**
  2. * by xieguochen 数字滚动插件
  3. */
  4. (function($) {
  5. $.fn.numberAnimate = function(setting) {
  6. var defaults = {
  7. speed : 1000,//动画速度
  8. num : "", //初始化值
  9. iniAnimate : true, //是否要初始化动画效果
  10. symbol : '',//默认的分割符号,千,万,千万
  11. dot : 0 //保留几位小数点
  12. }
  13. //如果setting为空,就取default的值
  14. var setting = $.extend(defaults, setting);
  15. //如果对象有多个,提示出错
  16. if($(this).length > 1){
  17. alert("just only one obj!");
  18. return;
  19. }
  20. //如果未设置初始化值。提示出错
  21. /*if(setting.num == ""){
  22. alert("must set a num!");
  23. return;
  24. }*/
  25. var nHtml = '<div class="mt-number-animate-dom" data-num="{{num}}">\
  26. <span class="mt-number-animate-span">0</span>\
  27. <span class="mt-number-animate-span">1</span>\
  28. <span class="mt-number-animate-span">2</span>\
  29. <span class="mt-number-animate-span">3</span>\
  30. <span class="mt-number-animate-span">4</span>\
  31. <span class="mt-number-animate-span">5</span>\
  32. <span class="mt-number-animate-span">6</span>\
  33. <span class="mt-number-animate-span">7</span>\
  34. <span class="mt-number-animate-span">8</span>\
  35. <span class="mt-number-animate-span">9</span>\
  36. <span class="mt-number-animate-span">.</span>\
  37. </div>';
  38. //数字处理
  39. var numToArr = function(num){
  40. //num = parseFloat(num);
  41. if(typeof(num) == 'number'){
  42. var arrStr = num.toString().split("");
  43. }else{
  44. var arrStr = num.split("");
  45. }
  46. return arrStr;
  47. }
  48. //设置DOM symbol:分割符号
  49. var setNumDom = function(arrStr){
  50. var shtml = '<div class="mt-number-animate">';
  51. for(var i=0,len=arrStr.length; i<len; i++){
  52. if(i != 0 && (len-i)%3 == 0 && setting.symbol != "" && arrStr[i]!="."){
  53. shtml += '<div class="mt-number-animate-dot">'+setting.symbol+'</div>'+nHtml.replace("{{num}}",arrStr[i]);
  54. }else{
  55. shtml += nHtml.replace("{{num}}",arrStr[i]);
  56. }
  57. }
  58. shtml += '</div>';
  59. return shtml;
  60. }
  61. //执行动画
  62. var runAnimate = function($parent){
  63. $parent.find(".mt-number-animate-dom").each(function() {
  64. var num = $(this).attr("data-num");
  65. num = (num=="."?10:num);
  66. var spanHei = $(this).height()/11; //11为元素个数
  67. var thisTop = -num*spanHei+"px";
  68. if(thisTop != $(this).css("top")){
  69. if(setting.iniAnimate){
  70. //HTML5不支持
  71. if(!window.applicationCache){
  72. $(this).animate({
  73. top : thisTop
  74. }, setting.speed);
  75. }else{
  76. $(this).css({
  77. 'transform':'translateY('+thisTop+')',
  78. '-ms-transform':'translateY('+thisTop+')', /* IE 9 */
  79. '-moz-transform':'translateY('+thisTop+')', /* Firefox */
  80. '-webkit-transform':'translateY('+thisTop+')', /* Safari 和 Chrome */
  81. '-o-transform':'translateY('+thisTop+')',
  82. '-ms-transition':setting.speed/1000+'s',
  83. '-moz-transition':setting.speed/1000+'s',
  84. '-webkit-transition':setting.speed/1000+'s',
  85. '-o-transition':setting.speed/1000+'s',
  86. 'transition':setting.speed/1000+'s'
  87. });
  88. }
  89. }else{
  90. setting.iniAnimate = true;
  91. $(this).css({
  92. top : thisTop
  93. });
  94. }
  95. }
  96. });
  97. }
  98. //初始化
  99. var init = function($parent){
  100. //初始化
  101. $parent.html(setNumDom(numToArr(setting.num)));
  102. runAnimate($parent);
  103. };
  104. //重置参数
  105. this.resetData = function(num){
  106. var newArr = numToArr(num);
  107. var $dom = $(this).find(".mt-number-animate-dom");
  108. if($dom.length < newArr.length){
  109. $(this).html(setNumDom(numToArr(num)));
  110. }else{
  111. $dom.each(function(index, el) {
  112. $(this).attr("data-num",newArr[index]);
  113. });
  114. }
  115. runAnimate($(this));
  116. }
  117. //init
  118. init($(this));
  119. return this;
  120. }
  121. })(jQuery);