【JavaScript】js实现滚动触底加载事件

一、html和css

可视区固定500px,设置overflow-y: auto 来实现滚动。

1.1、html

<template><div class="scroll"ref='scroll'@scroll="onScroll"><div class="crad"v-for="i in 10":key="i"></div></div>
</template>

1.2、css

<style lang='scss' scoped>
.scroll {overflow: auto;height: 500px;.crad {height: 200px;margin-top: 10px;background-color: red;}
}
</style>

1.3、效果如下

二、实现思路

触发的条件是: 可视高度 + 滚动距离 >= 实际高度。例子我会使用vue来实现,和原生实现是一样的。

  • 可视高度(offsetHeight):通过 dom 的 offsetHeight获得,表示区域固定的高度。这里我推荐通过 getBoundingClientRect()来获取高度,因为使用前者会引起浏览器回流,造成一些性能问题。
  • 滚动高度(scrollTop):滚动事件中通过 e.target.scrollTop获取,表示滚动条距离顶部的px
  • 实际高度(scrollHeight):通过dom 的 scrollHeight获得,表示区域内所有内容的高度(包括滚动距离),也就是实际高度

2.1、基础实现

onScroll(e) {let scrollTop = e.target.scrollToplet scrollHeight = e.target.scrollHeightlet offsetHeight = Math.ceil(e.target.getBoundingClientRect().height)let currentHeight = scrollTop + offsetHeightif (currentHeight >= scrollHeight) {console.log('触底')}
}

2.2、添加距离底部多少距离触发

现在我们希望是离底部一定距离就触发事件,而不是等到完全触底。如果你做过小程序,这和onReachBottom差不多的意思。

  • 声明一个离底部的距离变量reachBottomDistance

  • 这时候触发条件:可视高度 + 滚动距离 + reachBottomDistance >= 实际高度

export default {data(){return {reachBottomDistance: 100}},methods: {onScroll(e) {let scrollTop = e.target.scrollToplet scrollHeight = e.target.scrollHeightlet offsetHeight = Math.ceil(e.target.getBoundingClientRect().height)let currentHeight = scrollTop + offsetHeight + this.reachBottomDistanceif (currentHeight >= scrollHeight) {console.log('触底')}}}
}

2.3、再次优化

在距离底部100px时成功触发事件,但由于100px往下的区域是符合条件的,会导致一直触发,这不是我们想要的。
接下来做一些处理,让其进入后只触发一次:

export default {data(){return {flag: true,reachBottomDistance: 100}},methods: {onScroll(e) {let scrollTop = e.target.scrollToplet scrollHeight = e.target.scrollHeightlet offsetHeight = Math.ceil(e.target.getBoundingClientRect().height)let currentHeight = scrollTop + offsetHeight + this.reachBottomDistanceif (currentHeight >= scrollHeight && this.flag) {console.log('触底')this.flag = false}}}
}

2.4、最终优化

实时去获取位置信息稍微会损耗性能,我们应该把不变的缓存起来,只实时获取可变的部分

