首页 > 其他分享 >IntersectionObserver实现H5表格触底加载

IntersectionObserver实现H5表格触底加载

时间:2024-11-07 13:48:27浏览次数:3  
标签:flex ball H5 item switch IntersectionObserver tb ID 加载

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="./css/5.css" />
  </head>
  <body>
    <div class="warp">
      <div class="table" id="table">
        <div class="th">
          <div class="th-item">ID</div>
          <div class="th-item">ID</div>
          <div class="th-item">ID</div>
          <div class="th-item">ID</div>
          <div class="th-item">ID</div>
          <div class="th-item">ID</div>
          <div class="th-item">ID</div>
          <div class="th-item">ID</div>
          <div class="th-item">ID</div>
          <div class="th-item">ID</div>
          <div class="th-item">ID</div>
          <div class="th-item">ID</div>
        </div>
        <div class="tb" id="tb">
          <div class="tb-item">
          </div>
        </div>
      </div>
      <div class="loader-box">
        <div id="loader"></div>
        <div id="nothing" class="hidden">没有更多了~</div>
      </div>
    </div>
  </body>

  <script type="text/javascript" src="js/jquery.min.js"></script>
  <script>
    const switchBtn = document.querySelector(".switch")
    const ball = document.querySelector(".ball")

    // 点击开关事件
    switchBtn.addEventListener("click", function () {
      if (this.className == "switch switch-active") {
        this.classList.remove("switch-active")
        ball.classList.remove("ball-active")
        ball.classList.add("ball")
      } else {
        this.classList.add("switch-active") // 添加动画效果
        ball.classList.remove("ball")
        ball.classList.add("ball-active")
      }
    })

    const tb = document.getElementById("tb"),
      loader = document.getElementById("loader"),
      nothing = document.getElementById("nothing"),
      LIST_LIMIT_CNT = 200,
      LOADING_TIME = 500
    let hasMore = true,
      loadLock = false

    window.onload = function () {
      // IntersectionObserver 监听加载动画有没有进入视口内部
      const observer = new IntersectionObserver(
        ([entry]) => {
          if (entry.isIntersecting) {
            pullUp()
          }
        },
        {
          root: null,
          rootMargin: "0px",
          threshold: 0
        }
      )
      observer.observe(loader)
    }

    function pullUp() {
      if (!hasMore) {
        return
      }
      if (loadLock) {
        return
      }
      loadData()
    }

    // 获取数据
    function loadData() {
      const len = tb.children.length

      loadLock = true
      setTimeout(() => {
        if (len >= LIST_LIMIT_CNT) {
          loader.className = "hidden"
          nothing.className = ""
          hasMore = false
          return
        }

        for (let i = len; i < len + 19; i++) {
          let item = document.createElement("div")
          item.className = "tb-item"
          item.id = "tb-item"

          item.innerHTML = `
              <div>a${i}</div>
              <div>b${i}</div>
              <div>c${i}</div>
              <div>d${i}</div>
              <div>a${i}</div>
              <div>b${i}</div>
              <div>c${i}</div>
              <div>d${i}</div>
              <div>a${i}</div>
              <div>b${i}</div>
              <div>c${i}</div>
              <div>
                <div class="switch">
                  <div class="ball"></div>
                </div>
              </div>`
          tb.append(item)
        }
        loadLock = false
      }, LOADING_TIME)
    }
  </script>
</html>
html {
  overflow-x: hidden;
  overflow-y: auto;
}
body {
  width: 100vw;
  overflow: hidden;
  padding-right: calc(100vw - 100%);
}

.warp {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

.table {
  /* margin: 100px auto; */
  width: 1200px;
  border: 0.5px solid #b6b5b5;
}

.th {
  display: flex;
}

.tb {
  display: flex;
  flex-direction: column;
}

.tb-item {
  display: flex;
}

.tb-item > div,
.th-item {
  flex: 1;
  padding: 10px 0;
  border: 0.5px solid #b6b5b5;

  display: flex;
  justify-content: center;
  align-items: center;
}

.switch,
.switch-active {
  width: 50px;
  height: 24px;
  border-radius: 30px;
  background-color: #ccc;

  position: relative;
  cursor: pointer;
}

.switch-active {
  background-color: aquamarine;
}

.switch > div {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background-color: #fff;
}

.ball {
  position: absolute;
  top: 2px;
  left: 2px;
}

.ball-active {
  position: absolute;
  top: 2px;
  right: 2px;
}

.loader-box {
  display: flex;
  align-items: center;
  justify-content: center;
}

#loader {
  width: 25px;
  height: 25px;
  border: 3px solid #ddd;
  border-radius: 50%;
  border-bottom: 3px solid #717171;
  transform: rotate(0deg);
  animation: loading 1s linear infinite;
}

