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 相关文章推荐
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
Dec 27 Javascript
THREE.JS入门教程(1)THREE.JS使用前了解
Jan 24 Javascript
js实现根据身份证号自动生成出生日期
Dec 15 Javascript
深入探秘jquery瀑布流的实现
Jan 30 Javascript
js基础之DOM中document对象的常用属性方法详解
Oct 28 Javascript
深入理解jquery中extend的实现
Dec 22 Javascript
jQuery编写网页版2048小游戏
Jan 06 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
Nov 17 Javascript
详解Vue webapp项目通过HBulider打包原生APP
Jun 29 Javascript
JavaScript数组方法的错误使用例子
Sep 13 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
Jan 21 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
Aug 20 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调用JAVA的WebService简单实例
2014/03/11 PHP
php过滤敏感词的示例
2014/03/31 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
2017/08/18 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
js滚动条多种样式,推荐
2007/02/05 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
2014/06/01 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
JavaScript从0开始构思表情插件
2016/07/26 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
jquery实现楼层滚动效果
2018/01/01 jQuery
React中如何引入Angular组件详解
2018/08/09 Javascript
ES6基础之 Promise 对象用法实例详解
2019/08/22 Javascript
vue-路由精讲 二级路由和三级路由的作用
2020/08/06 Javascript
详解Vue中的watch和computed
2020/11/09 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
python简单操作excle的方法
2018/09/12 Python
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
美国医疗用品、医疗设备和家庭保健用品商店:Medical Supply Depot
2018/07/08 全球购物
信息技术教学反思
2014/02/12 职场文书
农村面貌改造提升实施方案
2014/03/18 职场文书
卫生标语大全
2014/06/21 职场文书
幼儿园清明节活动总结
2014/07/04 职场文书
活动总结范文
2014/08/30 职场文书
大学生撤销处分思想汇报
2014/09/12 职场文书
齐云山导游词
2015/02/06 职场文书
党支部半年考察意见
2015/06/01 职场文书
高三物理教学反思
2016/02/20 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python
Vue elementUI表单嵌套表格并对每行进行校验详解
2022/02/18 Vue.js
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis