JavaScript实现平滑滚动

● 本次我们将实现点击按钮时候,可以平滑得滚动到指定位置
在这里插入图片描述

● 首先我们获取到按钮信息和想要滚动到得章节

const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');

● 下一步就是添加点击事件了

btnScrollTo.addEventListener('click', function (e) {const slcoords = section1.getBoundingClientRect();
});

getBoundingClientRect()是一个JavaScript方法,用于获取一个元素相对于视口的位置和尺寸。它返回一个DOMRect对象,包含了元素的top、right、bottom、left、width、height等属性。

btnScrollTo.addEventListener('click', function (e) {const slcoords = section1.getBoundingClientRect();console.log(slcoords);
});

在这里插入图片描述

btnScrollTo.addEventListener('click', function (e) {const slcoords = section1.getBoundingClientRect();console.log(slcoords);console.log(e.target.getBoundingClientRect());
});

//通过调用e.target.getBoundingClientRect(),你可以获取触发点击事件的元素相对于视口的位置和尺寸信息。

● 我们也可以获得当前滚动位置的 X 轴和 Y 轴坐标

const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');btnScrollTo.addEventListener('click', function (e) {const slcoords = section1.getBoundingClientRect();console.log(slcoords);console.log(e.target.getBoundingClientRect());console.log('Current scrll (X/Y)', window.scrollX, window.screenY);
});

● 我们也可以输出输出视口(viewport)的高度和宽度,也就是可见视口的高度

console.log('height/width viewport',document.documentElement.clientHeight,document.documentElement.clientWidth);

● 现在就简单了,我们只需要点击按钮的时候更改一下我们想要的章节坐标即可

const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');btnScrollTo.addEventListener('click', function (e) {const slcoords = section1.getBoundingClientRect();// console.log(slcoords);// console.log(e.target.getBoundingClientRect());// console.log('Current scrll (X/Y)', window.scrollX, window.screenY);// console.log(//   'height/width viewport',//   document.documentElement.clientHeight,//   document.documentElement.clientWidth// );window.scrollTo(slcoords.left, slcoords.top);
});

● 现在确实可以跳转了,但是细心的小伙伴会发现,这个必须在顶部才能正常跳转,往下面滑动一点就不行了,因为页面滑动就会章节的到顶部的X轴就会变动,我们必须加上滑动的距离才可以

const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');btnScrollTo.addEventListener('click', function (e) {const slcoords = section1.getBoundingClientRect();// console.log(slcoords);// console.log(e.target.getBoundingClientRect());// console.log('Current scrll (X/Y)', window.scrollX, window.screenY);// console.log(//   'height/width viewport',//   document.documentElement.clientHeight,//   document.documentElement.clientWidth// );window.scrollTo(slcoords.left + window.scrollX,slcoords.top + window.scrollY);
});

● 现在在任何视口都可以跳转了,但是跳转有点生硬,我们要给他这是平滑滚动

const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');btnScrollTo.addEventListener('click', function (e) {const slcoords = section1.getBoundingClientRect();// console.log(slcoords);// console.log(e.target.getBoundingClientRect());// console.log('Current scrll (X/Y)', window.scrollX, window.screenY);// console.log(//   'height/width viewport',//   document.documentElement.clientHeight,//   document.documentElement.clientWidth// );// window.scrollTo(//   slcoords.left + window.scrollX,//   slcoords.top + window.scrollY// );window.scrollTo({left: slcoords.left + window.scrollX,top: slcoords.top + window.scrollY,behavior: 'smooth',});
});

现在可以实现平滑滚动了,但是上述的操作都是比较老的操作方法了,对于现代浏览器,我们有更加现代的方法去实现平滑滚动;

const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');btnScrollTo.addEventListener('click', function (e) {const slcoords = section1.getBoundingClientRect();section1.scrollIntoView({ behavior: 'smooth' });
});

这样就可以更加现代化的实现平滑滚动了,但是可能会存在老的浏览器不兼容的问题,但是现代化的实现方法的逻辑也是按照我们上面的步骤来执行的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/20608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跟踪一个Pytorch Module在训练过程中的内存分配情况

跟踪一个Pytorch Module在训练过程中的内存分配情况 代码输出 目的:跟踪一个Pytorch Module在训练过程中的内存分配情况 方法: 1.通过pre_hook module的来区分module的边界 2.通过__torch_dispatch__拦截所有的aten算子,计算在该算子中新创建tensor的总内存占用量 3.通过tensor…

Java八股文面试全套真题

Java八股文面试全套真题 一、Redis1.1、你在最近的项目中哪些场景使用了redis呢?1.2、缓存穿透1.3、布隆过滤器1.4、缓存击穿1.5、缓存雪崩1.6、redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致性)1.6.1、读…

进程与线程(一)

进程与线程(一) 理解什么是并发编程进程的相关概念什么是进程对比进程和程序理解进程是一个独立的可调度的任务理解进程是程序执行和资源管理的最小单位进程状态转换图进程的种类 进程相关命令进程状态标志ps命令-aux:-axj:(可以查看到进程的PPID)pstree…

浅析R16移动性增强那些事儿(DAPS/CHO/MRO)

R16移动性增强相关技术总结 Dual Active Protocol Handover Dual Active Protocol Handover意为双激活协议栈切换,下文简称DAPS切换,DAPS切换的核心思想是切换过程中,在UE成功连接到目标基站前继续保持和源基站的连接和数据传输,…

示波器眼图怎么看

目录 什么是眼图? 怎么看? 眼图的电压幅度(Y轴) 眼睛幅度和高度 信噪比 抖动 上升时间和下降时间 眼宽 什么是眼图? 眼图(Eye Diagram)是一种用于分析高速数字信号传输质量的重要工具。通…

OpenJDK优化技术之标量替换(Scalar Replacement)

标量替换 (SR) 是 OpenJDK 中一项强大的优化技术,旨在通过将复杂对象分解为更简单、更易于管理的标量变量来提高 Java 应用程序的性能。 1.前言 OpenJDK JVM 有两个即时编译器,C1 和 C2。C2 是一种应用许多优化来生成非常高效的编译版本程序的编译器。…

【全开源】Java共享台球室无人系统支持微信小程序+微信公众号+H5

智能引领台球新体验 一、引言:共享经济的新篇章 在共享经济的大潮中,各类共享服务层出不穷,为人们的生活带来了极大的便利。共享台球室作为其中的一员,以其独特的魅力吸引了众多台球爱好者的目光。而今天,我们要介绍…

【JavaScript脚本宇宙】JavaScript日期处理神器: 6款顶级库解析

提升编程效率:六个强大的JavaScript日期时间库介绍 前言 在信息化社会,日期和时间的处理是任何编程语言必不可少的部分。本文将介绍六个优秀的JavaScript日期和时间库,这些库各有特色,可以应对多样的使用场景。 欢迎订阅专栏&am…

RAG检索增强生成

Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks Lewis P, Perez E, Piktus A, et al. Retrieval-augmented generation for knowledge-intensive nlp tasks[J]. Advances in Neural Information Processing Systems, 2020, 33: 9459-9474.

【通信专题】I2C上拉电阻计算方法

I2C 通信总线是电子设计中常见的总线之一,由于 I2C 的硬件芯片内部为开漏输出,所以要求在外部增加一个上拉电阻,总线上拉电阻的选取受多个因素的影响,因此如何计算 I2C 总线的上拉电阻阻值成为硬件工程师在使用 I2C总统时需要关注的话题。 从本质上讲: I2C 总线电容和上升…

算法第三天力扣第69题:X的平方根

69. x 的平方根 (可点击下面链接或复制网址进行做题) https://leetcode.cn/problems/sqrtx/https://leetcode.cn/problems/sqrtx/ 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内…

密码和密钥的联系与区别

密码和密钥是两个非常重要的概念,但容易混淆这两者,以下内容介绍了它们的联系和区别: 一、定义 密码(Password),在日常语境中,通常指的是个人为了验证自己的身份而设置的一段秘密的字符序列&am…

动态规划:优化问题求解的艺术

引言: 在计算机科学和数学中,动态规划是一种强大的算法设计技术,用于解决具有重叠子问题和最优子结构特性的复杂问题。动态规划不仅可以简化问题的求解过程,还能显著提高效率。本文将介绍动态规划的基本概念、工作原理、算法设计步…

周末总结(2024/06/01)

工作 人际关系核心实践: 要学会随时回应别人的善意。执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己,抬高别人(无阴阳气息) 工作上的要点 现状(接受破烂现状,改变状态) - 我很不满意现在的…

基于Qt GraphicView 解析 CIM/G 电力接线图文件

本文讲述了如何使用Qt的框架来渲染展示标准的CIM/G格式的图形文件,也就是公用信息模型(common information model,CIM)中的G文件部分的内容。这是一种电力系统图形的交换规则,用于电网图形交换。 [by amjieker] CIM/G …

【自动驾驶】点与向量从ego系转odometry系

1.点从ego系转odometry系(ego -> odometry) struct Point {float x;float y;float angle; }; Point trans; // is the odom to ego transform Point odom_coord; is the odom coord Point ego_coord; is the ego coordfloat odom_coord.x = (ego_coord.x - trans.x) * st…

Selenium番外篇文本查找、元素高亮、截图、无头运行

Selenium根据文本查找元素 ​ python def find_element_with_text(self, loc, attribute, text):try:WebDriverWait(self.driver, 5).until(EC.all_of(EC.text_to_be_present_in_element_attribute(loc, attribute, text)))element self.driver.find_element(*loc)if isinsta…

C++青少年简明教程:break语句、continue语句

C青少年简明教程:break语句、continue语句 break语句 只能用在switch语句和循环语句(for循环、while循环和do-while循环)中。作用:跳出switch语句或提前终止循环。 break语句的基本语法如下: break; break语句的示例…

Nutanix在.NEXT大会宣布AI战略升级:GPT-in-a-Box 2.0集成NVIDIA,强化企业级AI应用支持

Nutanix在巴塞罗那举行的.NEXT大会上宣布了一系列新动向,旨在借助与思科的合作、Broadcom收购VMware、生成式人工智能(GenAI)的兴起、容器化技术、PostgreSQL数据库的广泛应用以及绿色能源倡议,进一步扩大其在人工智能领域的影响力…

macbook配置前端环境:深度解析与实战指南

macbook配置前端环境:深度解析与实战指南 在数字时代的浪潮中,前端开发已成为构建互动、生动且富有吸引力的用户界面的关键。而MacBook,以其卓越的性能和稳定的系统,成为前端开发者们的首选工具。然而,对于初学者或新…