2022-01-11 21:07:24
实现数字滚动效果(数字动态增长动画)的核心是利用JavaScript在指定时间内平滑更新数字值,以下是三种常见方法及详细实现方案:

通过requestAnimationFrame实现流畅动画,结合数学计算控制数字变化,支册伏持自定义缓动函数和格式化输出。
function easeOutQuad(t) { return t * (2 - t); } // 缓动函数:减速效果function animateNumber(elementId, start, end, duration) { const element = document.getElementById(elementId); const startTime = performance.now(); function updateNumber(currentTime) { const elapsedTime = currentTime - startTime; const rawProgress = elapsedTime / duration; const progress = easeOutQuad(Math.min(rawProgress, 1)); // 应用缓动函数 // 处理整数或小数显示 const value = start + (end - start) * progress; element.textContent = value % 1 !== 0 ? value.toFixed(2) : Math.floor(value); if (progress < 1) { requestAnimationFrame(updateNumber); } } requestAnimationFrame(updateNumber);}// 使用示例:2秒内从0滚动到12345.56animateNumber('myNumber', 0, 12345.56, 2000);优势:
优化技巧:
通过CSS的transform属性模拟数字滚动,适合静态数字列表的简单动画。
<div class="number-container"> <div class="number-track"> <span>0</span><span>1</span><span>2</span>...<span>12345</span> </div></div><style>.number-container { height: 1em; overflow: hidden;}.number-track { display: flex; flex-direction: column; transition: transform 2s ease-out;}/* 通过JS动态修改transform: translateY(-X%)实现滚动 */</style>局限性:
适合需要快速实现且接受外部依赖的项目。
<script src="注意事项:
问题:toFixed()可能导致1.005 → 1.00的精度丢失解决方案:
function preciseRound(number, precision) { const factor = 10 precision; return Math.round(number * factor) / factor;}// 使用示例preciseRound(1.005, 2); // 返回1.012. 动画自然度提升核心技巧:应用缓动函数(Easing Functions)
// 更多缓动函数示例const easingFunctions = { easeInQuad: t => t * t, easeOutElastic: t => Math.pow(2, -10 * t) * Math.sin((t - 0.3 / 4) * (2 * Math.PI) / 0.3) + 1};// 在animateNumber函数中替换progress计算方式即可3. 性能优化策略
选择方案时建议:
通过合理应用缓动函数、格式化输出和性能优化技术,可创建出既流畅又符合业务需求的数字滚动动画效果。