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 面向对象编程 function也是类
Sep 17 Javascript
js ondocumentready onmouseover onclick onmouseout 样式
Jul 22 Javascript
jq选项卡鼠标延迟的插件实例
May 13 Javascript
jQuery客户端分页实例代码
Nov 18 Javascript
前端轻量级MVC框架CanJS详解
Sep 26 Javascript
jquery实现鼠标滑过显示提示框的方法
Feb 05 Javascript
JavaScript中数组添加值和访问值常见问题
Feb 06 Javascript
基于React.js实现原生js拖拽效果引发的思考
Mar 30 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
May 05 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
Jun 01 Javascript
仿淘宝JSsearch搜索下拉深度用法
Jan 15 Javascript
详解es6新增数组方法简便了哪些操作
May 09 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/10/09 PHP
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
php5.3 注意事项说明
2013/07/01 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
Gird事件机制初级读本
2007/03/10 Javascript
JavaScript中的事件处理
2008/01/16 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
javascript html实现网页版日历代码
2016/03/08 Javascript
js实现常用排序算法
2016/08/09 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
2017/09/18 jQuery
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
基于JavaScript实现表格隔行换色
2020/05/08 Javascript
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
深入讲解Python编程中的字符串
2015/10/14 Python
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
2019/08/17 Python
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
写给保洁员表扬信
2014/01/08 职场文书
采购求职信
2014/03/17 职场文书
英文慰问信
2015/02/14 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL