基于HTML5的下拉刷新效果

news2024/9/20 10:49:43

基于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.coloradmin.cn/o/2125692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

储能系统:工商业绿色转型的“稳压器”与“利润加速器”

在当今工商业领域&#xff0c;随着生产规模的扩大与新能源应用的快速普及&#xff0c;负荷峰谷差日益成为制约企业可持续发展的瓶颈。新能源的间歇性与不稳定性&#xff0c;更是让电网电能质量波动加剧&#xff0c;成本持续攀升。然而&#xff0c;在这一挑战背后&#xff0c;蕴…

基于Java+ssm+jsp开发的相亲交友网站管理系统

项目简介 该项目是基于Javassmjsp开发的婚恋交友网站管理系统&#xff0c;这是一项为大学生课程设计作业而开发的项目。 该系统旨在帮助大学生学习并掌握Java编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Java的婚恋交友管理系统项目&#xff0c;大学生…

源代码如何防泄漏?用对软件真的很重要!

在数字化时代&#xff0c;源代码的安全保护对企业来说至关重要。源代码泄露不仅会导致企业技术优势的丧失&#xff0c;还可能引发严重的经济损失和法律风险。因此&#xff0c;实现源代码防泄漏成为了企业信息安全战略中的重要一环。 深信达的SDC沙盒防泄密软件正是在这样的背景…

【leetcode_python】杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] 方案&#…

Facebook的虚拟现实功能简介:社交网络的新前沿

在科技飞速发展的今天&#xff0c;虚拟现实&#xff08;VR&#xff09;已经从科幻小说中的梦想变成了触手可及的现实。作为全球领先的社交平台&#xff0c;Facebook&#xff08;现已更名为Meta&#xff09;正大力推动虚拟现实技术的发展&#xff0c;以重新定义用户的社交体验。…

element表格合并列数据相同合并单元格

<!-- :span-method"objectSpanMethod"合并列 --><el-table stripe :data"morningdataList" style"width: 100%" :span-method"objectSpanMethod" ><el-table-column align"center" label"" :show…

企业数据资产目录建设方案(可编辑的46页PPT)

引言&#xff1a;在当今数据驱动的时代&#xff0c;数据已成为企业最宝贵的资产之一&#xff0c;其有效管理和利用直接关系到企业的决策效率、业务创新能力和市场竞争力。数据资产目录建设方案旨在通过系统化的方法&#xff0c;对企业内部的数据资源进行全面的梳理、分类、编目…

vscode中前端项目文件格式化备份

文件->首选项->设置 点击图标后进入&#xff0c;并粘贴下面代码 {"files.associations": {"*.vue": "vue","*.wpy": "wxml","*.wxml": "html","*.wxss": "css","*.cjso…

耦合性例题

答案&#xff1a;D 知识点&#xff1a; 耦合类型 描述 非直接耦合 两个模块之间没有直接关系&#xff0c;它们之间的联系完全是通过主模块的控制和调用实现的 数据耦合 一组模块借助参数表传递简单数据 标记耦合 一组模块通过参数表传递记录信息&#xff08;数据结构&a…

数据名称:全球土地覆盖数据产品(GLASS-GLC)

数据详情 GLASS-GLC产品以1982&#xff5e;2015年的全球陆表特征参量数据集&#xff08;GLASS CDR&#xff09;为数据源&#xff0c;借助谷歌地球引擎&#xff08;Google Earth Engine&#xff09;平台进行开发&#xff0c;涵盖耕地、森林、草原、灌木、苔原、裸地和冰雪七大土…

自注意力机制(self-attention)

自注意力机制&#xff08;self-attention&#xff09; 之前听过吴恩达老师的课&#xff0c;吴恩达老师CNN那一块讲的特别好&#xff0c;但是后面RNN这一部分我听的不是很明白&#xff0c;今天有看了李宏毅老师attention这部分的课&#xff0c;总结一下笔记。 self-attention …

外贸|基于Java+vue的智慧外贸平台系统(源码+数据库+文档)

外贸|智慧外贸平台|外贸服务系统 目录 基于Javavue的智慧外贸平台系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&…

计算机毕业设计选题推荐-项目评审系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

YOLOv5改进 | 模块缝合 | C3 融合RVB + EMA注意力机制【二次融合】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv5入门 改…

内聚性例题

答案&#xff1a;D 知识点&#xff1a; 内聚类型 描述 功能内聚 完成一个单一功能&#xff0c;各个部分协同工作&#xff0c;缺一不可 顺序内聚 处理元素相关&#xff0c;而且必须顺序执行 通信内聚 所有处理元素集中在一个数据结构的区域上 过程内聚 处理元素相关&a…

解决appium ui自动化无法识别悬浮窗问题

事情的起因是在两个项目上&#xff0c;A项目的虚浮窗按钮无法获取 B项目的推荐和看动态无法获取UI元素 通过adb shell dump也是无法获取到&#xff0c;但就一个问题&#xff0c;为啥weditor可以定位到呢&#xff1f; 那奇怪了是什么原因&#xff1f;为什么会突然有这个现象呢&a…

喜报 速程精密牵头编制团体标准《ZR机械手通用技术要求》正式发布

喜报 速程精密牵头编制团体标准《ZR机械手通用技术要求》正式发布 近日&#xff0c;由深圳市速程精密科技有限公司牵头&#xff0c;联合华南理工大学、深圳大学、电子科技大学(深圳)高等研究院、深圳职业技术大学、深圳市创新设计研究院、固高伺创驱动技术(深圳)有限公司、深圳…

TinyWebserver的复现与改进(7):日志系统

本项目中&#xff0c;使用单例模式创建日志系统&#xff0c;对服务器运行状态、错误信息和访问数据进行记录&#xff0c;该系统可以实现按天分类&#xff0c;超行分类功能&#xff0c;为了简单&#xff0c;将使用异步写入的方式。&#xff08;后续再添加同步写入&#xff09; …

声音之旅:2024四大必备音乐剪辑软件盘点!

音乐剪辑&#xff0c;作为一种艺术形式&#xff0c;让每个人都能够成为自己音乐故事的导演。今天&#xff0c;我们将探索几款优秀的音乐剪辑工具&#xff0c;它们分别是福昕音频剪辑、Audio Trimmer、Ocenaudio和闪电音频剪辑。 福昕音频剪辑 直达链接&#xff1a;www.pdf365…

去拼多多闭着眼涨薪80%,但。。。

大家好&#xff0c;我是鸭鸭。 如果给你月薪涨 80%&#xff0c;总包涨 35%&#xff0c;但是新工作需要 11116&#xff0c;你会接这个 offer 吗&#xff1f; 起因是鸭鸭今天刷到了这样一个帖子&#xff1a; 楼主表示“吓人啊”&#xff0c;可见这样的涨幅确实超乎预料。 当然…