2022-02-25 05:08:19
在JavaScript中实现平滑滚动可通过requestAnimationFrame结合缓动函数完成,核心思路是分帧计算滚动位置并更新,同时利用缓动算法优化动画曲线。 以下是具体实现方法与优化建议:
一、基础实现:requestAnimationFrame + 缓动函数通过分帧计算滚动位置,结合缓动函数(如easeInOutQuad)实现平滑加速/减速效果。
function smoothScroll(target, duration) { const start = window.pageYOffset; // 当前滚动位置 const targetPosition = target.getBoundingClientRect().top + start; // 目标位置(考虑当前滚动偏移) const distance = targetPosition - start; // 滚动距离 let startTimestamp = null; function animation(currentTime) { if (startTimestamp === null) startTimestamp = currentTime; const timeElapsed = currentTime - startTimestamp; // 已用时间 const run = easeInOutQuad(timeElapsed, start, distance, duration); // 计算当前帧位置 window.scrollTo(0, run); // 更新滚动位置 if (timeElapsed < duration) requestAnimationFrame(animation); // 继续下一帧 } // 二次缓动函数(平滑加速减速) function easeInOutQuad(t, b, c, d) { t /= d / 2; if (t < 1) return c / 2 * t * t + b; t--; return -c / 2 * (t * (t - 2) - 1) + b; } requestAnimationFrame(animation);}// 使用示例:滚动到ID为"target"的元素,持续1秒const targetElement = document.getElementById('target');smoothScroll(targetElement, 1000);关键点说明:
不同缓动函数可提供不同视觉效果,例如:
效果对比:次数越高,动画越“柔软”,但可能增加计算开销。
2. 适配用户偏好与设备性能在某电商网站中,实现平滑滚动后:
若仅需简单平滑滚动,可使用CSS原生属性(但功能较基础):
html { scroll-behavior: smooth;}局限性:
总结:JavaScript实现平滑滚动的核心是分帧计算+缓动算法,通过requestAnimationFrame保证流畅性,结合性能优化与用户适配可显著提升体验。实际开发中需根据项目需求选择基础实现或进阶优化方案。