当前位置:网站首页>js监听页面或元素scroll事件,滚动到底部或顶部
js监听页面或元素scroll事件,滚动到底部或顶部
2022-06-24 19:44:00 【彭世瑜】
基本原理:
1、滚动到底部
元素的滚动距离 + 元素的可视距离 == 元素的滚动条总距离
2、滚动到顶部
元素的滚动距离 == 0
监听页面滚动
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Scroll Demo</title>
</head>
<body>
<style> .box {
height: 5000px; text-align: center; } </style>
<div class="box" id="box">打开控制台查看</div>
<!-- 引入节流方法 -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/umd/index.min.js"></script>
<script> // 滚动方向枚举值 const DIRECTION_ENUM = {
DOWN: "down", UP: "up", }; // 距离顶部或底部的阈值 const threshold = 20; // 记录前一个滚动位置 let beforeScrollTop = 0; function handleScroll() {
// 距顶部 var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; // 可视区高度 var clientHeight = document.documentElement.clientHeight || document.body.clientHeight; // 滚动条总高度 var scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight; // 打印数值 console.table([ {
label: "距顶部", value: scrollTop, }, {
label: "可视区高度", value: clientHeight, }, {
label: "滚动条总高度", value: scrollHeight, }, {
label: "距顶部 + 可视区高度", value: scrollTop + clientHeight, }, ]); // 确定滚动方向 let direction = DIRECTION_ENUM.DOWN; if (beforeScrollTop > scrollTop) {
direction = DIRECTION_ENUM.UP; } // 通过滚动方向判断是触底还是触顶 if (direction == DIRECTION_ENUM.DOWN) {
// 滚动触底 if (scrollTop + clientHeight + threshold >= scrollHeight) {
console.log("滚动触底"); } } else {
// 滚动到顶部 if (scrollTop <= threshold) {
console.log("滚动到顶部"); } } beforeScrollTop = scrollTop; } // 滚动节流 const throttleHandleScroll = throttleDebounce.throttle( 1000, handleScroll ); // 监听滚动 window.addEventListener('scroll', throttleHandleScroll); </script>
</body>
</html>
同理,也可以监听元素的滚动
<style> .box-wrap {
height: 500px; overflow-y: auto; } .box {
height: 5000px; text-align: center; } </style>
<div class="box-wrap" id="box">
<div class="box">打开控制台查看</div>
</div>
<script> // 监听滚动 let box = document.querySelector("#box"); box.addEventListener("scroll", function (e) {
let scrollTop = e.target.scrollTop; let clientHeight = e.target.clientHeight; let scrollHeight = e.target.scrollHeight; // 打印数值 console.table([ {
label: "距顶部", value: scrollTop, }, {
label: "可视区高度", value: clientHeight, }, {
label: "滚动条总高度", value: scrollHeight, }, {
label: "距顶部 + 可视区高度", value: scrollTop + clientHeight, }, ]); }); </script>
判断触底需要注意的点:
- 滚动时需要区分向上滚动还是向下滚动
- 滚动时可以设置一个阈值,并非完全触底或触顶才触发
- 滚动事件需要做节流操作,以免短时间内被多次触发
在线Demo
边栏推荐
- [introduction to UVM== > episode_8] ~ sequence and sequencer, sequence hierarchy
- Main cause of EMI - mold current
- File contains vulnerability issues
- 372. 棋盘覆盖
- QT to place the form in the lower right corner of the desktop
- Chapter VI skills related to e-learning 5 (super parameter verification)
- Selective sort method
- 378. 骑士放置
- The dplyr package select function of R language moves the specified data column in the dataframe data to the first column (the first column) in the dataframe data column
- 【基础知识】~ 半加器 & 全加器
猜你喜欢
[basic knowledge] ~ half adder & full adder
Laravel pagoda security configuration
Dig deep into MySQL - resolve the non clustered index of MyISAM storage engine
15 lines of code using mathematical formulas in wangeditor V5
国内有哪些好的智能家居品牌支持homekit?
Simpledateformat concrete classes for formatting and parsing dates
InnoDB, the storage engine of MySQL Architecture Principle_ Redo log and binlog
SimpleDateFormat 格式化和解析日期的具体类
Main cause of EMI - mold current
Huawei machine learning service speech recognition function enables applications to paint "sound" and color
随机推荐
中学校园IP网络广播系统解决方案-校园数字IP广播系统方案设计指南
Installation and deployment of ganglia
7-7 数字三角形
SimpleDateFormat 格式化和解析日期的具体类
Financial management [6]
What good smart home brands in China support homekit?
从客户端到服务器
数字IC设计经验整理(二)
R language uses the aggregate function of epidisplay package to split numerical variables into different subsets based on factor variables, calculate the summary statistics of each subset, and customi
【js】-【链表-应用】-学习笔记
安装IBM CPLEX学术版 academic edition | conda 安装 CPLEX
Basic data type
Construction equipment [4]
15 lines of code using mathematical formulas in wangeditor V5
[JS] - [tree] - learning notes
还在用 SimpleDateFormat 做时间格式化?小心项目崩掉
OpenSSL SSL_read: Connection was reset, errno 10054
378. Knight placement
选择类排序法
InnoDB, the storage engine of MySQL Architecture Principle_ Redo log and binlog