VUE 或 Js封装通用闭包循环滚动函数

news2024/11/18 9:45:18

1、vue3 闭包滚动函数的使用

js 调用也基本雷同

//  滚动Tab组件
	const scoreTabRef = ref()
	//  滚动的选项
	const scrollOption = ref({
		// 滚动的Dom元素
		scrollDom: null,
		// 滚动的时间间隔
		scrollInterval: 1500,
		// 滚动的距离
		scrollSep: 100,
		// 滚动历时时间
		scrollDuration: 1000
	})

	const autoScroll = ref()
	onMounted(() => {
		// 初始化,获取某个组件的滚动的dom元素(设置了高度的div)
		scrollOption.value.scrollDom = scoreTabRef.value.$el.querySelector('.v-table__wrapper')
		// 闭包函数,传输滚定的选项
		autoScroll.value = tool.autoScroll(scrollOption.value)
		// 执行闭包函数的滚动方法
		autoScroll.value.startScroll()
	})

	onUnmounted(() => {
		// 销毁页面,也销毁闭包内的定时器
		autoScroll.value.destoryScroll()
	})

vue3各组件内互不影响

在这里插入图片描述

2 定义 tool.js 的平滑滚动闭包函数

闭包函数仅需关心参数

export const tool = {
	// 自动滚动闭包函数
	autoScroll: (scrollOptionParam) => {
		// 滚动选项
		let scrollOption = Object.assign(
			{
				// 滚动的Dom元素
				scrollDom: null,
				// 滚动的时间间隔
				scrollInterval: 1500,
				// 滚动的距离
				scrollSep: 50,
				// 滚动历时时间
				scrollDuration: 1000
			},
			scrollOptionParam
		)

		// 滚动临时结果
		let scrollResult = {
			scrollTimer: null,
			pauseTimer: null
		}

		// 实际滚动方法
		const scrollFun = () => {
			// 如果定时器存在
			if (scrollResult.scrollTimer) {
				// 则先清除
				clearInterval(scrollResult.scrollTimer)
				scrollResult.scrollTimer = null
			}

			scrollResult.scrollTimer = setInterval(() => {
				// 获取当前滚动条距离顶部高度
				const scrollTop = scrollOption.scrollDom.scrollTop
				const temp = scrollTop + scrollOption.scrollSep

				smoothScroll(scrollOption.scrollDom, temp, scrollOption.scrollDuration)
			}, scrollOption.scrollInterval)
		}

		// 平滑滚动效果
		const smoothScroll = (element, targetY, duration) => {
			const startY = element.scrollTop
			const distance = targetY - startY
			const startTime = performance.now()

			const scrollHeight = element.scrollHeight
			const clientHeight = element.clientHeight
			const canScroll = scrollHeight - clientHeight

			function scroll(currentTime) {
				const elapsed = currentTime - startTime
				const progress = Math.min(elapsed / duration, 1)
				const easeProgress = progress * (2 - progress)
				const currentY = startY + distance * easeProgress

				element.scrollTop = currentY

				// 如果已经达到目标位置或者达到持续时间,停止动画
				if (progress < 1 && Math.abs(currentY - targetY) > 1) {
					requestAnimationFrame(scroll)
				} else {
					element.scrollTop = targetY // 确保最终位置
				}

				// 距离顶部高度  大于等于 滚动长度
				if (canScroll <= targetY) {
					// 滚动到底部 停止定时器
					clearInterval(scrollResult.scrollTimer)
					scrollResult.scrollTimer = null
					scrollOption.scrollDom.scrollTop = 0
					// 一秒后重开定时器
					setTimeout(() => {
						scrollFun()
					}, 1000)
				}
			}
			requestAnimationFrame(scroll)
		}

		const pauseScroll = () => {
			// 定时器不为空
			if (scrollResult.scrollTimer) {
				// 清除定时器
				clearInterval(scrollResult.scrollTimer)
				scrollResult.scrollTimer = null
				// 一秒钟后重新开始定时器
				scrollResult.pauseTimer = setTimeout(() => {
					scrollFun()
				}, 2000)
			}
		}

		return {
			startScroll: () => {
				const scrollHeight = scrollOption.scrollDom.scrollHeight
				const clientHeight = scrollOption.scrollDom.clientHeight
				const scroll = scrollHeight - clientHeight
				// 滚动长度为0,则无法实现自动滚动
				if (scroll === 0) {
					return
				}
				// 触发滚动方法
				scrollFun()
				// 去除点击监听
				scrollOption.scrollDom.removeEventListener('click', pauseScroll)
				// 重设点击监听
				scrollOption.scrollDom.addEventListener('click', pauseScroll, false)
			},
			destoryScroll: () => {
				// 清理定时器
				clearTimeout(scrollResult.pauseTimer)
				scrollResult.pauseTimer = null
				clearInterval(scrollResult.scrollTimer)
				scrollResult.scrollTimer = null
				// 清理点击监听
				scrollOption.scrollDom.removeEventListener('click', pauseScroll)
			}
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1655788.html

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

相关文章

视频汇聚边缘网关EasyCVR硬件设备无法访问域名,解析失败该如何处理?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备传统安防视…

240多道!Go开发岗位面试题合集(含答案)

随着今年互联网寒潮环境的影响&#xff0c;找工作的人也将达到顶峰&#xff0c;今天给大家分享一份《Go开发工程师超高频面试真题》&#xff0c;一共有240多道面试真题&#xff0c;希望能够帮助大家在面试中&#xff0c;少走一些弯路、更快拿到offer&#xff01; 内容展示 GO 基…

uniapp0基础编写安卓原生插件之编写安卓页面在uniapp上显示(摄像头调用)

前言 如果你对安卓插件开发部分不熟悉你可以先看uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件 效果 开始 dcloud_uniplugins.json {"nativePlugins": [{"hooksClass": "","plugins": [{&…

信奥一本通:1103:陶陶摘苹果

#include <iostream> using namespace std; int a[101]; int main(){int n 10;//题目要求输十个数 for(int i 1;i < 10; i){cin >> a[i];//赋值到数组 }int c;cin >> c;//要求的值 int cnt 0;//计数 for(int i 1; i < n; i){//循环比较是否小于&am…

试用NXP官方的UDS bootloader

文章目录 1.前言2.资料获取2.1 MCU例程 2.2 开发环境2.3 上位机2.4 硬件 3.工程修改3.1 boot工程修改 3.2 app工程修改4.测试情况5.例程分享 1.前言 最近很多客户在开发S32K系列MCU时咨询是否可以提供基于UDS协议的bootloader。本文以S32K144为例&#xff0c;介绍如何使用NXP官…

Parallels Desktop 19 for Mac v19.3.0.54924中文破解版

Parallels Desktop 19 for Mac v19.3.0.54924中文破解版是一款强大的虚拟机软件&#xff0c;支持多操作系统&#xff0c;提供卓越的虚拟化技术&#xff0c;确保流畅稳定的运行。新增特色功能如共享打印、TouchID集成等&#xff0c;提供便捷高效的虚拟机体验。界面美观现代&…

window golang 升级版本

执行go tidy&#xff0c;发现执行不了&#xff0c;得升级一下版本了 进入官网&#xff0c;并选择合适的系统以及版本。https://go.dev/dl/ 这台电脑是windows&#xff0c;我本人比较喜欢下载zip自己解压。 解压&#xff0c;这里我选择直接覆盖原文件&#xff0c;需要保留原版…

即将开幕,邀您共赴创新之旅“2024上海国际消费者科技及创新展览会”

备受期待的2024上海国际消费者科技及创新展览会&#xff08;以下简称“CTIS”&#xff09;即将于6月13日至15日亮相上海新国际博览中心N1-N3馆。 2024上海国际消费者科技及创新展览会总面积达40,000平方米&#xff0c;涵盖600余家展商&#xff0c;预计吸引40,000多位观众莅临现…

autodl 上 使用 LLaMA-Factory 微调 中文版 llama3

autodl 上 使用 LLaMA-Factory 微调 中文版 llama3 环境准备创建虚拟环境下载微调工具 LLaMA-Factory下载 llama3-8B开始微调测试微调结果模型合并后导出vllm 加速推理 环境准备 autodl 服务器&#xff1a; https://www.autodl.com/console/homepage/personal 基本上充 5 块钱…

毕业论文应该怎么写?推荐几款ai写论文工具

时间过的好快&#xff0c;马上又到了一年一度的毕业季了&#xff0c;对于即将毕业的学生来说毕业论文是一道难过的坎&#xff0c;想到自己为了毕业论文熬的夜&#xff0c;掉的头发&#xff0c;真的深有感触。 不过虽然翟博士给大家的毕业论文设了高门槛&#xff0c;但是随着时…

springboot项目中引入Xxl-Job并部署和使用

目录 模块划分 配置调度中心 配置执行器 添加执行器 写一个简单的定时任务 XxlJobHelper xxl-job是分布式任务调度平台&#xff0c;部署为独立的调度服务平台 github地址&#xff1a;xuxueli/xxl-job: A distributed task scheduling framework.&#xff08;分布式任务调度…

ctfshow之_萌新web9至web10

一、访问在线靶场ctfshow 1、web9 如下图所示&#xff0c;进入_萌新赛的web9问题&#xff0c;题目提醒flag在config.php中&#xff1a; 如上图所示&#xff0c;可以get传参&#xff0c;且传入的参数需要正则匹配system、exec、highlight&#xff0c;且不区分大小写&#xff0…

Flink checkpoint 源码分析- Checkpoint snapshot 处理流程

背景 在上一篇博客中我们分析了代码中barrier的是如何流动传递的。Flink checkpoint 源码分析- Checkpoint barrier 传递源码分析-CSDN博客 最后跟踪到了代码org.apache.flink.streaming.runtime.io.checkpointing.CheckpointedInputGate#handleEvent 现在我们接着跟踪相应…

element ui的确认提示框按钮样式修改

修改确认提示框的默认按钮样式&#xff0c;使用css强制修改 例&#xff1a; js代码&#xff1a; deleteUser(params){this.$confirm("您确定要删除吗&#xff1f;此操作无法撤销并且将永久删除所有数据。", "提示", { type: "warning", cancel…

西奥CHT-01软胶囊硬度计:开启硬度测试新纪元,引领制药行业品质升级

西奥CHT-01软胶囊硬度计&#xff1a;开启硬度测试新纪元&#xff0c;引领制药行业品质升级 在追求品质卓越的制药行业中&#xff0c;软胶囊硬度测试是确保药品质量与安全的关键环节。为了满足行业对高精度、高效率硬度测试的需求&#xff0c;西奥科技推出了CHT-01软胶囊硬度计…

【XR806开发板试用】使用FDCM操作Flash记录开机次数

一、寻找系统分配的自定义用户数据地址 &#xff08;1&#xff09;XR806的Flash布局 如图1所示&#xff0c;FLASH的布局有两种&#xff1a; 1、没有开启OTA模式&#xff1b;Image1PaddingSysinfo 2、开启OTA模式&#xff1b;Image1PaddingSysinfoOTA area Image2 Padding 如图…

一维数组 和 关键字 sizeof

数组的概念 “ 数组 ”我们可以理解成一组相同类型元素的集合 &#xff08;1&#xff09;其中可以是单个或是多个元素&#xff0c;可以是0&#xff0c;但元素个数不能为0 &#xff08;2&#xff09;一个数组中存放的元素必须是同类型的&#xff0c;比如一组整型&#xff0c;…

ruoyi-nbcio 基于flowable规则的多重并发网关的任意跳转

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

【密评】 | 商用密码应用安全性评估从业人员考核题库(6/58)

根据Kerckhoffs原则&#xff0c;密码系统的安全性主要依赖于&#xff08;&#xff09;。 A. 密钥 B. 加密算法 C. 解密算法 D. 通信双方 2000年10月&#xff0c;美国NIST宣布&#xff08;&#xff09;算法作为新的高级加密标准AES。 A. Rijndael B. RC6 C. SERPENT D. Twofish…

去除快捷方式的箭头图标

文章目录 取消箭头显示恢复箭头显示结果展示 添加快捷方式之后&#xff0c;会有箭头图标&#xff0c;部分场景下看着较为难受&#xff1a; 可以通过如下方式取消/显示箭头&#xff1a; 取消箭头显示 新建一个.bat文件&#xff0c;内部加入如下命令&#xff1a; reg add "…