当前位置:首页 > JavaScript

js 实现滚动数字

2026-03-01 04:55:13JavaScript

实现滚动数字的几种方法

使用 CSS 动画 + JavaScript

CSS 的 transitiontransform 属性可以结合 JavaScript 实现平滑的数字滚动效果。通过改变数字元素的 translateY 属性,可以模拟数字滚动的视觉效果。

js 实现滚动数字

const numberElement = document.getElementById('number');
let currentNumber = 0;

function scrollNumber(targetNumber) {
  const duration = 1000; // 动画持续时间(毫秒)
  const startTime = performance.now();

  function updateNumber(timestamp) {
    const elapsed = timestamp - startTime;
    const progress = Math.min(elapsed / duration, 1);
    const easedProgress = easeOutQuad(progress);
    const newNumber = Math.floor(easedProgress * (targetNumber - currentNumber) + currentNumber);

    numberElement.textContent = newNumber;

    if (progress < 1) {
      requestAnimationFrame(updateNumber);
    } else {
      currentNumber = targetNumber;
    }
  }

  requestAnimationFrame(updateNumber);
}

function easeOutQuad(t) {
  return t * (2 - t);
}

// 示例:滚动到数字 100
scrollNumber(100);

使用 setInterval 实现逐步递增

通过 setInterval 逐步增加数字的值,直到达到目标数字。这种方法简单直接,适合不需要复杂动画的场景。

js 实现滚动数字

function animateNumber(elementId, targetNumber, duration = 1000) {
  const element = document.getElementById(elementId);
  const startNumber = parseInt(element.textContent) || 0;
  const increment = targetNumber > startNumber ? 1 : -1;
  const stepTime = Math.abs(Math.floor(duration / (targetNumber - startNumber)));

  const timer = setInterval(() => {
    const currentNumber = parseInt(element.textContent);
    if ((increment > 0 && currentNumber >= targetNumber) || 
        (increment < 0 && currentNumber <= targetNumber)) {
      clearInterval(timer);
    } else {
      element.textContent = currentNumber + increment;
    }
  }, stepTime);
}

// 示例:从 0 滚动到 1000
animateNumber('number', 1000, 2000);

使用 GSAP 动画库

GSAP(GreenSock Animation Platform)是一个强大的动画库,可以轻松实现复杂的数字滚动效果。

import { gsap } from 'gsap';

function animateWithGSAP(targetNumber, duration = 1) {
  gsap.to('#number', {
    duration: duration,
    innerText: targetNumber,
    snap: { innerText: 1 },
    ease: 'power2.out'
  });
}

// 示例:滚动到数字 500
animateWithGSAP(500, 2);

使用 requestAnimationFrame 实现高性能动画

requestAnimationFrame 是浏览器提供的动画 API,性能优于 setInterval,适合需要平滑动画的场景。

function animateNumberRAF(elementId, targetNumber, duration = 1000) {
  const element = document.getElementById(elementId);
  const startNumber = parseInt(element.textContent) || 0;
  const startTime = performance.now();

  function updateNumber(timestamp) {
    const elapsed = timestamp - startTime;
    const progress = Math.min(elapsed / duration, 1);
    const currentNumber = Math.floor(progress * (targetNumber - startNumber) + startNumber);
    element.textContent = currentNumber;

    if (progress < 1) {
      requestAnimationFrame(updateNumber);
    }
  }

  requestAnimationFrame(updateNumber);
}

// 示例:滚动到数字 200
animateNumberRAF('number', 200, 1500);

注意事项

  • 性能优化:对于大量数字滚动或高频更新,优先使用 requestAnimationFrame 或 GSAP。
  • 平滑过渡:通过缓动函数(如 easeOutQuad)可以让动画更自然。
  • 兼容性:确保目标浏览器支持使用的 API(如 requestAnimationFrame)。

标签: 数字js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterv…

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEv…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…