基于HTML5的下拉刷新效果

news/2024/9/18 10:36:53/ 标签: html5, 前端, html

基于HTML5的下拉刷新效果

    • 效果示例图
    • 示例代码

效果示例图

在这里插入图片描述

示例代码

<!DOCTYPE html>
<html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width,initial-scale=1.0" /><title></title><style type="text/css">* {padding: 0;margin: 0;box-sizing: border-box;}.main {width: 100%;height: 100vh;background-color: #f5f5f5;position: relative;}.dot-wrap {width: 100%;height: 30px;position: absolute;background-color: #fff;top: -30px;}.dot {position: absolute;width: 10px;height: 10px;border-radius: 10px;background-color: rgb(0, 0, 0, 0.3);top: 0;left: 50%;margin-left: -5px;}.dot:last-child {display: none;}.dot.loading {display: unset;animation: dot-move 1.5s infinite;}@keyframes dot-move {0% {transform: translateX(-20px);}33.33% {transform: translateX(-20px);}33.34% {transform: translateX(0px);}66.66% {transform: translateX(0px);}66.67% {transform: translateX(20px);}100% {transform: translateX(20px);}}.block-item {width: 100%;height: 200px;background-color: red;margin-bottom: 12px;}</style></head><body><div class="main"><div class="dot-wrap"><div class="dot"></div><div class="dot"></div><div class="dot"></div><div class="dot"></div></div><div class="block-item"></div><div class="block-item"></div><div class="block-item"></div><div class="block-item"></div><div class="block-item"></div><div class="block-item"></div><div class="block-item"></div><div class="block-item"></div><div class="block-item"></div><div class="block-item"></div><div class="block-item"></div><div class="block-item"></div></div></body><script type="text/javascript">let timerHandle = null;const mainDom = document.querySelector(".main");const dots = document.querySelectorAll(".dot");const rootDocument = document.documentElement;//当滚动条在最顶部时可以下拉刷新if (rootDocument.scrollTop === 0) {addTouchEvent();}//滚动监听window.onscroll = function() {//当滚动条到达顶部时,可以触发下拉拖动事件if (rootDocument.scrollTop <= 0) {rootDocument.scrollTop = 0;addTouchEvent();} else {removeTouchEvent();}}let distance, ox, oy, x, y = 0;function startEvent(e) {console.log("[start]", e)//获取手指起始值ox = e.touches[0].clientX;oy = e.touches[0].clientY;}function moveEvent(e) {if (!e.cancelable) {return; // 如果事件不可取消,直接返回,避免报错}//获取手指移动值x = e.touches[0].clientX;y = e.touches[0].clientY;//判断下拉意图if (y - oy > 0) {const deg = Math.atan(Math.abs(x - ox) / Math.abs(y - oy)) / Math.PI * 180;if (deg > 40) {ox = x;oy = y;return false;}} else {removeTouchEvent();if (rootDocument.scrollTop === 0) {addTouchEvent();return false;}}//手指移动的距离distance = y - oy;//添加阻尼效果let percent = (100 - distance * 0.5) / 100;percent = percent < 0.5 ? 0.5 : percent;distance = distance * percent//设置页面偏移距离mainDom.style.transform = `translateY(${distance}px)`console.log("[move]", distance)if (distance > 20 && distance <= 50) {dots[0].style.transform = `translateX(-${(distance-20)*2/3}px)`;dots[2].style.transform = `translateX(${(distance-20)*2/3}px)`;} else if (distance > 50) {dots[0].style.transform = `translateX(-20px)`;dots[2].style.transform = `translateX(20px)`;}e.preventDefault();}function endEvent() {//当拖动的相对值大于50时if (distance >= 50) {//可以触发下拉刷新dots[3].classList.add('loading')mainDom.style.transition = `all 0.2s`;mainDom.style.transform = `translateY(50px)`if (timerHandle) {clearTimeout(timerHandle)}timerHandle = setTimeout(() => {if (timerHandle) {clearTimeout(timerHandle)}removeEffect()}, 2000);} else {removeEffect()}}function removeEffect() {//清除过渡效果mainDom.style.transition = `all 0.2s`;mainDom.style = '';dots[3].classList.remove('loading')}function addTouchEvent() {/*** 通过将`passive`设置为`false`,表示在触发`touchmove`事件时,事件处理函数可以调用`preventDefault()`来阻止默认行为。* 这意味着在移动过程中,可以阻止浏览器执行默认的滚动行为。*/mainDom.addEventListener('touchstart', startEvent, {passive: false});mainDom.addEventListener("touchmove", moveEvent, {passive: false})mainDom.addEventListener('touchend', endEvent, {passive: false})}function removeTouchEvent() {mainDom.removeEventListener('touchstart', startEvent);mainDom.removeEventListener("touchmove", moveEvent)mainDom.removeEventListener('touchend', endEvent)}</script>
</html>

http://www.ppmy.cn/news/1526282.html

相关文章

Linux下的gcc与gdb

目录 Linux下的gcc与gdb 代码编译与链接 函数库 gdb介绍和安装 gdb基本使用指令 示例代码 debug模式和release模式 基本指令 进入gdb调试与显示调试代码 创建断点与删除断点 启用和禁用断点 执行代码 逐语句和逐过程调试 断点跳转 显示指定变量以及对应内容 打印变量的值 执行到…

复杂情感识别系统

复杂情感识别系统&#xff08;CERS&#xff09;是一种先进的技术平台&#xff0c;旨在通过分析情感的组合、相互关系及其动态变化来解读和识别复杂的情感状态。这种系统通常采用以下技术和方法&#xff1a; 机器学习与深度学习&#xff1a; 通过训练算法识别和解释大量情感数据…

【Linux】调试和Git及进度条实现

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;Linux入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1.…

Sitecore 定时任务使用介绍

一、简介 Sitecore 定时任务是 Sitecore CMS 中一个重要的功能&#xff0c;它允许在特定时间自动执行一系列操作或任务。这些任务可以用于多种场景&#xff0c;如内容发布、索引重建、日志清理、数据库维护等。 在 Sitecore 中可以使用两种类型的定时任务&#xff0c;一是定时…

Ubuntu 不重装系统增加交换空间大小

目录 一、设置交换文件 二、删除重新创建交换文件 一、设置交换文件 1、创建新的交换文件 使用 dd 命令创建一个新的交换文件。例如&#xff0c;创建一个4GB的交换文件&#xff1a; sudo dd if/dev/zero of/swapfile bs1G count4 2、设置交换文件的权限 为了安全起见&am…

现代 Web 开发工具箱:Element-UI 表单组件全攻略(二)

现代 Web 开发工具箱&#xff1a;Element-UI 表单组件全攻略&#xff08;二&#xff09; 一 . Switch 开关控件1.1 Switch 组件的创建① 注册路由② 创建 Switch 组件 1.2 Switch 组件的属性① 开关的宽度② 开关 打开/关闭 的文字提示③ 开关打开或者关闭时候的值④ 开关打开或…

什么是java的spi?

Java SPI&#xff08;Service Provider Interface&#xff09;是一种提供服务发现机制的设计模式&#xff0c;允许在运行时动态地发现、加载和替换服务的实现。SPI机制的核心思想是&#xff1a;通过接口定义服务&#xff0c;并且使用外部的实现类来提供该服务的具体功能。 目录…

三步设置NAS的内网穿透

现在的NAS很多&#xff0c;NAS中可以提供的dock服务也很多&#xff0c;博主也试了一下&#xff0c;可以把家里的服务提供到公网上&#xff1a; 1、博主有一个“终身免费的花生壳域名”&#xff1a; 2、博主家有一个华为的AX3 PRO路由器&#xff0c;在路由器中设置花生壳域名的…

报错error: RPC failed,curl 16 Error in the HTTP2 framing layer解决方法

error: RPC failed&#xff1b; curl 16 Error in the HTTP2 framing layerfatal: expected flush after ref listing 问题描述&#xff1a; git pull origin main报错error: RPC failed&#xff0c;curl 16 Error in the HTTP2 framing laye 解决方法1&#xff1a; git con…

Blender/3ds Max/C4D哪个软件好?

