JS实现滚动条触底加载更多


Posted in Javascript onSeptember 19, 2019

原理

1.通过监听滚动区域DOM的scroll事件, 计算出触底

// 滚动可视区域高度 + 当前滚动位置 === 整个滚动高度
scrollDom.clientHeight + scrollDom.scrollTop === scrollDom.scrollHeight

2.触底后触发列表添加, 列表添加使用createDocumentFragment, 将多次插入的DOM先存入内存, 最后一次填充进去, 提高性能, 也方便后面的MutationObserver监听

3.使用MutationObserver监听列表的DOM添加, 添加完毕后, 隐藏加载中提示

示例

https://codepen.io/klren0312/full/dybgayL

JS实现滚动条触底加载更多

参考资料

https://developer.mozilla.org/zh-CN/docs/Web/API/Element/clientHeight
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollHeight
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollTop
https://developer.mozilla.org/zh-CN/docs/Web/API/GlobalEventHandlers/onscroll
https://developer.mozilla.org/zh-CN/docs/Web/API/Document/createDocumentFragment
https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver

代码

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
 <style>
  .hide {
   display: none;
  }
  .scroll {
   height: 200px;
   width: 300px;
   overflow-y: auto;
   border: 1px solid #ddd;
  }
  .loading {
   text-align: center;
  }
  ul {
   margin: 0;
   padding: 0;
  }
  li {
   padding: 10px;
   margin: 10px;
   text-align: center;
   background: #FFF6F6;
   list-style-type: none;
  }
 </style>
</head>
<body>
 <div id="js-scroll" class="scroll">
  <ul id="js-list">
   <li>000000</li>
   <li>000000</li>
   <li>000000</li>
   <li>000000</li>
   <li>000000</li>
  </ul>
  <div class="loading hide" id="js-loading">加载中...</div>
 </div>
 <script>
  let index = 0 // 列表个数
  const listDom = document.getElementById('js-list')
  const loadingDom = document.getElementById('js-loading')
  /**
   * 使用MutationObserver监听列表的 DOM 改变
   */
  const config = {
   attributes: true,
   childList: true,
   subtree: true
  }
  const callback = function(mutationsList, observer) {
   for (let mutation of mutationsList) {
    if (mutation.type === 'childList') {
     if (index === 5) {
      loadingDom.innerText = '加载完毕'
     } else {
      loadingDom.classList.add('hide')
     }
    }
   }
  }
  const observer = new MutationObserver(callback)
  observer.observe(listDom, config)
  /**
   * clientHeight 滚动可视区域高度
   * scrollTop 当前滚动位置
   * scrollHeight 整个滚动高度
   */
  const scrollDom = document.getElementById('js-scroll')
  scrollDom.onscroll = () => {
   if (scrollDom.clientHeight + parseInt(scrollDom.scrollTop) === scrollDom.scrollHeight) {
    if (loadingDom.classList.contains('hide') && index <= 5) {
     loadingDom.classList.remove('hide')
     addList()
    }
    if (index >= 5) {
     observer.disconnect() // 加载完毕停止监听列表 DOM 变化
    }
   }
  }
  /**
   * 添加列表
   */
  function addList () {
   const fragment = document.createDocumentFragment()
   setTimeout(() => {
    ++index
    for (let i = 0; i < 5; i++) {
     const li = document.createElement('li')
     li.innerText = new Array(6).fill(index).join('')
     fragment.appendChild(li)
    }
    listDom.appendChild(fragment)
   } , 1000)
  }
 </script>
</body>
</html>

总结

以上所述是小编给大家介绍的JS实现滚动条触底加载更多,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
理解Javascript_01_理解内存分配原理分析
Oct 11 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
May 27 Javascript
js监听滚动条滚动事件使得某个标签内容始终位于同一位置
Jan 24 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
Oct 31 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
Oct 28 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
May 17 Javascript
Bootstrap模态框插入视频的实现代码
Jun 25 Javascript
jQuery插件实现弹性运动完整示例
Jul 07 jQuery
详解vue的双向绑定原理及实现
May 05 Javascript
Vue 幸运大转盘实现思路详解
May 06 Javascript
通过原生vue添加滚动加载更多功能
Nov 21 Javascript
如何在VUE中使用vue-awesome-swiper
Jan 04 Vue.js
Vue v-text指令简单使用方法示例
Sep 19 #Javascript
Vue.set 全局操作简单示例
Sep 19 #Javascript
layui对工具条进行选择性的显示方法
Sep 19 #Javascript
基于js实现抽红包并分配代码实例
Sep 19 #Javascript
Layui table field初始化加载时进行隐藏的方法
Sep 19 #Javascript
Vue 实例事件简单示例
Sep 19 #Javascript
微信小程序常用的3种提示弹窗实现详解
Sep 19 #Javascript
You might like
PHP统计二维数组元素个数的方法
2013/11/12 PHP
php格式化时间戳
2016/12/17 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
php经典趣味算法实例代码
2020/01/21 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
向左滚动文字 js代码效果
2013/08/17 Javascript
JS实现闪动的title消息提醒效果
2014/06/20 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
AngularJS表格样式简单设置方法示例
2017/03/03 Javascript
js上传图片预览的实现方法
2017/05/09 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
jquery检测上传文件大小示例
2020/04/26 jQuery
python中私有函数调用方法解密
2016/04/29 Python
python实现应用程序在右键菜单中添加打开方式功能
2017/01/09 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
selenium+Chrome滑动验证码破解二(某某网站)
2019/12/17 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
pycharm中leetcode插件使用图文详解
2020/12/07 Python
python实现学生通讯录管理系统
2021/02/25 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
银行实习人员自我鉴定
2013/09/22 职场文书
大专生自荐信
2013/10/04 职场文书
应届毕业生自荐信例文
2014/02/26 职场文书
销售顾问工作计划书
2014/08/15 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
2016年“我们的节日·中秋节”活动总结
2016/04/05 职场文书
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript
Redis Cluster 集群搭建你会吗
2021/08/04 Redis
Python中request的基本使用解决乱码问题
2022/04/12 Python
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技