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 相关文章推荐
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
Dec 26 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
Jan 13 Javascript
node.js中的fs.chown方法使用说明
Dec 16 Javascript
Javascript中的五种数据类型详解
Dec 26 Javascript
JQuery插入DOM节点的方法
Jun 11 Javascript
用iframe实现不刷新整个页面上传图片的实例
Nov 18 Javascript
Bootstrap按钮组实例详解
Jul 03 Javascript
基于JavaScript实现评论框展开和隐藏功能
Aug 25 Javascript
VueJs使用Amaze ui调整列表和内容页面
Nov 30 Javascript
JavaScript 判断对象中是否有某属性的常用方法
Jun 14 Javascript
如何为你的JavaScript代码日志着色详解
Apr 08 Javascript
jQuery实现本地存储
Dec 22 jQuery
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
2019十大人气国漫
2020/03/13 国漫
php计算到指定日期还有多少天的方法
2015/04/14 PHP
PHP中的switch语句的用法实例详解
2015/10/21 PHP
php实现中文转数字
2016/02/18 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
JAVASCRIPT keycode总结
2009/02/04 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
固定网页背景图同时保持图片比例的思路代码
2013/08/15 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
2015/11/17 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
详解nuxt 微信公众号支付遇到的问题与解决
2019/08/26 Javascript
Python模拟登录12306的方法
2014/12/30 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
Python闭包思想与用法浅析
2018/12/27 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
python 读取数据库并绘图的实例
2019/12/03 Python
收藏!10个免费高清视频素材网站!【设计、视频剪辑必备】
2021/03/18 杂记
分享8款纯CSS3实现的搜索框功能
2017/09/14 HTML / CSS
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
临床护士自荐信
2014/01/31 职场文书
乡镇庆八一活动方案
2014/02/02 职场文书
新农村建设标语
2014/06/24 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
技术入股合作协议书
2014/10/07 职场文书
入党群众意见范文
2015/06/02 职场文书
Shell脚本一键安装Nginx服务自定义Nginx版本
2022/03/20 Servers
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
2022/04/06 Python