@keyframes loading {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

#nothing {
  margin-bottom: 100px;
}

.hidden {
  display: none;
}

标签:flex,ball,H5,item,switch,IntersectionObserver,tb,ID,加载
From: https://blog.csdn.net/poguanba/article/details/143592413

相关文章

  • 十三 MyBatis的高级映射及延迟加载
    十三、MyBatis的高级映射及延迟加载模块名:mybatis-009-advanced-mapping打包方式:jar依赖:mybatis依赖、mysql驱动依赖、junit依赖、logback依赖配置文件:mybatis-config.xml、logback.xml、jdbc.properties拷贝工具类:SqlSessionUtil准备数据库表:一个班级对应多个学生。......
  • 如何看懂sa-token 第一篇 是怎么设计被spring加载的
    2023年入职了一家公司,他们给到我这边的系统架构我看基本都用到了sa-token,抱着去学习的态度去官网看了文档Sa-Token,感觉有些头大,摸不着头脑,然后尝试去下载源码来看gitclonehttps://gitee.com/dromara/sa-token.git我看的时候,最新版本是v1.39.0,代码一大推,实在看不明白看懂源......
  • 3D高斯的内存数据加载节省问题
      1加载数据readColmapSceneInfo 读取全部原图  3对原图是否缩放 如果缩放缩放后的原图当真图 因此内存占用的足够大,因为所有数据提前加载到内存里。解决1大力出奇迹,开启共享内存,增大硬件内存2分批次加载,只有在训练用到这张图时候,才临时加载这张图......
  • oracle11g启动过程中加载配置文件
    oracle指定配置文件启动,要是不指定配置文件启动的话默认找的参数文件顺序如下:在oracle11g中oracle启动过程中默认会加载相应的配置文件来启动oracle服务。检查参数文件有两个,一个是spfile<ORACLE_SID>.ora文件,另一个是inti<ORACLE_SID>.ora文件。oracle软件服务安装完成后......
  • java的类加载机制详解
    Java的类加载机制是一个复杂但非常重要的过程,因为它决定了程序如何找到并加载类文件。下面我会逐步详细讲解整个机制。1.什么是类加载机制?简单来说,类加载机制就是Java虚拟机(JVM)在运行时将.class文件中的字节码加载到内存中并进行解析的过程。这个机制让JVM可以动态加......
  • STM32H563核心板调试笔记(一)
    前言这是组里师兄负责的项目,以FPGA为数据采集核心,但还需要执行一些流程性的指令,因此还需要一个CPU。我们不用Zynq是因为它里面的CPU性能比较强,功耗比较高(其实我们没有人很懂Zynq,可以说这是我们选型的假设,现在选都选好了,你就承认吧)。而MCU部分组里也就我比较懂,于是我经过一番比较......
  • CH58x/CH592x低电压监控
    前言:有时在电池供电场景或者电表的场景下可能会出现电池电压低需要更换电池突然停电需要保存数据。此时低电压监测就起到了作用。提供了两种精度模式:高精度监控和低精度监控模式高精度模式:210ua的额外功耗低精度模式:1ua的额外功耗/***@briefwakeupmodedefine*/type......
  • 前端开发中如何在页面加载时自动读取并转换指定的 .docx 文件
    前端开发中如何在页面加载时自动读取并转换指定的.docx文件,并实现在线预览功能。我在这里分享通过mammoth.min.js插件来实现docx在线预览功能第1:下载地址,大家可以任意选取下面其中一种方式下载(1)GitHub-mwilliamson/mammoth.js:ConvertWorddocuments(.docxfiles)toH......
  • h5端IOS滑动不流畅问题怎么解决
    1.CSS动画和过渡避免重排:频繁修改DOM结构、样式或使用会引发重排的属性(如width、height、top等)会导致性能下降。尽量使用transform和opacity进行动画处理。css.smooth{ transition:transform0.3sease,opacity0.3sease;}Note:transition是一种css样......
  • 采用uni-app开发圈子系统源码小程序,含PHP完整后端系统,成品源码部署搭建适用于APP+小程
    采用uni-app开发圈子系统源码小程序,含PHP完整后端系统,成品源码部署搭建适用于APP+小程序+H5兴趣社区交友圈子系统小程序源码搭建开源社区圈子系统圈子社区系统源码多端圈子社区论坛系统 线下活动兴趣圈子交友搭子系统源码即时通信社交圈子系统系统主要基于uniapp前端技术,后......