devdev / in the loop

Animare un numero in Javascript da A a B

Se vogliamo creare una semplice animazione di un testo con un conteggio numero in Javascript, possiamo farlo tramite una piccola funzione, senza l’utilizzo di librerie apposite.

Nel nostro esempio avremo un testo “+300% margine lordo” che vorremmo animare a piacimento. Il nostro obiettivo è attivare il conteggio soltanto sulla parte numerica, partendo dalla stringa “+0% margine lordo” per poi scorrere a “%1 margine lordo”, “%2 margine lordo”.. insomma ci siamo capiti. Questa soluzione è SEO-friendly, in quanto nell’HTML della nostra pagina il testo finale è già presente e indicizzabile. Inoltre, permette anche una soluzione di fallback nel caso Javascript non possa essere eseguito o in errore.

Questa funzione che ho proposto su StackOverflow, accetta quattro parametri: l’oggetto, il numero di partenza (che di default è zero), il numero di arrivo (che di default è il numero contenuto nel testo originario, “300” nel nostro esempio) e la durata in millisecondi (di default 3000).

Andiamo a vedere come funziona.

HTML

<div id="value">+300% guadagno lordo</div>

JAVASCRIPT

function animateValue(obj, start = 0, end = null, duration = 3000) {
    if (obj) {

        // save starting text for later (and as a fallback text if JS not running and/or google)
        var textStarting = obj.innerHTML;

        // remove non-numeric from starting text if not specified
        end = end || parseInt(textStarting.replace(/\D/g, ""));

        var range = end - start;

        // no timer shorter than 50ms (not really visible any way)
        var minTimer = 50;

        // calc step time to show all interediate values
        var stepTime = Math.abs(Math.floor(duration / range));

        // never go below minTimer
        stepTime = Math.max(stepTime, minTimer);

        // get current time and calculate desired end time
        var startTime = new Date().getTime();
        var endTime = startTime + duration;
        var timer;

        function run() {
            var now = new Date().getTime();
            var remaining = Math.max((endTime - now) / duration, 0);
            var value = Math.round(end - (remaining * range));
            // replace numeric digits only in the original string
            obj.innerHTML = textStarting.replace(/([0-9]+)/g, value);
            if (value == end) {
                clearInterval(timer);
            }
        }

        timer = setInterval(run, stepTime);
        run();
    }
}

animateValue(document.getElementById('value'));

Ecco l’esempio in funzione:

Questo articolo ti è stato utile?
Javascript – LETTURA 4 MINUTI Alternativa a jQuery .eq() in Javascript
Una delle funzioni di traversing più utili di jQuery è sicuramente .eq() . Ci permette di accedere ad un elemento di…
Javascript – LETTURA 4 MINUTI Come conoscere la posizione di un elemento con jQuery index o in vanilla Javascript
Il motto di jQuery è “Write less, do more”, anche se gli ultimi anni stiamo vedendo uno shifting di molte…
Javascript – LETTURA 6 MINUTI Utilizzare i parametri GET in Javascript con URLSearchParams
I parametri URL, che tutti conosciamo come parametri GET o query) vengono utilizzati per passare informazioni alla pagina che stiamo…
Javascript – LETTURA 4 MINUTI Aggiungere una regola CSS con Javascript
Aggiungere una regola CSS in modo dinamico con Javascript può esserci utile in vari casi: uno riguarda sicuramente le performance,…
Roba figa da
if (weekend) {
    relax();
}
la nostra newsletter, ogni tanto.