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 相关文章推荐
淘宝网提供的国内NPM镜像简介和使用方法
Apr 17 Javascript
jQuery学习笔记之基础中的基础
Jan 19 Javascript
jquery实现的蓝色二级导航条效果代码
Aug 24 Javascript
JavaScript提高性能知识点汇总
Jan 15 Javascript
微信小程序 Video API实例详解
Oct 02 Javascript
jQuery实现别踩白块儿网页版小游戏
Jan 18 Javascript
JavaScript实现定时页面跳转功能示例
Feb 14 Javascript
vue中配置mint-ui报css错误问题的解决方法
Oct 11 Javascript
Vue cli构建及项目打包以及出现的问题解决
Aug 27 Javascript
webpack.DefinePlugin与cross-env区别详解
Feb 23 Javascript
react中props 的使用及进行限制的方法
Apr 28 Javascript
Vue深入理解插槽slot的使用
Aug 05 Vue.js
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
web方式ftp
2006/10/09 PHP
PHP个人网站架设连环讲(四)
2006/10/09 PHP
php数组(array)输出的三种形式详解
2013/06/05 PHP
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
js给网页加上背景音乐及选择音效的方法
2015/03/03 Javascript
JavaScript自定义等待wait函数实例分析
2015/03/23 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
2016/10/28 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
Python计算三角函数之asin()方法的使用
2015/05/15 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
2019/02/08 Python
python pygame实现方向键控制小球
2019/05/17 Python
利用python实现短信和电话提醒功能的例子
2019/08/08 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
Python 解码Base64 得到码流格式文本实例
2020/01/09 Python
Python sorted排序方法如何实现
2020/03/31 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
争做文明公民倡议书
2014/08/29 职场文书
升学宴答谢词
2015/01/05 职场文书
酒店前台辞职书
2015/02/26 职场文书
催款通知书范文
2015/04/17 职场文书
赵氏孤儿观后感
2015/06/09 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL