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 相关文章推荐
FormValid0.5版本发布,带ajax自定义验证例子
Aug 17 Javascript
JavaScript 变量基础知识
Nov 07 Javascript
jquery 实现表单验证功能代码(简洁)
Jul 03 Javascript
node.js操作mysql(增删改查)
Jul 24 Javascript
jquery ztree实现树的搜索功能
Feb 25 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
Jun 02 Javascript
浅谈addEventListener和attachEvent的区别
Jul 14 Javascript
AngularJs基于角色的前端访问控制的实现
Nov 07 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
Dec 13 Javascript
AngularJS表格样式简单设置方法示例
Mar 03 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
Mar 13 Javascript
java实现单链表增删改查的实例代码详解
Aug 30 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 JS Ip地址及域名格式检测代码
2013/09/27 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
List Installed Software Features
2007/06/11 Javascript
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
2013/08/02 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
vue如何将v-for中的表格导出来
2018/05/07 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
2020/05/29 jQuery
vue+animation实现翻页动画
2020/06/29 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
Python抓取百度查询结果的方法
2015/07/08 Python
Python ftp上传文件
2016/02/13 Python
Python通过future处理并发问题
2017/10/17 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
英国高级百货公司:Harvey Nichols
2017/01/29 全球购物
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
IMPORT的选项IGNORE有什么作用?缺省是什么设置?
2015/09/17 面试题
运动会入场解说词
2014/02/07 职场文书
关于学习的演讲稿
2014/05/10 职场文书
2014年培训工作总结范文
2014/11/27 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
面试通知邮件
2015/04/20 职场文书
英文辞职信范文
2015/05/13 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript