当前位置:首页 > 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 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现验证

js实现验证

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

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…

js 实现页面刷新

js 实现页面刷新

使用 location.reload() location.reload() 是原生 JavaScript 提供的页面刷新方法。调用该方法会重新加载当前页面,相当于点击浏览器的刷新按钮。 // 基本…

js验证码实现

js验证码实现

验证码的基本原理 验证码(CAPTCHA)用于区分人类用户和自动化程序。常见类型包括图形验证码、滑动验证码、短信验证码等。JavaScript 可用于前端验证码的生成和验证逻辑。 图形验证码实现 使…