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

Vue3组合式函数(滚动监测 useScroll)

主要用于实时监测目标元素滚动位置及状态

工具函数源码

/*** 组合式函数* 实时监测目标元素滚动位置及状态** 自定义钩子用于处理滚动事件和状态* @param target 滚动目标元素,可以是 Ref、HTMLElement、Window 或 Document,默认为 window* @param throttleDelay 节流延迟,用于限制滚动事件的触发频率,默认为 0* @param onScroll 滚动事件的回调函数,可选* @param onStop 滚动结束的回调函数,可选* @returns 返回一个对象,包含滚动位置和各种状态信息*/
import { ref, computed, watch, onBeforeUnmount } from 'vue'
import type { Ref } from 'vue'
import { throttle, debounce } from 'vue-amazing-ui'
export function useScroll(target: Ref | HTMLElement | Window | Document = window,throttleDelay: number = 0,onScroll?: (e: Event) => void,onStop?: (e: Event) => void
) {const x = ref(0) // 水平滚动距离const xScrollMax = ref(0) // 水平最大可滚动距离const y = ref(0) // 垂直滚动距离const yScrollMax = ref(0) // 垂直最大可滚动距离const isScrolling = ref(false) // 是否正在滚动const left = ref(false) // 是否向左滚动const right = ref(false) // 是否向右滚动const top = ref(false) // 是否向上滚动const bottom = ref(false) // 是否向下滚动const lastScrollLeft = ref(0) // 上一次水平滚动距离const lastScrollTop = ref(0) // 上一次垂直滚动距离// 滚动事件function scrollEvent(e: Event) {isScrolling.value = trueconst eventTarget = ((e.target as Document).documentElement ?? e.target) as HTMLElementx.value = eventTarget.scrollLefty.value = eventTarget.scrollTopleft.value = x.value < lastScrollLeft.valueright.value = x.value > lastScrollLeft.valuetop.value = y.value < lastScrollTop.valuebottom.value = y.value > lastScrollTop.valuelastScrollLeft.value = x.valuelastScrollTop.value = y.valuedebounceScrollEnd(e)onScroll && onScroll(e)}// 使用节流函数限制滚动事件触发频率const throttleScroll = throttle(scrollEvent, throttleDelay)// 滚动结束事件function scrollEndEvent(e: Event) {if (!isScrolling.value) {return}isScrolling.value = falseleft.value = falseright.value = falsetop.value = falsebottom.value = falseonStop && onStop(e)}// 使用防抖函数延迟处理滚动结束事件const debounceScrollEnd = debounce(scrollEndEvent, throttleDelay + 200)// 计算滚动目标元素const scrollTarget = computed(() => {const targetValue = toValue(target)if (targetValue) {return targetValue}return null})// 监听滚动目标元素的变化watch(() => scrollTarget.value,(to: any, from: any) => {if (from) {cleanup(from)}if (to) {const el: Element = ((to as Window)?.document?.documentElement ||(to as Document)?.documentElement ||(to as HTMLElement)) as ElementxScrollMax.value = el.scrollWidth - el.clientWidthyScrollMax.value = el.scrollHeight - el.clientHeightel.addEventListener('scroll', throttleScroll)el.addEventListener('scrollend', debounceScrollEnd)}},{immediate: true,flush: 'post'})// 清理函数,用于移除事件监听器function cleanup(target: any) {const el: Element = ((target as Window)?.document?.documentElement ||(target as Document)?.documentElement ||(target as HTMLElement)) as Elementel.removeEventListener('scroll', throttleScroll)el.removeEventListener('scrollend', debounceScrollEnd)}// 在组件卸载前调用清理函数onBeforeUnmount(() => cleanup(scrollTarget.value))// 返回滚动位置和各种状态信息return { x, xScrollMax, y, yScrollMax, isScrolling, left, right, top, bottom }
}

效果如下图

在这里插入图片描述

在线预览

基本使用

