当前位置: 首页 > news >正文

移动端实现下拉刷新和上拉加载(内含案例)

在前端开发中,上拉加载下拉刷新常用于实现内容的动态加载,尤其在移动端的应用中。下面我将提供一个简单的示例和逻辑说明。

1. 逻辑说明:

  • 下拉刷新

    • 用户向下拖动页面顶部,触发一个事件,刷新当前内容。
    • 需要检测页面的 scrollTop 为 0 时的拖动行为。
  • 上拉加载

    • 用户滚动到页面底部时,触发数据加载事件,加载更多内容。
    • 需要检测页面的 scrollHeightclientHeight 之间的距离接近为 0 时的滚动行为。

2. 案例:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>上拉加载 & 下拉刷新</title><style>body {margin: 0;padding: 0;font-family: Arial, sans-serif;}#content {height: 100vh;overflow-y: auto;}.item {padding: 20px;border-bottom: 1px solid #ccc;}.loading {text-align: center;padding: 20px;display: none;}</style>
</head>
<body><div id="content"><div id="items"></div><div class="loading" id="loading">加载中...</div></div><script>const content = document.getElementById('content');const items = document.getElementById('items');const loading = document.getElementById('loading');// 模拟初始内容加载let page = 1;function loadItems() {for (let i = 0; i < 10; i++) {const div = document.createElement('div');div.className = 'item';div.innerText = 'Item ' + (items.children.length + 1);items.appendChild(div);}}loadItems();// 下拉刷新let startY = 0;content.addEventListener('touchstart', (e) => {if (content.scrollTop === 0) {startY = e.touches[0].pageY;}});content.addEventListener('touchmove', (e) => {const moveY = e.touches[0].pageY;if (moveY - startY > 100 && content.scrollTop === 0) {// 模拟刷新操作alert('刷新页面');items.innerHTML = '';loadItems();}});// 上拉加载更多content.addEventListener('scroll', () => {if (content.scrollTop + content.clientHeight >= content.scrollHeight) {loading.style.display = 'block';setTimeout(() => {loadItems();loading.style.display = 'none';}, 1000); // 模拟加载延迟}});</script>
</body>
</html>

3. 逻辑详细说明:

  • 下拉刷新

    • 通过 touchstart 获取用户的起始触摸点,并在 touchmove 事件中判断是否有下拉行为(页面滚动条处于顶部时)。
    • 一旦检测到下拉超过一定距离(如100px),执行刷新操作,如重新加载页面内容。
  • 上拉加载

    • 通过 scroll 事件监测用户的滚动行为,检测当前滚动条位置是否接近页面底部。
    • scrollTop + clientHeight 等于或超过 scrollHeight 时,触发加载更多内容的操作,显示“加载中”提示,并在短暂延迟后加载更多数据。

这种实现方式适用于简单的内容列表,可以根据需求调整加载条件与显示样式。

http://www.lryc.cn/news/452769.html

相关文章:

  • Opencv第十一章——视频处理
  • Flutter 3.24 AAPT: error: resource android:attr/lStar not found.
  • C++——输入一个2*3的矩阵, 将这个矩阵向左旋转90度后输出。(要求:使用指针完成。)
  • AI芯片WT2605C赋能厨房家电,在线对话操控,引领智能烹饪新体验:尽享高效便捷生活
  • 详解调用钉钉AI助理消息API发送钉钉消息卡片给指定单聊用户
  • 57 长短期记忆网络(LSTM)_by《李沐:动手学深度学习v2》pytorch版
  • Linux系统安装教程
  • Redis: Sentinel工作原理和故障迁移流程
  • 通信工程学习:什么是IGMP因特网组管理协议
  • 高效批量导入多个SQL文件至SQL Server数据库的实用方法
  • 【树莓派系列】树莓派wiringPi库详解,官方外设开发
  • 前端模块化CommonJs、ESM、AMD总结
  • JavaWeb - 8 - 请求响应 分层解耦
  • 1G,2G,3G,4G,5G各代通信技术的关键技术,联系和区别
  • 【宽搜】2. leetcode 102 二叉树的层序遍历
  • Go语言实现长连接并发框架 - 请求分发器
  • Redis: 集群测试和集群原理
  • 问题解决实录 | bash 中 tmux 颜色显示不全
  • 古典舞在线交流平台:SpringBoot设计与实现详解
  • 五子棋双人对战项目(6)——对战模块(解读代码)
  • 查缺补漏----I/O中断处理过程
  • Java API接口开发规范
  • Go语言实现长连接并发框架 - 任务管理器
  • 【大数据】深入解析分布式数据库:架构、技术与未来
  • uniapp框架中实现文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间
  • GEE教程:NASA/GRACE/MASS_GRIDS/LAND数据的查看不同时期液态水数据的变化情况
  • 世邦通信股份有限公司IP网络对讲广播系统RCE
  • 爬虫——爬取小音乐网站
  • 5G NR SSB简介
  • java将mysql表结构写入到word表格中