当前位置:首页 > JavaScript

js 实现滚动数字

2026-03-01 04:55:13JavaScript

实现滚动数字的几种方法

使用 CSS 动画 + JavaScript

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

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 逐步增加数字的值,直到达到目标数字。这种方法简单直接,适合不需要复杂动画的场景。

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,适合需要平滑动画的场景。

js 实现滚动数字

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实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…