<script setup lang="ts">
import { ref } from 'vue'
import { useScroll } from 'vue-amazing-ui'
const scrollRef = ref()
const { x, xScrollMax, y, yScrollMax, isScrolling, left, right, top, bottom } = useScroll(scrollRef, 0, onScroll, onStop)
function onScroll(e: Event) {console.log('scroll', e)
}
function onStop(e: Event) {console.log('scrollend', e)
}
</script>
<template><Flex justify="space-between"><div class="scroll-container" ref="scrollRef" ><div class="scroll-content"><div class="inside-content">Scroll Me</div></div></div><Card title="滚动位置及状态" :body-style="{ fontSize: '16px' }"><p>水平滚动距离:{{ x }}</p><p>垂直滚动距离:{{ y }}</p><p>水平最大可滚动距离:{{ xScrollMax }}</p><p>垂直最大可滚动距离:{{ yScrollMax }}</p><p>是否正在滚动:{{ isScrolling }}</p><p>是否向左滚动:{{ left }}</p><p>是否向右滚动:{{ right }}</p><p>是否向上滚动:{{ top }}</p><p>是否向下滚动:{{ bottom }}</p></Card></Flex>
</template>
<style lang="less" scoped>
.scroll-container {width: 360px;height: 360px;border-radius: 12px;border: 2px solid #1677ff;overflow: scroll;.scroll-content {position: relative;width: 600px;height: 600px;.inside-content {position: absolute;top: 33.3%;left: 33.3%;font-size: 20px;color: rgba(0, 0, 0, 0.88);font-weight: 500;background: #fafafa;padding: 6px 8px;border-radius: 8px;}}
}
</style>

Params

参数说明类型默认值
target滚动目标元素Ref | HTMLElement | Window | Documentwindow
throttleDelay节流延迟时间,单位 ms,用于限制滚动事件的触发频率number0
onScroll?滚动事件的回调函数(e: Event) => voidundefined
onStop?滚动结束的回调函数(e: Event) => voidundefined

相关文章:

Vue3组合式函数(滚动监测 useScroll)

