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 相关文章推荐
window.dialogArguments 使用说明
Apr 11 Javascript
判断滚动条到底部的JS代码
Nov 04 Javascript
代码获取历史上的今天发生的事
Apr 11 Javascript
JS图片自动轮换效果实现思路附截图
Apr 30 Javascript
jquery实现的伪分页效果代码
Oct 29 Javascript
jQuery mobile 移动web(4)
Dec 20 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
Mar 14 Javascript
带有定位当前位置的百度地图前端web api实例代码
Jun 21 Javascript
将List对象列表转换成JSON格式的类实现方法
Jul 04 Javascript
jQuery Easyui datagrid/treegrid 清空数据
Jul 09 Javascript
jQuery基于cookie实现换肤功能实例
Oct 14 jQuery
原生js无缝轮播插件使用详解
Mar 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过程中的一些注意点的总结
2013/10/25 PHP
PHP多态代码实例
2015/06/26 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
jquery1.9 下检测浏览器类型和版本的方法
2013/12/26 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
通过JS判断联网类型和连接状态的实现代码
2015/04/01 Javascript
Knockout自定义绑定创建方法
2015/12/26 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
基于vue中keep-alive缓存问题的解决方法
2018/09/21 Javascript
Node 模块原理与用法详解
2020/05/13 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
[04:01]2014DOTA2国际邀请赛 TITAN告别Ohaiyo期望明年再战
2014/07/15 DOTA
[01:07:13]TNC vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python中的多重继承实例讲解
2014/09/28 Python
全面了解Python环境配置及项目建立
2016/06/30 Python
Python探索之Metaclass初步了解
2017/10/28 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
Python笔试面试题小结
2019/09/07 Python
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
意大利折扣和优惠券网站:Groupalia
2019/10/09 全球购物
机械电子工程专业自荐书
2014/06/10 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
2014年优秀班主任工作总结
2014/12/16 职场文书
2015大学生求职信范文
2015/03/20 职场文书
介绍信范文大全
2015/05/07 职场文书
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技
vue中data里面的数据相互使用方式
2022/06/05 Vue.js