uniapp实现全局拖拽按钮
要先引入 “vue3-draggable-resizable”: “^1.6.5”
1.创建DragComponent组件
<template><!-- 抽屉组件 --><div class="drag-container" id="dragBox" :style="{ zIndex: zIndex }"><Vue3DraggableResizable :initW="64" :initH="64" v-model:x="x" v-model:y="y":parent="false" :resizable="false" :draggable="true" class="drag-item" @drag-start="handleDragStart"@drag-end="handleDragEnd"><div class="home-icon-box" ref="draggableElement"><img :src="market_set.image" class="img" alt="" /></div></Vue3DraggableResizable></div>
</template><script setup>import {ref,onMounted,onUnmounted} from 'vue';import Vue3DraggableResizable from 'vue3-draggable-resizable';import 'vue3-draggable-resizable/dist/Vue3DraggableResizable.css';import {getMarket} from "@/api/global.js"const popupRef = ref(null)const x = ref(20);const y = ref();const initialY = ref(0); // 基准Y坐标,用于计算滚动偏移const isDragging = ref(false); //是否正在拖拽const dragStartPosition = ref({x: 0,y: 0}); // 拖拽起始位置const isLock = ref(true);const isShow = ref(false)// 初始化基准Y坐标const initBaseY = () => {initialY.value = y.value - window.scrollY;};function isElementInViewport(el) {const rect = el.getBoundingClientRect();// 获取视口的高度和宽度const windowHeight = (window.innerHeight || document.documentElement.clientHeight) - 50;const windowWidth = (window.innerWidth || document.documentElement.clientWidth);// 判断元素是否在视口内const vertInView = (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);const horInView = (rect.left <= windowWidth) && ((rect.left + rect.width) >= 0);return (vertInView && horInView);}// 拖动结束后更新基准Y坐标const handleDragEnd = (e) => {// initialY.value = y.value - window.scrollY;// 判断拖拽还是点击事件if (isDragging.value) {const dragDistance = Math.sqrt(Math.pow(e.x - dragStartPosition.value.x, 2) +Math.pow(e.y - dragStartPosition.value.y, 2));if (dragDistance < 5) {// 如果拖拽距离小于 5px,则认为是点击事件console.log('点击事件', e);isLock.value = true} else {console.log('拖拽结束', e);isLock.value = false}}isDragging.value = false;// 判断悬浮球是靠近左边或右边const {x: newX,y: newY} = e; // 假设位置属性是 x 和 const page = document.querySelector('#app');const iconBox = document.querySelector('.home-icon-box');// alert(page.offsetWidth)if (newX + (iconBox.offsetWidth / 2) < page.offsetWidth / 2) {x.value = 0; // 靠左} else {x.value = page.offsetWidth - 64; // 靠右}const myElement = document.querySelector('.home-icon-box');if (isElementInViewport(myElement)) {console.log('元素在视口内');} else {console.log('元素不在视口内');y.value = window.innerHeight / 2}};const handleDragStart = (e) => {// 可根据需要添加拖动开始时的逻辑isDragging.value = true;dragStartPosition.value = {x: e.x,y: e.y};};// 计算按钮初始y位置const containerWidth = ref(0); // 容器宽度const width = ref(100); // 组件宽度// 计算初始 x 坐标(从右对齐)const calculateInitialX = () => {x.value = containerWidth.value - width.value;y.value = (window.innerHeight || document.documentElement.clientHeight) - 200};// 生命周期onMounted(() => {initBaseY();const container = document.querySelector('#app');if (container) {containerWidth.value = container.offsetWidth; //活动区域的宽度范围calculateInitialX();}})
</script><style lang="scss" scoped>.dragBox {width: 960rpx;height: 100vh;position: fixed;top: 0;left: 50%;z-index: 99;transform: translateX(-50%);pointer-events: none;color: red;}.home-icon-box {position: relative;// left: 23px;// top: 23px;width: 128rpx;height: 128rpx;display: flex;justify-content: center;align-items: center;z-index: 999;color: #fff;cursor: grab;/* 鼠标样式为抓取 */user-select: none;/* 防止拖拽时选中文本 */animation: pulse 1.5s infinite ease-in-out;transition: opacity 0.3s ease, left 0.3s ease, right 0.3s ease, top 0.3s ease;/* 按钮动画 */@keyframes pulse {0% {transform: scale(1);opacity: 1;}50% {transform: scale(1.2);opacity: 0.7;}100% {transform: scale(1);opacity: 1;}}/* 进度条容器 */.progress-container-icon {position: absolute;width: 80%;height: 10px;background: rgba(255, 255, 255, 0.5);border-radius: 5px;overflow: hidden;text-align: center;cursor: pointer;bottom: -14px;}/* 进度条 */.progress-bar-icon {width: 0%;height: 100%;background: #ff5722;border-radius: 5px;}/* 进度文本 */.progress-text-icon {position: absolute;width: 100%;text-align: center;top: 50%;transform: translateY(-50%);color: black;font-size: 10px;font-weight: bold;}.img {width: 100%;height: 100%;}}.drag-item {width: 64px;height: 64px !important;touch-action: none;border: none !important;}.drag-container {display: inline-block;position: fixed;top: 0;z-index: 99;}.dragBoxPopup {position: fixed;top: 0;left: calc(50% - min(50%, 240px));width: min(100%, 480px);z-index: 999;height: 100%;background-color: rgba(0, 0, 0, 0.7);}}
</style>
2.createDrag.js 将组件dom创建到app根组件下
import { createVNode, render } from 'vue';
import DragComponent from '@/components/DragComponent/DragComponent.vue';// 修改后的函数,负责渲染 DragComponent 和 DragComponent2
export default function createDrags() {// 创建一个组件的 DOM 容器const container1 = document.createElement('div');document.getElementById('app').appendChild(container1);// 创建一个组件的虚拟节点const vnode1 = createVNode(DragComponent, {// 如果需要,可以在这里传递其他 props 给 DragComponent});// 渲染一个组件render(vnode1, container1);const instance1 = vnode1.component?.proxy;// 返回两个组件的实例(如果需要后续操作)return {dragComponentInstance: instance1};
}
在App.vue中执行js
import createDrag from "@/utils/createDrag.js"onLaunch: function(options) {createDrag()}
相关文章:
uniapp实现全局拖拽按钮
要先引入 “vue3-draggable-resizable”: “^1.6.5” 1.创建DragComponent组件 <template><!-- 抽屉组件 --><div class"drag-container" id"dragBox" :style"{ zIndex: zIndex }"><Vue3DraggableResizable :initW"…...
SOFABoot-10-聊一聊 sofatboot 的十个问题
前言 大家好,我是老马。 sofastack 其实出来很久了,第一次应该是在 2022 年左右开始关注,但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概览 SOFABoot-01-蚂蚁金服开源的 s…...
计算机网络——总结
01. 网络的发展及体系结构 网络演进历程 从1969年ARPANET的4个节点发展到如今覆盖全球的互联网,网络技术经历了电路交换到分组交换、有线连接到无线覆盖的革命性变革。5G时代的到来使得网络传输速度突破10Gbps,物联网设备数量突破百亿级别。 网络体系…...
Umi-OCR- OCR 文字识别工具,支持截图、批量图片排版解析
Umi-OCR 是免费开源的离线 OCR 文字识别软件。无需联网,解压即用,支持截图、批量图片、PDF 扫描件的文字识别,能识别数学公式、二维码,可生成双层可搜索 PDF。内置多语言识别库,界面支持多语言切换,提供命令…...
高速网络包处理,基础网络协议上内核态直接处理数据包,XDP技术的原理
文章目录 预备知识TCP/IP 网络模型(4层、7层)iptables/netfilterlinux网络为什么慢 DPDKXDPBFPeBPFXDPXDP 程序典型执行流通过网络协议栈的入包XDP 组成 使用 GO 编写 XDP 程序明确流程选择eBPF库编写eBPF代码编写Go代码动态更新黑名单 预备知识 TCP/IP…...
C++:背包问题习题
1. 货币系统 1371. 货币系统 - AcWing题库 给定 V 种货币(单位:元),每种货币使用的次数不限。 不同种类的货币,面值可能是相同的。 现在,要你用这 V 种货币凑出 N 元钱,请问共有多少种不同的…...
数据可信安全流通实战,隐语开源社区Meetup武汉站开放报名
隐语开源社区 Meetup 系列再出发!2025 年将以武汉为始发站,聚焦"技术赋能场景驱动",希望将先进技术深度融入数据要素流转的各个环节,推动其在实际应用场景中落地生根,助力释放数据要素的最大潜能!…...
java使用Apache POI 操作word文档
项目背景: 当我们对一些word文档(该文档包含很多的标题比如 1.1 ,1.2 , 1.2.1.1, 1.2.2.3)当我们删除其中一项或者几项时,需要手动的对后续的进行补充。该功能主要是对标题进行自动的补充。 具…...
【 C/C++ 包管理工具】vcpkg安装+使用
【 C/C 包管理工具】vcpkg安装使用 Vcpkg 是由 Microsoft 和 C 社区维护的免费开源 C/C 包管理器,可在 Windows、macOS 和 Linux 上运行。 可以很方便的安装管理 C/C 库。 1. 安装 不要安装到Program Files这种有空格的路径下,否则后面安装库可能出现…...
免费开源的NAS解决方案:TrueNAS
TrueNAS是业内知名的FreeNAS系统的升级版,是一款开源的网络存储系统,具有高性能、稳定性和易用性等优点。 TrueNAS目前有三个版本,分别是TrueNAS CORE、TrueNAS ENTERPRISE、TrueNAS SCALE。其中,TrueNAS CORE基于FreeBSD开发&…...
LeetCode热题100精讲——Top1:两数之和【哈希】
你好,我是安然无虞。 文章目录 题目背景两数之和C解法Python解法 题目背景 如果大家对于 哈希 类型的概念并不熟悉, 可以先看我之前为此专门写的算法详解: 蓝桥杯算法竞赛系列第九章巧解哈希题,用这3种数据类型足矣 两数之和 题目链接:两数…...
github上传操作简单说明
前期准备 0.下载git(如果已经有了就不用了) 1.在GitHub上新建一个存储库 2.先在本地创建一个目录作为本地库目录,在目录里打开git bash进行上传 上传过程 echo "# Garbled_repair" >> README.md 作用:创建一个…...
GitLens with `Commit Graph`
文章目录 GitLens with Commit Graph GitLens with Commit Graph 想要更直观地查看 Git 提交历史?我打包了一个支持 Commit Graph 的 GitLens 版本,让你轻松在 VSCode 中查看分支、合并、变更记录等内容,一目了然! 📌…...
Rocky9.5基于sealos快速部署k8s集群
首先需要下载 Sealos 命令行工具,sealos 是一个简单的 Golang 二进制文件,可以安装在大多数 Linux 操作系统中。 以下是一些基本的安装要求: 每个集群节点应该有不同的主机名。主机名不要带下划线。 所有节点的时间需要同步。 需要在 K8s …...
阿里云服务器环境部署 四 MySQL主从配置
安装MySQL 导入mysql镜像 docker load -i /opt/dockerinstall/mysql/mysql-8.1.0.tar docker run --privilegedtrue --name mysql8 --restartunless-stopped -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -v /usr/local/mysql/logs:/var/log/mysql -v /usr/local/mysql/d…...
GPT-5 将免费向所有用户开放?
GPT-5 将免费向所有用户开放? 硅谷知名分析师 Ben Thompson 最近与 OpenAI CEO Sam Altman 进行了一场深度对谈,其中Sam Altman透漏GPT-5将免费向大家发放。 OpenAI 这波操作可不是一时冲动,而是被逼出来的。DeepSeek 这个新秀横空出世&am…...
web客户端存储,IndexDB相关讲解
IndexDB详细讲解 IndexedDB 是浏览器提供的一种底层 API,用于在客户端存储大量结构化数据。相比 Web Storage(localStorage/sessionStorage),它支持更复杂的数据结构、事务处理、索引查询等高级功能。以下是一个系统化的讲解: 一、核心概念 1、数据库(Database) 每…...
excel文件有两列,循环读取文件两列赋值到字典列表。字典的有两个key,分别为question和answer。将最终结果输出到json文件
import pandas as pd import json# 1. 读取 Excel 文件(假设列名为 question 和 answer) try:df pd.read_excel("input.xlsx", usecols["question", "answer"]) # 明确指定列 except Exception as e:print(f"读取文…...
项目日记 -云备份 -服务器配置信息模块
博客主页:【夜泉_ly】 本文专栏:【项目日记-云备份】 欢迎点赞👍收藏⭐关注❤️ 代码已上传 gitee 目录 前言配置信息文件文件配置类getInstance 获得实例readConfigFile 读取配置信息文件 测试 #mermaid-svg-ewlCpjdOf0q0VTLI {font-family:…...
gralloc usage flags
下面这些示例主要说明了 gralloc usage flags 在图像处理和多媒体应用中如何影响性能和正确性。让我们逐个详细分析每个问题的 根因 和 修复方案,并深入解析 gralloc 标志对 缓存管理 和 数据流 的影响。 ✅ Example 1: 长曝光快照耗时异常 📌 问题描述…...
Mysql配套测试之查询篇
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 条件查询简单测试: 1.查询英语成绩不及格的同学(<60) 2…...
mysql——第二课
学生表 CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,sex varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,age int(11) DEFAULT NULL,c_id int(10) DEFAULT NULL,PRIMARY KEY (id),KEY c_id (c_id),CONSTR…...
Python网络编程入门
一.Socket 简称套接字,是进程之间通信的一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间要想进行网络通信需要Socket,Socket好比数据的搬运工~ 2个进程之间通过Socket进行相互通讯&a…...
arm linux下的读写信号量rw_semphore的实现
本文基于arm linux 5.10来介绍内核中使用的读写信号量rw remphore的实现代码。 内核中信号量结构体struct rw_semaphore的定义在include/linux/rwsem.h 32位architectures下,结构体struct rw_semaphore中的count的使用如下: 先来看信号量的定义和初始化…...
完整的类在JVM中的生命周期详解
首先给出一个示例代码: 示例的目标是展示一个多功能的类结构,包含继承、接口实现、静态成员、本地方法、线程安全等特性,同时模拟一个简单的“计算器”场景,计算并管理数字。(尽量将所有的 Java 组件和关键字都给出&am…...
Flutter中常用命令
1.检测flutter运行环境 flutter doctor 2.升级flutter flutter upgrade 3.查看flutter 版本 flutter --version 4.查看连接的设备 flutter devices 5.运行flutter项目 flutter run 或者在vscode中按FnF5 6.打包 flutter build apk //默认打release包 7.开…...
C#里使用libxl的数字格式
由于EXCEL里可以表示不同的数字格式, 比如表示货币数字时,与表示普通序号的数字就不一样。 还有科学计算表示的数字使用小数点位数与普通货币也不一样。 如下所示: 要使用这些格式, 下面创建一个例子来演示保存这些数字格式: private void button11_Click(object send…...
c#难点整理2
1.对象池的使用 就是先定义一系列的对象,用一个,调一个。 public class ObjectPool<T> where T : new(){private Queue<T> pool; // 用于存储对象的队列private int maxSize; // 对象池的最大容量// 构造函数public ObjectPool(int maxSi…...
android adjust 卸载与重装监测
想要洞察应用内用户的留存率,可以通过Adjust 的卸载与重装进行监测 名词解释: 卸载:集成完成后,卸载应用,安装状态为:卸载 重装:如果应用已经卸载,但一段时间后又进行安装,则会被视为重装。 📢📢📢:adjust 文件中说到24 小时后,可以再 adjust 控制台看安装…...
自然语言处理(5)—— 中文分词
中文分词的基本原理及实现 1. 什么是词2. 基本原理3. 发展趋势:多数场景无需显式分词 信息处理的目标是使用计算机能够理解和产生自然语言。而自然语言理解和产生的前提是对语言能够做出全面的解析。 汉语词汇是语言中能够独立运用的最小的语言单位,是语…...