主要用于实时监测目标元素滚动位置及状态 工具函数源码 /*** 组合式函数* 实时监测目标元素滚动位置及状态** 自定义钩子用于处理滚动事件和状态* param target 滚动目标元素&#xff0c;可以是 Ref、HTMLElement、Window 或 Document&#xff0c;默认为 window* param throt…...

Vue.js+Element UI 登录界面开发详解【附源码】

成果图&#xff1a; 一、技术架构解析 本登录模块采用前后端分离架构&#xff0c;前端基于Vue.jsElement UI实现交互逻辑&#xff0c;主要包含以下技术要点&#xff1a; ​组件化开发 - 采用单文件组件形式组织代码​响应式设计 - 实现多终端适配​状态管理 - 使用sessionSto…...

瑞幸需要宇树科技

吃不到“星巴克红利”&#xff0c;瑞幸活成“Manner”。 作者|古廿 编辑|杨舟 “是不是又要开始3月革命了。”有瑞幸员工透露&#xff0c;今年开始瑞幸加强了系统排班的执行力度。新的排班体系下&#xff0c;要求各时段门店实际值班人员和排班系统一致。如果需要调整&#xf…...

linux 命令 vim

以下是 Linux 中 Vim 编辑器的核心命令总结&#xff0c;分为基础操作、高效编辑技巧和实用场景&#xff0c;助你快速掌握 1. 启动与退出 命令说明vim 文件名打开或新建文件vim 行号 文件名打开文件并跳转到指定行&#xff08;如 vim 10 file.txt&#xff09;:q退出 Vim&#…...

JS—基本数据类型和引用数据类型:1分钟掌握两者的区别

个人博客&#xff1a;haichenyi.com。感谢关注 一. 目录 一–目录二–分类三–核心区别四–实际场景中的问题五–总结对比 二. 分类 前面说过这么判断数据类型&#xff0c;今天来说说基本数据类型和引用数据类型的区别。 基本数据类型引用数据类型StringObjectNumberFunct…...

计算机网络的框架结构

计算机网络课程知识体系框架 一、计算机网络基础概念 1.1 网络组成要素 端系统&#xff08;主机、服务器&#xff09;通信链路&#xff08;有线/无线介质&#xff09;交换设备&#xff08;路由器、交换机&#xff09;协议体系&#xff08;TCP/IP协议簇&#xff09; 1.2 网络…...

解决MySQL字符集冲突引发的“Illegal mix of collations”错误

引言 在开发过程中&#xff0c;我们常常会遇到数据库层面的字符集兼容性问题。本文将通过一个典型的案例&#xff0c;分析因字符集不匹配导致的 Illegal mix of collations 错误&#xff0c;并提供完整的解决方案&#xff0c;帮助开发者彻底规避此类问题。 问题现象 假设我们…...

Vue中的publicPath释义

publicPath 部署应用包时的基本URL。用法和 webpack 本身的 output.publicPath 一致&#xff0c;但是 Vue CLI 在一些其他地方也需要用到这个值&#xff0c;所以请始终使用 publicPath 而不要直接修改 webpack 的 output.publicPath。 默认情况下&#xff0c;Vue CLI 会假设你…...

python 库笔记:pytorch-tcn

提供以下功能 TCN类Conv1d 和 ConvTranspose1d 层的实现&#xff0c;并带有因果/非因果切换功能流式推理&#xff08;Streaming Inference&#xff09;选项&#xff0c;可用于实时应用兼容 ONNX&#xff08;Open Neural Network Exchange&#xff09;格式&#xff0c;可在非Py…...

如何使用MySQL快速定位慢SQL问题?企业级开发中常见业务场景中实际发生的例子,涉及分页查询问题。(二)

如何使用MySQL快速定位慢SQL问题&#xff1f; 在企业级开发中&#xff0c;尤其是涉及到订单查询的业务时&#xff0c;经常会发生慢查询的问题。比如用户翻页到后面的页数时&#xff0c;查询变慢&#xff0c;因为传统的LIMIT offset, size在数据量大时效率低下。这时候&#xff…...

新造车不再比拼排名,恰是曲终人散时,剩者为王

据称新能源汽车周销量不再发布&#xff0c;这可能也预示着新造车终于到了给出答案的时候了&#xff0c;新造车企业前三强已基本确立&#xff0c;其余那些落后的车企已很难有突围的机会&#xff0c;而特斯拉无疑是其中的最大赢家。 3月份第一周的数据显示&#xff0c;销量最高的…...

博客迁移----宝塔面板一键迁移遇到问题

前景 阿里云轻量级服务器到期了&#xff0c;又免费领了个ESC&#xff0c; 安转了宝塔面板。现在需要迁移数据&#xff0c;使用宝塔面板一键迁移功能&#xff0c;完成了数据的迁移&#xff0c;改了域名的解析&#xff0c;现在进入博客是显示502 bad grateway 宝塔搬家参考链接…...

蓝桥杯练习day1:自除数

前言 自除数 是指可以被它包含的每一位数整除的数。 例如&#xff0c;128 是一个 自除数 &#xff0c;因为 128 % 1 0&#xff0c;128 % 2 0&#xff0c;128 % 8 0。 自除数 不允许包含 0 。 给定两个整数 left 和 right &#xff0c;返回一个列表&#xff0c;列表的元素…...

大数据处理最容易的开源平台

大数据处理最容易的开源平台可以从多个角度进行分析&#xff0c;包括易用性、灵活性、成本效益以及社区支持等方面。 Apache Spark Apache Spark 是一个广泛使用的开源大数据处理框架&#xff0c;以其快速、通用和易于使用的特点而著称。它支持多种编程语言&#xff08;如 Scal…...

Dify 使用 - 创建 翻译 工作流

文章目录 1、选择 模板2、设置 和 基本使用3、运行应用 1、选择 模板 2、设置 和 基本使用 翻译模板 自带了系统提示词&#xff0c;你也可以修改 3、运行应用 右上角 点击 发布 – 更新&#xff0c;运行应用&#xff0c;就可以在新的对话界面中使用此功能 2025-03-18&#x…...

TreelabPLMSCM数字化供应链解决方案0608(61页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。 资料解读&#xff1a;TreelabPLMSCM 数字化供应链解决方案 0608 在当今快速变化的市场环境中&#xff0c;企业面临着诸多挑战&#xff0c;Treelab 数智化 PLM_SCM 行业解决方案应运而生。该方案聚焦市场趋势与行业现状&#xff0c;致力于解…...

LogicFlow介绍

LogicFlow介绍 LogicFlow是一款流程图编辑框架&#xff0c;提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端自定义开发各种逻辑编排场景&#xff0c;如流程图、ER图、BPMN流程等。在工作审批流配置、机器人逻辑编排、无代码平…...

[蓝桥杯 2023 省 B] 飞机降落

[蓝桥杯 2023 省 B] 飞机降落 题目描述 N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti​ 时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 D i D_{i} Di​ 个单位时间&#xff0c;即它最早可以于 T i T_{i} Ti​ 时刻…...

应用分层简介

一、什么是应用分层 应用分层是一种软件开发设计思想&#xff0c;它将应用程序分为多个层次&#xff0c;每个层次各司其职&#xff0c;多个层次之间协同提供完整的功能&#xff0c;根据项目的复杂程度&#xff0c;将项目分为三层或者更多层。 常见的MCV设计模式&#xff0c;就…...

基于香橙派 KunpengPro学习CANN(3)——pytorch 模型迁移

通用模型迁移适配可以分为四个阶段&#xff1a;迁移分析、迁移适配、精度调试与性能调优。 迁移分析 迁移支持度分析&#xff1a; 准备NPU环境&#xff0c;获取模型的源码、权重和数据集等文件&#xff1b;使用迁移分析工具采集目标网络中的模型/算子清单&#xff0c;识别第三方…...

【Ratis】ReferenceCountedObject接口的作用及参考意义

Apache Ratis的项目源码里,大量用到了自定义的ReferenceCountedObject接口。 本文就来学习一下这个接口的作用,并借鉴一下它解决的问题和实现原理。 功能与作用 ReferenceCountedObject 是一个接口,用于管理对象的引用计数。它的主要功能和作用包括: 引用计数管理: 提供…...

CentOS下安装ElasticSearch(日志分析)

准备目录 搞一个自己喜欢的目录 mkdir /usr/local/app 切换到该目录 cd /usr/local/app 下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-linux-x86_64.tar.gz 选择其他版本 点击进入官网...

动态库、静态库、导入库

静态库、动态库与导入库详解 核心概念 类型定义文件扩展名链接方式运行时依赖静态库预编译代码集合&#xff0c;编译时嵌入可执行文件.lib (Windows)、.a (Linux/MinGW)直接链接到可执行文件无动态库运行时加载的代码库&#xff0c;允许多程序共享.dll (Windows)、.so (Linux)…...

电子硬件入门(三)——偏置电路

文章目录 一、先理解问题&#xff1a;为什么需要偏置电压&#xff1f;二.偏置电路生成的四大核心零件​三、工作流程图解​四、实物电路对照​五、常见问题答疑 一、先理解问题&#xff1a;为什么需要偏置电压&#xff1f; 想象一下&#xff0c;电机的电流像一条波浪线&#x…...

使用C++写一个递推计算均方差和标准差的用例

文章目录 代码输出关键实现说明1. 类设计2. 算法核心3. 数值稳定性 扩展应用场景1. 实时传感器数据处理2. 大规模数据集分块处理 总结 以下是用 C 实现递推计算均值、方差和标准差的完整示例代码&#xff0c;基于 Welford 算法&#xff0c;适用于实时数据流或大数据场景&#x…...

springBoot中不添加依赖 , 手动生成一个token ,并校验token,在统一拦截器中进行校验 (使用简单 , 但是安全性会低一点)

要在 Spring Boot 里实现接口统一拦截并校验 Token&#xff0c;可以借助 Spring 的拦截器机制。下面是具体的实现步骤和代码示例。 1. 创建 Token 工具类 import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgori…...

Vue:单文件组件

Vue&#xff1a;单文件组件 1、 什么是单文件组件&#xff1f; 在传统的Vue开发里&#xff0c;我们接触的是非单文件组件&#xff0c;它们通常被定义在同一个HTML文件中&#xff0c;随着项目规模的扩大&#xff0c;代码会变得杂乱无章&#xff0c;维护起来极为困难。而单文件…...

HarmonyOS NEXT开发实战——HUAWEI DevEco Studio 开发指南

概述 HUAWEI DevEco Studio&#xff08;以下简称 DevEco Studio&#xff09;是基于 IntelliJ IDEA Community 开源版本打造的一站式开发平台&#xff0c;专为 HarmonyOS 系统上的应用和元服务&#xff08;以下简称 应用/元服务&#xff09;提供高效的开发环境。 作为一款专业…...

IntelliJ IDEA 调试技巧指南

在日常开发中&#xff0c;调试是不可或缺的一部分。掌握调试工具的使用可以让我们更高效地定位和解决问题。本文将介绍一些在 IntelliJ IDEA 中常用的调试技巧&#xff0c;希望能帮助你在开发过程中更顺畅地解决问题。 1. 方法断点&#xff1a;快速定位实现类 方法断点可以帮…...

JavaScript变量声明与DOM操作指南

变量声明 1.变量声明有三个 var let 和 const 我们应该用那个呢&#xff1f; 首先var 先排除&#xff0c;老派写法&#xff0c;问题很多&#xff0c;可以淘汰掉… 2.let or const ? 建议&#xff1a; const 优先&#xff0c;尽量使用const&#xff0c;原因是&#xff1a;…...