实现对一个元素的滚动条进行平滑滚动至顶部的动画效果

这篇具有很好参考价值的文章主要介绍了实现对一个元素的滚动条进行平滑滚动至顶部的动画效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.elementUI中的平滑滚动至顶部的动画效果代码

const cubic = value => Math.pow(value, 3);
const easeInOutCubic = value => value < 0.5
? cubic(value * 2) / 2
: 1 - cubic((1 - value) * 2) / 2;

const el = this.el;
const beginTime = Date.now();
const beginValue = el.scrollTop;
const rAF = window.requestAnimationFrame || (func => setTimeout(func, 16));
const frameFunc = () => {
const progress = (Date.now() - beginTime) / 500;
if (progress < 1) {
el.scrollTop = beginValue * (1 - easeInOutCubic(progress));
rAF(frameFunc);
} else {
el.scrollTop = 0;
}
};
rAF(frameFunc);

/**

下面是代码的逐行解释:

定义一个函数 cubic,接收一个参数 value,返回 value 的三次方。
定义一个函数 easeInOutCubic,接收一个参数 value,并根据 value 的值计算出在动画过程中的缓动效果,使其在开始和结束时速度较慢,在中间过程速度较快。
定义一个变量 el,表示当前操作的元素对象。
定义一个变量 beginTime,记录动画开始的时间。
获取 el 元素的当前滚动高度(距离顶部的距离),并将其赋值给变量 beginValue。
定义一个变量 rAF,使用浏览器的 requestAnimationFrame 方法(如果不支持,则使用 setTimeout 方法代替)。
定义一个函数 frameFunc,用于在每一帧中执行滚动的计算和更新。
计算动画的进度值 progress,表示从动画开始到现在所经过的时间占总动画时间(这里是500毫秒)的百分比。
判断 progress 是否小于 1,若小于 1,则说明动画尚未完成,继续执行以下操作:
利用 easeInOutCubic 函数计算当前帧的滚动条距离顶部的位置,并更新 el 元素的滚动高度。
使用 rAF 函数请求下一帧继续执行 frameFunc。
若 progress 不小于 1,则说明动画已经完成,将 el 元素的滚动条滚动至顶部。
调用 rAF 函数,传入 frameFunc,开始执行动画。
总结:这段代码使用了 requestAnimationFrame 和 easeInOutCubic 缓动函数来实现一个元素滚动条的平滑滚动至顶部的动画效果。


*/

2.将上面的代码简化

const el = this.el;
const duration = 500;
const rAF = window.requestAnimationFrame || (func => setTimeout(func, 16));

const scrollToTop = (startTime, startValue) => {
  const currentTime = Date.now();
  const progress = Math.min(1, (currentTime - startTime) / duration);

  el.scrollTop = startValue * (1 - progress);
  
  if (progress < 1) {
    rAF(() => scrollToTop(startTime, startValue));
  }
};

const beginTime = Date.now();
const beginValue = el.scrollTop;
rAF(() => scrollToTop(beginTime, beginValue));

/**
1.移除了 cubic 和 easeInOutCubic 函数,直接使用线性插值计算进度,代码更简洁。
2.将 frameFunc 函数改为 scrollToTop 函数,并将其作为递归调用,使代码逻辑更清晰。
    代码的基本逻辑和原来相似,使用 requestAnimationFrame 在每一帧中更新滚动条位置。这里的滚动动画效果将是线性的,即在动画过程中速度恒定。

*/

3.继续简化代码

使用Element.scrollTo方法并使用scroll-behavior: smooth的简化代码示例:

  1. 首先,在你的CSS样式表中加入以下代码:
    html {
      scroll-behavior: smooth;
    }

    这会将平滑滚动的效果应用到整个页面。

  2. 然后,使用scrollTo方法在JavaScript中触发滚动到顶部的操作:
    window.scrollTo({ top: 0, behavior: 'smooth' });

    这段代码相较于之前的实现更加简洁,因为我们使用了现代浏览器支持的scroll-behavior属性和scrollTo方法。这种方法的优势在于代码简洁,并且使用了原生的浏览器功能,因此性能更好。但请注意,这种方法在某些较旧的浏览器中可能不受支持。如果需要支持更多浏览器,请考虑使用上述更长的代码示例。文章来源地址https://www.toymoban.com/news/detail-511913.html

到了这里,关于实现对一个元素的滚动条进行平滑滚动至顶部的动画效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js:scroll平滑滚动页面或元素到顶部或底部的方案汇总

    准备知识: scrollWidth: 是元素全部内容的宽度,包括由于overflow溢出而在屏幕上不可见的内容 scrollHeight: 是元素全部内容的高度,包括由于overflow溢出而在屏幕上不可见的内容 scrollTop: 纵向滚动条距离元素最顶部的距离 scrollLeft: 横向滚动条距离元素最左侧的距离 语法 参数 -

    2024年02月09日
    浏览(37)
  • js获取元素到可视区的距离/浏览器窗口滚动距离/元素距离浏览器顶部距离

    1. js获取元素距离可视区的各种距离 2. js获取浏览器窗口滚动距离 3. js获取元素实际距离页面距离(包括滚动距离) (1).如果父辈元素中有定位的元素,那么就返回距离当前元素最近的定位元素边缘的距离。 (2).如果父辈元素中没有定位元素,那么就返回相对于body边缘距

    2024年02月12日
    浏览(49)
  • uni-app小程序中做页面滚动底部或顶部加载效果

    在移动应用开发中,无限滚动加载是一个常见的功能,用户可以通过滑动屏幕来加载更多的内容,从而提高应用的用户体验。本文将介绍如何使用Uniapp实现无限滚动加载的功能。 概述 我们需要实现的无限滚动加载功能的具体效果如下: 当用户滑动到底部时,自动加载更多的

    2024年02月08日
    浏览(73)
  • 如何使用CSS实现一个无限滚动效果(Infinite Scroll)?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月12日
    浏览(47)
  • JavaScript+canvas实现一个旋转的3D球动画效果

    1. 获取Canvas元素和设置初始参数 这部分代码主要是获取Canvas元素,并根据设备的DPI进行缩放。然后,定义了一些全局变量,包括Canvas的宽度、高度、球体旋转的角度和存储所有点的数组。 2. 定义一些常量 这部分代码定义了一些常量,如点的数量、点的半径、球半径等。 3.定

    2024年01月18日
    浏览(54)
  • 如何使用CSS实现一个带有动画效果的进度条?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月11日
    浏览(58)
  • 如何使用CSS实现一个无限循环滚动的图片轮播效果?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月11日
    浏览(44)
  • 如何使用CSS实现一个全屏滚动效果(Fullpage Scroll)?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月11日
    浏览(49)
  • 使用scrollTo/scrollTop让页面元素滚动到指定位置, 并设置滚动动画

    当容器有滚动条时,有时需要点击 试图 或 节点 将页面滚动到指定元素位置 比如父元素设置了 overflow: hidden; ,当元素里的内容超过元素本身的高度时, 就会出现滚动条, 那么鼠标滑动的距离就是其滚动距离. scrollTop属性 scrollTop 就是指 “元素中的内容” 超出 “元素上边界” 的

    2023年04月27日
    浏览(77)
  • 如何使用CSS实现一个带有动画效果的折叠面板(Accordion)?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月10日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包