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 相关文章推荐
ExtJS下书写动态生成的xml(兼容火狐)
Apr 02 Javascript
JavaScript设计模式之单件模式介绍
Dec 28 Javascript
浅谈JavaScript数据类型
Mar 03 Javascript
javascript实现点击提交按钮后显示loading的方法
Jul 03 Javascript
asp.net中oracle 存储过程(图文)
Aug 12 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
Sep 01 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
Oct 31 Javascript
使用BootStrap进行轮播图的制作
Jan 06 Javascript
cnpm加速Angular项目创建的方法
Sep 07 Javascript
Map与WeakMap类型在JavaScript中的使用详解
Nov 18 Javascript
微信小程序实现下拉加载更多商品
Dec 29 Javascript
原生js中运算符及流程控制示例详解
Jan 05 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操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
php 面试碰到过的问题 在此做下记录
2011/06/09 PHP
php实现获取文章内容第一张图片的方法
2014/11/04 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
什么是JavaScript
2009/08/13 Javascript
一个JavaScript用逗号分割字符串实例
2014/09/22 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
浅析JS操作DOM的一些常用方法
2016/05/13 Javascript
深入理解JavaScript定时机制
2016/10/27 Javascript
AngularJS全局scope与Isolate scope通信用法示例
2016/11/22 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
React中使用Vditor自定义图片详解
2020/12/25 Javascript
python networkx 根据图的权重画图实现
2019/07/10 Python
详解python pandas 分组统计的方法
2019/07/30 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
JSF界面控制层技术
2013/06/17 面试题
群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
班主任培训研修日志
2015/11/13 职场文书
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
muduo TcpServer模块源码分析
2022/04/26 Redis