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 相关文章推荐
Opacity.js
Jan 22 Javascript
基于jquery的jqDnR拖拽溢出的修改
Feb 12 Javascript
jquery text(),val(),html()方法区别总结
Nov 04 Javascript
Node.js文件操作方法汇总
Mar 22 Javascript
JS判断字符串变量是否含有某个字串的实现方法
Jun 03 Javascript
jQuery实现的自动加载页面功能示例
Sep 04 Javascript
Angular.js基础学习之初始化
Mar 10 Javascript
使用canvas进行图像编辑的实例
Aug 29 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
Mar 15 Javascript
在微信小程序中渲染HTML内容的方法示例
Sep 28 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
Aug 27 Javascript
Antd的table组件表格的序号自增操作
Oct 27 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 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
深入php常用函数的使用汇总
2013/06/08 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
PHP中命名空间的使用例子
2019/03/22 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
javascript 常用关键字列表集合
2007/12/04 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
js控制文本框输入的字符类型方法汇总
2015/06/19 Javascript
jQuery过滤选择器用法示例
2016/09/12 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
微信小程序网络请求的封装与填坑之路
2017/04/01 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
Python中类型关系和继承关系实例详解
2015/05/25 Python
详解python中requirements.txt的一切
2017/03/03 Python
python 网络编程详解及简单实例
2017/04/25 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
Django开发中复选框用法示例
2018/03/20 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
python3.8 微信发送服务器监控报警消息代码实现
2019/11/05 Python
Python多分支if语句的使用
2020/09/03 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
财政局长自荐信范文
2013/12/22 职场文书
高二地理教学反思
2014/01/24 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
企业文化标语口号
2014/06/09 职场文书
表扬稿范文
2015/01/17 职场文书
创业计划书之o2o水果店
2019/08/30 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS