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,一经查实,立即删除!

相关文章

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成功连接到目标基站前继续保持和源基站的连接和数据传输,…

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

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

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

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

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

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

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

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

C# WinForm —— 26 ImageList 介绍

1. 简介 图片集合,用于存储图像的资源,并在关联控件中显示出来 可以通过 索引、键名 访问每张图片 没有事件 2. 属性 属性解释(Name)控件ID,在代码里引用的时候会用到,一般以 imgList 开头ClolorDepth用于呈现图像的颜色数,默…

函数:计算数组的元素和

一、计算数组的元素和 参数传递给函数时,实际上只有数组的首地址作为指针传递给了函数。 在函数定义中的int a[ ]等价于int *a。在只有地址信息的情况下,是无法知道数组里有多少个元素的,因此在计算数组中的元素和时,要加一个参…

探索JavaScript函数---基础篇

目录 函数 声明和调用 声明(定义) 调用 参数 形参和实参 形参(Formal Arguments) 实参(Actual Arguments) 形参与实参的关系 返回值 作用域 全局作用域 局部作用域 匿名函数 函数表达式 立…

海康 面阵相机命名规则

海康 面阵相机命名规则 https://www.v-club.com/vCollage/vCollageDetail/516?subjectIdRMse6nPiyo

【JS重点知识02】栈、堆与数据类型 关系

一:栈堆空间分配区别: 1 栈:由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈; 简单数据类型存放在栈中 2 堆:存储复杂数据类型(对象),…

【JMeter接口自动化】第3讲 Jmeter语言及外观配置

Jmeter语言配置 方法一:暂时生效,下次打开JMeter还会恢复默认配置 Jmeter安装后,默认语言是英文,可以在“选项”——“选择语音”中更改 方法二,修改配置文件,永久生效 修改jmeter.properties文件 Jmete…

【详细讲解版】史上最全transformer面试题

史上最全transformer面试题答案 1.Transformer为何使用多头注意力机制?(为什么不使用一个头)2.Transformer为什么Q和K使用不同的权重矩阵生成,为何不能使用同一个值进行自身的点乘?3.Transformer计算attention的时候为…

20240601在Toybrick的TB-RK3588开发板上跑IPC的SDK并确认eth0

20240601在Toybrick的TB-RK3588开发板上跑IPC的SDK并确认eth0 2024/6/1 20:06 ADB的详细LOG: Microsoft Windows [版本 10.0.22621.3296] (c) Microsoft Corporation。保留所有权利。 C:\Users\QQ>adb shell adb server version (40) doesnt match this client …

全国产飞腾模块麒麟信安操作系统安全漏洞

1、背景介绍 目前在全国产飞腾模块上部署了麒麟信安操作系统,经第三方机构检测存在以下漏洞 操作系统版本为 内核版本为 openssh版本为 2、openssh CBC模式漏洞解决 首先查看ssh加密信息 nmap --script "ssh2*" 127.0.0.1 | grep -i cbc 可以通过修改/…

spring boot 3.x版本 引入 swagger2启动时报错

一,问题 Spring Boot 3.x版本的项目里,准备引入Swagger2作为接口文档,但是项目启动报错: java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present at java.base/sun.reflect.generics.…

Nginx(openresty) 开启gzip压缩功能 提高web网站传输速度

1 开启nginx gzip压缩后,网页的图片,css、js等静态资源的大小会减少,节约带宽,提高传输效率,给用户快的体验,给用户更好的体验. 2 安装 #centos 8.5 yum install gzip 3 配置 #建议统一配置在http段 vim /usr/loca…

SleepFM:利用对比学习预训练的多模态“睡眠”基础模型

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在阅读过程中有些知识点存在盲区,可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果…

逻辑这回事(三)----功耗优化

低功耗设计概述 低功耗设计动机 功耗的增加影响芯片Power grid(电源网格)的设计;功耗的增加导致芯片温度的上升,进而带来一系列影响。如Leakage Power增加;电路时序可能变差;IR Drop(IR压降)变大;功耗的增加导致芯片封装成本和散热成本的增加(packing cost、cooling cost)功耗…