jQuery计数器计数到目标数字

Mat*_*ins 46 jquery counter timer jquery-plugins

我试图找出是否有人知道已经存在的jQuery插件将以指定的速度计数到目标数量.

例如,请查看Gmail主页上Google的免费存储空间数量,标题为"空格很多".它在<span>标签中有一个起始编号,并且每秒慢慢向上计数.

我正在寻找类似的东西,但我希望能够指明:

  • 起始编号
  • 结束号码
  • 从开始到结束所需的时间.
  • 一个自定义回调函数,可以在计数器完成时执行.

Mat*_*ins 136

我最终创建了自己的插件.这是为了以防万一:

(function($) {
    $.fn.countTo = function(options) {
        // merge the default plugin settings with the custom options
        options = $.extend({}, $.fn.countTo.defaults, options || {});

        // how many times to update the value, and how much to increment the value on each update
        var loops = Math.ceil(options.speed / options.refreshInterval),
            increment = (options.to - options.from) / loops;

        return $(this).each(function() {
            var _this = this,
                loopCount = 0,
                value = options.from,
                interval = setInterval(updateTimer, options.refreshInterval);

            function updateTimer() {
                value += increment;
                loopCount++;
                $(_this).html(value.toFixed(options.decimals));

                if (typeof(options.onUpdate) == 'function') {
                    options.onUpdate.call(_this, value);
                }

                if (loopCount >= loops) {
                    clearInterval(interval);
                    value = options.to;

                    if (typeof(options.onComplete) == 'function') {
                        options.onComplete.call(_this, value);
                    }
                }
            }
        });
    };

    $.fn.countTo.defaults = {
        from: 0,  // the number the element should start at
        to: 100,  // the number the element should end at
        speed: 1000,  // how long it should take to count between the target numbers
        refreshInterval: 100,  // how often the element should be updated
        decimals: 0,  // the number of decimal places to show
        onUpdate: null,  // callback method for every time the element is updated,
        onComplete: null,  // callback method for when the element finishes updating
    };
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

这是一些如何使用它的示例代码:

<script type="text/javascript"><!--
    jQuery(function($) {
        $('.timer').countTo({
            from: 50,
            to: 2500,
            speed: 1000,
            refreshInterval: 50,
            onComplete: function(value) {
                console.debug(this);
            }
        });
    });
//--></script>

<span class="timer"></span>
Run Code Online (Sandbox Code Playgroud)

在JSFiddle上查看演示:http://jsfiddle.net/YWn9t/

  • 如果有人有任何改进建议,我将此代码移至Github:https://github.com/mhuggins/jquery-countTo (6认同)

FDi*_*isk 73

您可以使用jQuery animate函数

// Enter num from and to
$({countNum: 99}).animate({countNum: 1000}, {
  duration: 8000,
  easing:'linear',
  step: function() {
    // What todo on every count
    console.log(Math.floor(this.countNum));
  },
  complete: function() {
    console.log('finished');
  }
});
Run Code Online (Sandbox Code Playgroud)

http://jsbin.com/upazas/958/

  • 很公平.我想可以更新`complete`方法以包含这一行,以确保它到达最后一个数字:`$('#counter').text(this.countNum);` (2认同)
  • 将 ```Math.floor(this.countNum)``` 替换为 ```this.countNum.toFixed(2)``` (2认同)

vsy*_*ync 12

我已经创建了最细微的代码来做到这一点.它不仅适用于计数,也适用于需要在给定时间内运行的任何任务.(比方说,做5秒钟的事情):

演示代码:

var step = function(t, elapsed){
    // easing 
    t = t*t*t;

    // calculate new value
    var value = 300 * t; // will count from 0 to 300

    // limit value ("t" might be higher than "1")
    if( t > 0.999 )
        value = 300;

    // print value (converts it to an integer)
    someElement.innerHTML = value|0;
};

var done = function(){
    console.log('done counting!');
};


// Do-in settings object
var settings = {
    step     : step,
    duration : 3,
    done     : done,
    fps      : 24 // optional. Default is requestAnimationFrame
};

// initialize "Do-in" instance 
var doin = new Doin(settings);
Run Code Online (Sandbox Code Playgroud)


Tat*_*nen 8

不知道插件,但这不应该太难:

;(function($) {        
     $.fn.counter = function(options) {
        // Set default values
        var defaults = {
            start: 0,
            end: 10,
            time: 10,
            step: 1000,
            callback: function() { }
        }
        var options = $.extend(defaults, options);            
        // The actual function that does the counting
        var counterFunc = function(el, increment, end, step) {
            var value = parseInt(el.html(), 10) + increment;
            if(value >= end) {
                el.html(Math.round(end));
                options.callback();
            } else {
                el.html(Math.round(value));
                setTimeout(counterFunc, step, el, increment, end, step);
            }
        }            
        // Set initial value
        $(this).html(Math.round(options.start));
        // Calculate the increment on each step
        var increment = (options.end - options.start) / ((1000 / options.step) * options.time);            
        // Call the counter function in a closure to avoid conflicts
        (function(e, i, o, s) {
            setTimeout(counterFunc, s, e, i, o, s);
        })($(this), increment, options.end, options.step);
    }
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

用法:

$('#foo').counter({
    start: 1000,
    end: 4500,
    time: 8,
    step: 500,
    callback: function() {
        alert("I'm done!");
    }
});
Run Code Online (Sandbox Code Playgroud)

例:

http://www.ulmanen.fi/stuff/counter.php

我想这用法是不言自明的; 在这个例子中,计数器将从1000开始,并以500毫秒的间隔在8秒内计数到4500,并在计数完成时调用回调函数.