0
当前位置:首页 > JavaScript

js 实现滚动数字

2026-04-04 05:31:05JavaScript

实现滚动数字效果

方法一:使用 CSS 动画和 JavaScript

HTML 结构:

<div class="counter" data-target="1000">0</div>

CSS 样式:

.counter {
  font-size: 24px;
  font-weight: bold;
  transition: color 0.3s;
}

JavaScript 代码:

js 实现滚动数字

function animateCounter(element, target, duration = 2000) {
  const start = parseInt(element.textContent);
  const increment = target / (duration / 16);
  let current = start;

  const updateCounter = () => {
    current += increment;
    if (current < target) {
      element.textContent = Math.floor(current);
      requestAnimationFrame(updateCounter);
    } else {
      element.textContent = target;
    }
  };

  updateCounter();
}

document.querySelectorAll('.counter').forEach(counter => {
  const target = parseInt(counter.getAttribute('data-target'));
  animateCounter(counter, target);
});

方法二:纯 JavaScript 实现

function scrollNumber(element, finalNumber, duration = 1000) {
  const startTime = performance.now();
  const startNumber = parseInt(element.textContent) || 0;

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

    element.textContent = currentNumber;

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

  requestAnimationFrame(updateNumber);
}

// 使用示例
const counter = document.getElementById('counter');
scrollNumber(counter, 1000);

方法三:带缓动函数的实现

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

function smoothScrollNumber(element, target, duration = 1000) {
  let start = null;
  const initial = parseInt(element.textContent) || 0;
  const distance = target - initial;

  const step = (timestamp) => {
    if (!start) start = timestamp;
    const progress = timestamp - start;
    const percentage = Math.min(progress / duration, 1);
    const eased = easeOutQuad(percentage);

    element.textContent = Math.floor(initial + distance * eased);

    if (percentage < 1) {
      requestAnimationFrame(step);
    }
  };

  requestAnimationFrame(step);
}

方法四:支持小数滚动的实现

function decimalScroll(element, target, duration = 1000, decimals = 0) {
  const start = parseFloat(element.textContent) || 0;
  const distance = target - start;
  let startTime = null;

  const animate = (timestamp) => {
    if (!startTime) startTime = timestamp;
    const elapsed = timestamp - startTime;
    const progress = Math.min(elapsed / duration, 1);

    const currentValue = start + distance * progress;
    element.textContent = currentValue.toFixed(decimals);

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

  requestAnimationFrame(animate);
}

注意事项

  1. 性能优化:使用 requestAnimationFrame 代替 setInterval 可以获得更流畅的动画效果
  2. 数字格式化:对于大数字可以考虑添加千分位分隔符
  3. 容器宽度:确保容器足够宽以容纳滚动时的数字变化
  4. 浏览器兼容性:现代浏览器都支持这些方法,如需支持旧版浏览器可能需要 polyfill

这些方法可以根据实际需求进行调整,例如添加回调函数、自定义缓动效果或结合其他动画效果。

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

相关文章

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现图片放大缩小

js实现图片放大缩小

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

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…