48 votes

Compteur jQuery pour compter jusqu'à un nombre cible

Je cherche à savoir si quelqu'un connaît un plugin jQuery déjà existant qui comptera jusqu'à un nombre cible à une vitesse spécifiée.

Par exemple, regardez le nombre de Mo de stockage gratuit sur le site de Google. Page d'accueil de Gmail sous la rubrique "Beaucoup d'espace". Il a un numéro de départ dans un <span> et compte lentement vers le haut chaque seconde.

Je cherche quelque chose de similaire, mais j'aimerais pouvoir le préciser :

  • Le numéro de départ
  • Le numéro de fin
  • Le temps qu'il faut pour aller du début à la fin.
  • Une fonction de rappel personnalisée qui peut être exécutée lorsqu'un compteur est terminé.

140voto

Matt Huggins Points 16854

J'ai fini par créer mon propre plugin. Le voici au cas où cela aiderait quelqu'un :

(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);

Voici un exemple de code permettant de l'utiliser :

<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>

Regardez la démo sur JSFiddle : http://jsfiddle.net/YWn9t/

7 votes

Au cas où quelqu'un aurait des suggestions d'améliorations, j'ai déplacé ce code sur Github : github.com/mhuggins/jquery-countTo

1 votes

FYI - ce plugin est disponible avec des améliorations à l'adresse suivante : github.com/mhuggins/jquery-countTo

0 votes

Comment lancer le compteur sur le scroll ?

74voto

FDisk Points 2264

Vous pouvez utiliser le jQuery animate fonction

$({ countNum: 0 }).animate({ countNum: 10 }, {
  duration: 10000, // tune the speed here
  easing: 'linear',
  step: function() {
    // What todo on every count
    console.log(this.countNum);
  },
  complete: function() {
    console.log('finished');
  }
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

0 votes

Il convient de noter que cela ne semble pas fonctionner parfaitement. J'ai exécuté votre exemple jsbin dans Chrome, et il s'est terminé de manière incohérente à 998 ou 999 au lieu de 1000.

1 votes

Ceci est dû à la fonction Math.floor(). Si vous essayez de supprimer la fonction floor() vous obtiendrez le nombre correct qui est 1000 / 8000 = 0,125 à chaque étape. Je pense que l'action "step :" est exécutée à chaque étape sauf la dernière - qui est l'événement "complete :".

3 votes

C'est juste. Je suppose que le complete pourrait être mise à jour pour inclure également cette ligne afin de s'assurer qu'elle atteint le dernier numéro : $('#counter').text(this.countNum);

14voto

vsync Points 11280

J'ai créé le plus petit code pour faire exactement ça. Ce n'est pas seulement pour compter mais pour toute tâche qui doit être exécutée dans un temps donné. (disons, faire quelque chose pendant 5 secondes) :

Démonstration :

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);

8voto

Tatu Ulmanen Points 52098

Je ne connais pas les plugins mais cela ne devrait pas être trop difficile :

;(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);

Utilisation :

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

Exemple :

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

Je suppose que l'utilisation est explicite ; dans cet exemple, le compteur partira de 1000 et comptera jusqu'à 4500 en 8 secondes par intervalles de 500 ms, et appellera la fonction de rappel lorsque le comptage sera terminé.

2voto

Veger Points 17657

Je ne sais pas s'il existe des plugins existants, mais il semble assez facile d'en écrire un soi-même en utilisant la fonction Événements de chronométrage JavaScript .

0 votes

Oui, je ne pense pas que j'aurai un problème à en écrire un si je dois le faire, mais je préférerais en utiliser un existant pour gagner du temps et éviter les problèmes de bugs si possible.

1 votes

Vous pourriez littéralement utiliser celle de la page qu'il vous a envoyée. C'est une boucle infinie. Il suffit de l'ajuster en conséquence.

0 votes

En effet :) Je suppose que la fonctionnalité (et le code) est trop simple pour en faire un plugin utile sans trop de frais généraux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X