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 相关文章推荐
Span元素的width属性无效果原因及解决方案
Jan 15 Javascript
用javascript作一个通用向导说明
Aug 30 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
Jul 31 Javascript
js为数字添加逗号并格式化数字的代码
Aug 23 Javascript
JS之Date对象和获取系统当前时间详解
Jan 13 Javascript
Firefox中使用outerHTML的2种解决方法
Jun 07 Javascript
java必学必会之static关键字
Dec 03 Javascript
D3.js实现直方图的方法详解
Sep 25 Javascript
详谈jQuery.load()和Jsp的include的区别
Apr 12 jQuery
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
Sep 11 Javascript
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
Feb 07 Javascript
react+redux仿微信聊天界面
Jun 21 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
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
Php注入点构造代码
2008/06/14 PHP
PHP实现采集中国天气网未来7天天气
2014/10/15 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
js 字符串操作函数
2009/07/25 Javascript
js实时获取系统当前时间实例代码
2013/06/28 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
javascript如何创建表格(javascript绘制表格的二种方法)
2013/12/10 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
Javascrip实现文字跳动特效
2016/11/27 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
element-ui 表格数据时间格式化的方法
2018/08/24 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
js实现带积分弹球小游戏
2020/07/21 Javascript
[00:36]TI7不朽珍藏III——斯温不朽展示
2017/07/15 DOTA
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
解决paramiko执行命令超时的问题
2020/04/16 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
什么是继承
2013/12/07 面试题
销售总监岗位职责
2014/01/04 职场文书
教师自我鉴定范文
2014/03/20 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
师德师风学习材料
2014/12/19 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
奖学金申请个人主要事迹材料
2015/11/04 职场文书
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP
Ajax异步刷新功能及简单案例
2021/11/20 Javascript