使某个dom元素匀速滑动到容器顶部

2023-11-16

需求

  • 我有个侧面的菜单 , 点击对应的菜单标题, 可以让左侧的容易里对应标题滑到最顶上
  • 于是我封装了一个缓动函数

这个函数接受3个参数

  • 需要滚动的最外层的容器
  • 滚动到什么距离
  • 滚动时间

注意点

第一个参数的最外层的容器 , 需要滚动条( 没滚动条是没有办法滚动的 )
第二个参数是滚动的距离 , 其实也就是内部需要置顶的子元素的offsetTop ( 子元素距离顶部的距离 )
第三个参数可以不传,有默认值

smoothScrollToTop(element, targetScrollTop, duration = 500) {
      const startingScrollTop = element.scrollTop;
      console.log(startingScrollTop, "startingScrollTop11111");
      const startTime = performance.now();
      const scrollDistance = targetScrollTop - startingScrollTop;

      function animateScroll(currentTime) {
        const elapsedTime = currentTime - startTime;
        const progress = Math.min(elapsedTime / duration, 1);
        const easeInOutQuad = (t) =>
          t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;

        element.scrollTop =
          startingScrollTop + scrollDistance * easeInOutQuad(progress);

        if (progress < 1) {
          requestAnimationFrame(animateScroll);
        }
      }

      requestAnimationFrame(animateScroll);
    },

使用demo

  • 直接复制保存html预览
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <button id="btn">我要让元素滑动置顶</button>
  <div id="box">
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1 id="top">需要置顶的元素</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
    <h1>1</h1>
  </div>
</body>
<script>

  function smoothScrollToTop(element, targetScrollTop, duration = 500) {
    const startingScrollTop = element.scrollTop;
    const startTime = performance.now();
    const scrollDistance = targetScrollTop - startingScrollTop;

    function animateScroll(currentTime) {
      const elapsedTime = currentTime - startTime;
      const progress = Math.min(elapsedTime / duration, 1);
      const easeInOutQuad = (t) => t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;

      element.scrollTop = startingScrollTop + (scrollDistance * easeInOutQuad(progress));

      if (progress < 1) {
        requestAnimationFrame(animateScroll);
      }
    }
    requestAnimationFrame(animateScroll);
  }

  const btn = document.querySelector(`#btn`)
  btn.addEventListener(`click`, () => {
    const element = document.querySelector(`#top`)
    const offsetTop = element.offsetTop;
    smoothScrollToTop(box, offsetTop);
  })
</script>

</html>

<style>
  #btn {
    position: fixed;
    top: 0;
    left: 0;
    width: 100px;
    height: 100px;
  }

  #box {
    height: 500px;
    background-color: red;
    overflow: scroll;
    margin-left: 100px;
  }
</style>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使某个dom元素匀速滑动到容器顶部 的相关文章

