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实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js手势实现

js手势实现

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

节流js实现

节流js实现

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

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let currentY…

js实现滑动

js实现滑动

实现滑动效果的方法 在JavaScript中实现滑动效果可以通过多种方式完成,以下是几种常见的实现方法: 使用CSS过渡和JavaScript触发 通过CSS定义过渡效果,JavaScript控制触…

js 实现全选

js 实现全选

实现全选功能的方法 使用 JavaScript 实现全选功能通常需要操作复选框(checkbox)的状态。以下是几种常见的实现方式。 通过 DOM 操作实现全选 // 获取全选复选框和子复选框 co…