export default {data(){return {flag: true,reachBottomDistance: 100offsetHeight: 0,}},mounted(){// 页面加载完成后  将可视区高度存储起来let dom = this.$refs['scroll']this.offsetHeight = Math.ceil(dom.getBoundingClientRect().height)},methods: {onScroll(e) {let scrollTop = e.target.scrollToplet scrollHeight = e.target.scrollHeightlet currentHeight = scrollTop + this.offsetHeight + this.reachBottomDistanceif (currentHeight >= scrollHeight && this.flag) {console.log('触底')this.flag = false}}}
}

三、利用触底事件实现滚动分页加载

<template><div class="scroll"ref='scroll'@scroll="onScroll"><div class="crad"v-for="item in showList":key='item.id'></div><p v-show="status=='loading'">加载中</p><p v-show="status=='nomore'">没有更多了</p></div>
</template><script>
import { fetchList } from '@/api/index';
export default {data () {return {flag: true,reachBottomDistance: 100,offsetHeight: 0,// 展示区listshowList: [],pageIndex: 1,pageSize: 20,totalPage: 0,status: 'nomore'};},mounted () {// 页面加载完成后  将可视区高度存储起来let dom = this.$refs['scroll']this.offsetHeight = Math.ceil(dom.getBoundingClientRect().height)this.getDataList()},methods: {onScroll(e) {let scrollTop = e.target.scrollToplet scrollHeight = e.target.scrollHeightlet currentHeight = scrollTop + this.offsetHeight + this.reachBottomDistanceif (currentHeight >= scrollHeight && this.flag) {console.log('触底')this.flag = falsethis.pageIndex++;this.getDataList();}},getDataList () {fetchList({ current: this.pageIndex, size: this.pageSize }).then((res) => {let list = res.data.data.list;this.totalPage = res.data.data.totalPage;this.showList = this.showList.concat(list);if (this.totalPage > this.showList.length) {this.status = 'loading';//如果还有更多重新设置flag为truethis.flag = true} else {this.status = 'nomore';//没有更多flag设置为false不在执行触底加载this.flag = false}});}}
}
</script><style lang='scss' scoped>
.scroll {overflow: auto;height: 500px;.crad {height: 200px;margin-top: 10px;background-color: red;}
}
</style>

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

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

相关文章

【目标检测】YOLOv7算法实现(一):模型搭建

本系列文章记录本人硕士阶段YOLO系列目标检测算法自学及其代码实现的过程。其中算法具体实现借鉴于ultralytics YOLO源码Github&#xff0c;删减了源码中部分内容&#xff0c;满足个人科研需求。   本系列文章在YOLOv5算法实现的基础上&#xff0c;进一步完成YOLOv7算法的实现…

2020年认证杯SPSSPRO杯数学建模C题(第二阶段)抗击疫情,我们能做什么全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 C题 抗击疫情&#xff0c;我们能做什么 原题再现&#xff1a; 2020 年 3 月 12 日&#xff0c;世界卫生组织&#xff08;WHO&#xff09;宣布&#xff0c;席卷全球的冠状病毒引发的病毒性肺炎&#xff08;COVID-19&#xff09;是一种大流行病。…

【Spring】SpringBoot 统一功能处理

文章目录 前言1. 拦截器1.1 什么是拦截器1.2 拦截器的使用1.2.1 自定义拦截器1.2.2 注册配置拦截器 1.3 拦截器详解1.3.1 拦截路径1.3.2 拦截器执行流程1.3.3 适配器模式 2. 统一数据返回格式3. 统一异常处理 前言 在日常使用 Spring 框架进行开发的时候&#xff0c;对于一些板…

《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)

目录 开头语内存飙升问题分析与案例问题背景&#xff1a;我华为云的一个服务器运行我的一个项目“csdn-automatic-triplet-0.0.1-SNAPSHOT.jar”&#xff0c;由于只是用来测试的服务器&#xff0c;只有2G&#xff0c;所以分配给堆的内存1024M查询内存使用&#xff08;top指令&a…

恒温器探针样品座

恒温器探针样品座是一种用采用可移动探针完成恒温器电缆和被测样品的电学连接&#xff0c;避免了每次样品电引线的焊接&#xff0c;探针可移动&#xff0c;5mm--20mm大小的样品均可适用&#xff0c;探针可以安装6个&#xff0c;标准配置探针数量为4个。 恒温器探针样品座由T型…

云渲染农场渲染和自己搭建农场渲染怎么选?哪个更划算?

&#xfeff;当我们面临繁重或紧急的渲染任务时&#xff0c;通常会选择云渲染的解决方案。可能很多人会问&#xff0c;我们是否能够自行建立一个小型的个人农场进行渲染呢&#xff1f;与云渲染农场相比&#xff0c;哪个更划算&#xff1f;更方便&#xff1f;接下来就带大家看看…

vue-echarts踩坑,本地开发可以渲染echarts图表,线上环境图表渲染不出来

main.js全局注册v-chart组件 import VueECharts from "vue-echarts"; Vue.component("v-chart", VueECharts);在页面中使用 如上图&#xff0c;我开始写的静态数据&#xff0c;在data中定义了chartOption1:{…配置项…}, 在接口数据返回之后&#xff0c;…

Nodejs基础3之fs模块的文件重命名和移动、文件的删除、文件夹操作、查看资源状态、fs路径

Nodejs基础二 fs模块文件重命名和移动文件的重命名文件的移动同步重命名和移动 文件的删除使用unlink进行删除unlink异步删除unlinkSync同步删除 使用rm进行删除rm异步删除rmSync同步删除 文件夹操作创建文件夹递归创建文件夹 读取文件夹删除文件夹rmdir删除文件夹删除递归文件…

电脑怎么把照片的kb缩小?三种方法帮你解决

电脑怎么把照片的kb缩小&#xff1f;我们在进行上传图片的时候&#xff0c;经常遇到图片太大&#xff0c;请压缩后再上传的情况&#xff0c;这就是我们开头所需要了解的压缩图片大小的方法&#xff0c;图片缩小kb可以通过三种处理方式来达到效果&#xff0c;我们可以直接图片压…

在线协作白板WBO本地部署启动并结合内网穿透实现远程协同办公

文章目录 推荐前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击…

【LeetCode: 208. 实现 Trie (前缀树)】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

一分钟带你了解--电商控价

电商行业发展至今带来了许多机遇&#xff0c;但同时也伴随着一些挑战。品牌电商在运营过程中&#xff0c;面临着诸如乱价、低价、窜货和假货等问题&#xff0c;这些问题不仅损害了品牌的形象和价值&#xff0c;也破坏了市场秩序&#xff0c;侵害了消费者的权益。 电商控价是解…

深度探讨 Golang 中并发发送 HTTP 请求的最佳技术

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在 Golang 领域&#xff0c;并发发送 HTTP 请求…

java常用API(2)

1&#xff1a;String 1.1 String(构造方法) 首先&#xff0c;我们先来学习String类&#xff0c;它涉及到两个案例&#xff1a;用户登录和聊天室。 先来看用户登录案例&#xff1a;需要输入用户名和密码&#xff0c;和已知的用户名和密码进行比较&#xff0c;涉及到比较的方法…

抖音小店如何选品?新手怎么选有潜力的产品?常用选品玩法分享

大家好&#xff0c;我是电商花花。 选品是我们店铺出单的关键&#xff0c;也是我们做电商行业的小伙伴非常关心的一个点。 我们想要选好商品&#xff0c;我们就要先搞清楚&#xff0c;什么样的产品才算是有潜力的产品&#xff0c;什么样的产品才能出单&#xff0c;什么样的产…

【HTML5】 canvas 绘制图形

文章目录 一、基本用法二、用法详见2.0、方法属性2.1、绘制线条2.2、绘制矩形2.3、绘制圆形2.4、绘制文本2.5、填充图像 一、基本用法 canvas 标签&#xff1a;可用于在网页上绘制图形&#xff08;使用 JavaScript 在网页上绘制图像&#xff09;画布是一个矩形区域&#xff0c…

MATLAB R2023b for Mac 中文

MATLAB R2023b 是 MathWorks 发布的最新版本的 MATLAB&#xff0c;适用于进行算法开发、数据可视化、数据分析以及数值计算等任务的工程师和科学家。它包含了一系列新增功能和改进&#xff0c;如改进了数据导入工具&#xff0c;增加了对数据帧和表格对象的支持&#xff0c;增强…

手机上最危险的3个操作,千万小心!

普通人千万不要在手机上做这3个操作&#xff0c;否则你的手机早晚会被黑客入侵了。 第一种&#xff0c;苹果越狱 越狱虽然可以绕过限制给你的苹果安装上一些特殊软件&#xff0c;但只要是越狱之后的苹果手机&#xff0c;都将留下漏洞&#xff0c;黑客最喜欢寻找做过越狱的手机…

nginx离线安装

安装包准备&#xff1a; 上传安装包到linux系统 一、进入gcc目录&#xff0c;执行以下命令 rpm -Uvh *.rpm --nodeps --force gcc -v查看版本 二、 进入gcc-c目录&#xff0c;执行命令 rpm -Uvh *.rpm --nodeps --force g -v查看版本 三、安装PCRE 解压&#xff1a; t…

众和策略:券商又念“紧箍咒” 绕标套现的头疼了

又有券商对两融事务念“紧箍咒”。 近来&#xff0c;记者从广发证券获悉&#xff0c;该公司已发布《关于调整融资融券负债归还规矩的告诉》&#xff0c;自2024年1月15日起&#xff0c;决议禁止融资买入证券用于归还融券负债。 相关业内人士以为&#xff0c;自上一年10月融资融…