随机推荐

  • objectARX 定义块、删除定义块或快参照

    1 如何定义块 2 根据定义删除块 块参照 第一步 通过块定义名称找到实体idlist 当前图形数据库 gt 块表 gt 检查该块定义是否在块表存在 gt 存在 则通过定义名称 找到实体idlist 第二步 遍历块表的实体id 若属于某定义
  • ASP.NET Core3.1 跨平台智能云管理系统源码

    ASP NET Core3 1 跨平台智能云管理系统源码 一个相当不错的系统框架 ASP NET Core3 1 跨平台智能云管理系统 什么是 ASP NET Core ASP NET Core 是一个由微软创建的 用于构建 web 应用
  • 42. 疯狂爬取王者荣耀所有皮肤高清海报(文末源码)

    目录 前言 目的 思路 代码实现 1 导包 部署好环境 2 伪装请求头 3 访问英雄列表 获取英雄ID 4 分别访问各英雄主页 查看图片详情 5 写入本地文件夹 文件夹自动命名 完整源码 运行效果 总结 前言 阔别已久 各位粉丝朋友们 UP
  • MyBatis-Plus的主键策略

    MyBatis Plus的主键策略 我们在为主键挑选生成策略的时候 可以看出有一下几种策略 下面我们一起看看他们的生成方式 值 描述 AUTO 数据库ID自增 NONE 无状态 该类型为未设置主键类型 注解里等于跟随全局 全局里约等于 IN
  • 一图读懂JVM架构解析

    每个Java开发人员都知道字节码经由JRE Java运行时环境 执行 但他们或许不知道JRE其实是由Java虚拟机 JVM 实现 JVM分析字节码 解释并执行它 作为开发人员 了解JVM的架构是非常重要的 因为它使我们能够编写出更高效的代码
  • 实验三 虚拟局域网的配置

    一 实验目的和要求 1 理解以太网交换机IEEE802 1q扩展帧的转发 过滤 机制 2 理解虚拟局域网的功能和划分方法 3 理解STP协议工作机制 3 掌握单个交换机和跨交换机的VLAN配置 4 掌握三层交换机的配置 二 实验设备 1 双
  • 高防IP是什么?有什么作用?

    最近不少来咨询的客户都问什么是高防IP 客户接入这个高防IP的话需要做些什么准备 今天就给大家科普一下什么是高防IP 他的原理是什么 客户接入需要做些什么 高防IP是指高防机房所提供的IP段 主要是针对网络中的DDOS攻击进行保护 在网络世
  • CompiledEffect Direct3D9 Sample fxc.exe

    转载于 https www cnblogs com Agravity p 5138141 html
  • 微信小程序——自定义日期时间组件实现

    目前 微信小程序选择器提供了日期选择器 时间选择器等 但没有日期时间一体的选择器 当项目中需要进行日期时间选择时 我们只有自定义组件了 首先 我们需要先了解一下小程序的picker组件 详细使用见链接 https developers we
  • UDP通过广播的形式发送、接收结构体

    UDP是一种无连接的 面向数据包的传输协议 通过广播的方式可以向多个接收方发送数据 在C 中 可以使用socket库来实现UDP广播的发送和接收 下面是一篇CSDN博文 介绍了如何使用C 通过广播的形式发送和接收结构体 一 UDP广播的发送
  • 电商的1000+篇文章总结

    电商的1000 篇文章总结 本文收集和总结了有关电商的1000 篇文章 由于篇幅有限只能总结近期的内容 想了解更多内容可以访问 http www ai2news com 其分享了有关AI的论文 文章 图书 query 6 合并大舞台的背后
  • cocos2dx:瓦片地图加载失败及黑线问题

    问题 1 瓦片地图加载失败 运行时 获取瓦片地图的层失败 调试发现 获取的层是一个 NULL 遇到这个问题 我第一反应是图片路径有问题 但经过检查发现 路径没有问题 然我就怀疑 是我的代码有问题 然而并没有 调试无果 我就把目光转向瓦片地图
  • 23种设计模式之模板方法模式

    文章目录 模板方法模式 模板方法模式的优缺点 使用场景 模板方法模式 模板方法模式法 Template Method 定义一个操作中的算法骨架 而将算法的一些步骤延迟到子类中 使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤
  • pushd命令

    1 功能pushd命令常用于将目录加入到栈中 加入记录到目录栈顶部 并切换到该目录 若pushd命令不加任何参数 则会将位于记录栈最上面的2个目录对换位置2 语法 1 格式 pushd 目录 N N n 2 选项目录 将该目录加入到栈顶 并
  • 边界框回归的魔法:揭秘精准高效的MPDIoU损失函数

    文章目录 摘要 1 简介 2 相关工作 2 1 目标检测和实例分割 2 2 场景文本识别 2 3 边界框回归的损失函数 3 点距最小的并集交点 4 实验结果 4 1 实验设置 4 2 数据集 4 3 评估协议 4 4 目标检测的实验结果 4
  • 图神经网络与因果推理

    传统的因果推理基于线性结构方程模型 深度因果推理模型 这是基于图神经网络的模型 利用扁粉自动编码机来学习模型 其中 网络结构 因果推理模型为
  • iOS的终端命令和linux命令,iOS 终端 shell 操作,Mac 操作快捷键

    shell 操作命令 简单的shell 命令操作指令 pwd 当前工作目录 cd 不加参数 进root cd folder 进入文件夹 cd 上级目录 cd 返回root cd 返回上一个访问的目录 rm 文件名 删除 文件 rm 删除当前
  • vscode 配置文件

    将设置放入此文件中以覆盖默认设置 editor fontSize 18 editor fontFamily Source Code Pro Noto Sans CJK SC Consolas editor rulers 120 editor
  • 监听文件读取进度,中断文件读取

  • 使某个dom元素匀速滑动到容器顶部

    需求 我有个侧面的菜单 点击对应的菜单标题 可以让左侧的容易里对应标题滑到最顶上 于是我封装了一个缓动函数 这个函数接受3个参数 需要滚动的最外层的容器 滚动到什么距离 滚动时间 注意点 第一个参数的最外层的容器 需要滚动条 没滚动条是没有