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 相关文章推荐
查看图片(前进后退)功能实现js代码
Apr 24 Javascript
JavaScript数组常用操作技巧汇总
Nov 17 Javascript
JS交换变量的方法
Jan 21 Javascript
javascript获取wx.config内部字段解决微信分享
Mar 09 Javascript
详解JavaScript节流函数中的Throttle
Jul 16 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
Nov 09 Javascript
Bootstrap栅格系统的使用和理解2
Dec 14 Javascript
js原生Ajax的封装和原理详解
Mar 11 Javascript
使用Vuex实现一个笔记应用的方法
Mar 13 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
Aug 12 Javascript
Vue使用Three.js加载glTF模型的方法详解
Jun 14 Javascript
javascript开发实现贪吃蛇游戏
Jul 31 Javascript
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 选项及相关信息函数库
2006/12/04 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
js文件中调用js的实现方法小结
2009/10/23 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
2016/02/25 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
2018/05/03 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
使用Python写个小监控
2016/01/27 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
2017/09/11 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
python实现QQ空间自动点赞功能
2019/04/09 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
大学生饮食配送创业计划书
2014/01/04 职场文书
大学四年的个人自我评价
2014/01/14 职场文书
期末自我鉴定
2014/02/02 职场文书
企业安全生产责任书
2014/04/14 职场文书
党员教师个人对照检查材料范文
2014/09/25 职场文书
MySQL8.0.24版本Release Note的一些改进点
2021/04/22 MySQL