Utwórz projekt ↗
JS · KOD NA LICENCJI MIT

Animowany licznik

Liczby, które przyciągają wzrok.

Edytuj HTML, CSS i JS ↗ Otwórz konfigurator ↗

Gdzie wykorzystać ten przykład?

Elementy strony dopasowane do własnego projektu. Wariant „Animowany licznik” możesz dopasować do kolorów i treści swojej strony.

Jak działa ten efekt?

HTML określa strukturę przykładu, CSS jego wygląd, a JavaScript — jeżeli występuje — odpowiada za interakcję. Podgląd pokazuje domyślne ustawienia, które możesz zmienić w edytorze.

Jak dodać go na stronę?

  1. Otwórz przykład w edytorze i podmień tekst oraz kolory.
  2. HTML wstaw w miejscu, w którym ma pojawić się element.
  3. CSS przenieś do arkusza stylów swojej strony. Reguły body z podglądu dopasuj do własnego układu.
  4. JavaScript uruchom po załadowaniu elementów HTML, na przykład przed zamknięciem </body>.
  5. Sprawdź działanie na telefonie, klawiaturą i z własną treścią.

Na co zwrócić uwagę?

Podmień treści i odnośniki. Kod działa w przeglądarce; formularze wymagają osobnej obsługi wysyłania po stronie serwera.

Co możesz zmienić w konfiguratorze?

Wartość końcowa, Podpis, Czas animacji, Kolor. W edytorze kodu możesz dodatkowo zmienić całą strukturę i zachowanie przykładu.

Gotowy kod: Animowany licznik

HTML

<div class="counter"><strong data-target="1024">0</strong><p>zrealizowane pomysły</p></div>

CSS

*{box-sizing:border-box}body{margin:0;padding:35px 24px;background:#f4f5ef;color:#293322;font:15px/1.7 Arial,sans-serif;min-height:100vh;display:grid;place-items:center}button,input{font:inherit}button,a{touch-action:manipulation}button{cursor:pointer}button:focus-visible,a:focus-visible,summary:focus-visible{outline:3px solid #738858;outline-offset:4px}h2,h3,p{margin-top:0}[hidden]{display:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}
.counter{text-align:center}.counter strong{font-size:80px;line-height:1;color:#e95b30;letter-spacing:-4px}.counter p{font-size:13px;margin:15px 0 0;color:#82916d}

JavaScript

document.querySelectorAll('[data-target]').forEach(el => {
    const target = Number(el.dataset.target);
    if(matchMedia('(prefers-reduced-motion: reduce)').matches){el.textContent = target;return}
    const observer = new IntersectionObserver(entries => {
        if(!entries[0].isIntersecting) return;
        const start = performance.now();
        function count(now){
            const progress = Math.min((now - start) / 1800, 1);
            el.textContent = Math.round(target * (1 - Math.pow(1 - progress, 3))).toLocaleString('pl-PL');
            if(progress < 1) requestAnimationFrame(count);
        }
        requestAnimationFrame(count);
        observer.disconnect();
    });
    observer.observe(el);
});

Podobne przykłady