📜  如何在javascript中平滑滚动(1)

📅  最后修改于: 2023-12-03 15:08:54.138000             🧑  作者: Mango

如何在JavaScript中平滑滚动

在Web应用中,我们经常需要实现平滑滚动的效果。本文将介绍如何使用JavaScript实现平滑滚动的效果。

使用原生JavaScript实现平滑滚动
简单实现

通过改变scrollTop属性来实现平滑滚动的效果。我们可以定义一个函数来平滑滚动:

function smoothScroll(target, duration) {
  const targetElement = document.querySelector(target);
  const targetPosition = targetElement.offsetTop;
  const startPosition = window.pageYOffset;
  const distance = targetPosition - startPosition;
  let startTime = null;

  function animation(currentTime) {
    if (startTime === null) startTime = currentTime;
    const timeElapsed = currentTime - startTime;
    const run = Math.easeInOutQuad(timeElapsed, startPosition, distance, duration);
    window.scrollTo(0, run);
    if (timeElapsed < duration) requestAnimationFrame(animation);
  }

  function Math.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);
}

上述代码中,我们定义了一个smoothScroll函数,该函数接受两个参数:目标元素的选择器和滚动持续时间。该函数首先获取目标元素的位置,并计算起始位置与目标位置之间的距离。然后通过requestAnimationFrame函数调用动画函数,该函数在每一帧中更新滚动位置,从而实现平滑滚动的效果。动画函数使用Math.easeInOutQuad函数来计算滚动过程的缓动效果。最后,我们调用requestAnimationFrame函数启动动画。

进一步优化

我们可以进一步优化上述代码,使其更加通用和灵活:

function smoothScroll(target, duration, callback) {
  const targetElement = document.querySelector(target);
  const targetPosition = targetElement.getBoundingClientRect().top;
  const startPosition = window.pageYOffset;
  const distance = targetPosition - startPosition;
  let startTime = null;

  function animation(currentTime) {
    if (startTime === null) startTime = currentTime;
    const timeElapsed = currentTime - startTime;
    const run = Math.easeInOutQuad(timeElapsed, startPosition, distance, duration);
    window.scrollTo(0, run);
    if (timeElapsed < duration) requestAnimationFrame(animation);
    else callback && callback(); // 回调函数
  }

  function Math.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);
}

上述代码中,我们首先通过getBoundingClientRect().top方法获取目标元素相对于视口的位置,并计算起始位置和目标位置之间的距离。我们还增加了一个可选的回调函数参数,用于在动画完成后执行一些操作。

使用第三方库实现平滑滚动

除了原生JavaScript实现平滑滚动效果,我们还可以使用一些第三方库来实现该功能。以下列举一些常见的库:

  • jQuery:jQuery是一个经典的JavaScript库,也提供了平滑滚动的功能。

    $('html, body').animate({
      scrollTop: $(target).offset().top
    }, duration);
    
  • Lodash:Lodash是一个JavaScript工具库,可以提供多种实用的函数。

    _.animate(
      document.documentElement,   // 元素
      { scrollTop: targetPosition }, // 目标位置
      duration // 持续时间
    );
    
  • ScrollReveal:ScrollReveal是一个轻量级的JavaScript库,可以提供多种滚动效果。

    ScrollReveal().reveal(target, { duration: duration });
    

以上是常见的第三方库实现平滑滚动效果的示例,开发者可以根据自己的需求选择合适的库来使用。

总结

平滑滚动效果是Web应用常见的功能之一。我们可以使用原生JavaScript或一些第三方库来实现该功能。在实现过程中,需要注意计算起始位置和目标位置之间的距离,并使用缓动函数来实现动画效果。