在3D建模和动画制作领域&#xff0c;Blender、3ds Max和Cinema 4D&#xff08;C4D&#xff09;都是备受赞誉的软件。每个软件都有其独特的优势和特点&#xff0c;选择哪个软件取决于用户的具体需求和个人偏好。今天&#xff0c;成都渲染101云渲染就来分析一些这三款软件的情况&…

828华为云征文|华为Flexus云服务器搭建Cloudreve私人网盘

《华为 Flexus 云服务器搭建 Cloudreve 私人网盘》 一、华为云 Flexus X 实例&#xff1a;开启高效云服务新篇 在云计算的广阔领域中&#xff0c;资源的灵活配置与卓越性能犹如璀璨星辰般闪耀。华为云 Flexus X 实例恰似一颗最为耀眼的新星&#xff0c;将云服务器技术推向了崭…

用Python创建一个键盘输入捕获程序

目录 简介 环境准备 安装依赖 项目结构 编写代码 1. 导入库 2. 定义回调函数 3. 启动键盘监听器 4. 整合代码 运行程序 结论 简介 在这篇博文中,我们将探索如何使用Python编写一个简单的键盘输入捕获程序。这个程序将实时捕获用户的键盘输入并在控制台中显示出来。…

PHP省时省力海报在线制作系统小程序源码

省时省力海报在线制作系统&#xff1a;设计小白也能秒变大师 &#x1f3a8; 开篇&#xff1a;告别繁琐&#xff0c;拥抱高效设计 你还在为设计一张海报而熬夜加班吗&#xff1f;还在为找不到合适的素材而焦头烂额吗&#xff1f;别担心&#xff0c;“省时省力海报在线制作系统”…

用户登陆网址都发生了什么?

用户从网址登录到查询后端服务&#xff0c;中间涉及多个步骤&#xff0c;每个步骤都有特定的功能和设计考量。以下是一个详细的描述&#xff0c;涵盖了从用户请求到后端服务响应的全过程。 1. 用户请求 步骤&#xff1a; 用户在浏览器中输入URL并按下回车。 功能&#xff1…

区块链当前发展和未来展望

1. 区块链技术发展的新兴趋势 由于学术界和商业界对区块链技术的浓厚兴趣&#xff0c;该技术正处于快速变化和蓬勃发展状态中。随着区块链技术的日益成熟&#xff0c;出现了一些新兴趋势。例如&#xff0c;在金融领域出现了区块链的特定用例&#xff0c;引起了人们的较大关注。…

代码随想录训练营 Day58打卡 图论part08 拓扑排序 dijkstra朴素版 + 堆优化版

代码随想录训练营 Day58打卡 图论part08 一、拓扑排序 例题&#xff1a;卡码117. 软件构建 题目描述 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果…

基于树莓派ubuntu20.04的ros-noetic小车

目录 一、小车的架构 1.1 总体的概述 1.2 驱动系统 1.3 控制系统 二、驱动系统开发 2.1 PC端Ubuntu20.04安装 2.2 树莓派Ubuntu20.04安装 2.3 PC端虚拟机设置静态IP 2.4 树莓派设置静态IP 2.5 树莓派启动ssh进行远程开发 2.5 arduino ide 开发环境搭建 2.5.1 PC…

flink on k8s

1.修改host文件 vi /etc/hosts 添加如下内容 这样搭集群的时候就不用记ip了 #::1 localhost localhost.localdomain localhost6 localhost6.localdomain6127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 165.154.221.97 tlb-001 k8s01 k8s-m…

mfc140u.dll丢失有啥方法能够进行修复?分享几种mfc140u.dll丢失的解决办法

你是否曾遇到过这样的情况&#xff1a;当你满怀期待地打开一个应用程序时&#xff0c;却被一个错误提示拦住了去路&#xff0c;提示信息中指出 mfc140u.dll 文件丢失。这个问题可能会让你感到困惑和无助&#xff0c;但是不要担心&#xff0c;本文将为你详细解读 mfc140u.dll 丢…

ARM驱动学习之21_字符驱动

ARM驱动学习之21_字符驱动 操作步骤&#xff1a; file_operations中的函数比较多&#xff0c; 选取用的比较多的函数简单介绍&#xff0c; 后 面的驱动教程中调用了对应的函数• int (*open) (struct inode *, struct file *) – 打开函数 • int (*release) (struct inode *…