【Web系列二十七】Vue实现dom元素拖拽并限制移动范围
目录
需求
拖拽功能封装
使用拖拽功能
vite-env.d.ts
main.ts
test.vue
需求
dom元素拖拽并限制在父组件范围内
拖拽功能封装
export const initVDrag = (vue) => {vue.directive('drag', (el) => {const oDiv = el // 当前元素oDiv.onmousedown = (e) => {let target = oDivwhile (window.getComputedStyle(target).position !== 'absolute' &&target !== document.body) {target = target.parentElement}let parent = target.parentNodedocument.onselectstart = () => {return false}if (!target.getAttribute('init_x')) {target.setAttribute('init_x', target.offsetLeft)target.setAttribute('init_y', target.offsetTop)}// e.clientX, e.clientY是鼠标点击的位置// target.offsetLeft, target.offsetTop是当前元素左上角的位置// 计算鼠标按下的位置距离当前元素左上角的距离const disX = e.clientX - target.offsetLeftconst disY = e.clientY - target.offsetTop// target.clientWidth, target.clientHeight是当前元素的尺寸// parent.clientWidth, parent.clientHeight是父元素的尺寸// parent.offsetLeft, parent.offsetTop是父元素左上角的位置// 可移动范围的位置const minX = parent.offsetLeftconst maxX = parent.offsetLeft + parent.clientWidth - target.clientWidthconst minY = parent.offsetTopconst maxY = parent.offsetTop + parent.clientHeight - target.clientHeightdocument.onmousemove = (e) => {// 通过事件委托,计算移动的距离,e是最新的鼠标位置,disX、disY是鼠标刚点击时的位置let l = e.clientX - disXlet t = e.clientY - disY// 约束移动范围在父元素区域内if (l < minX) {l = minX} else if (l > maxX) {l = maxX}if (t < minY) {t = minY} else if (t > maxY) {t = maxY}// 给当前元素样式中的left和top赋值target.style.left = l + 'px'target.style.top = t + 'px'}document.onmouseup = (e) => {document.onmousemove = nulldocument.onmouseup = nulldocument.onselectstart = null}// 不return false的话,可能导致鼠标黏连,鼠标粘在dom上拿不下来,相当于onmouseup失效return false}})
}
使用拖拽功能
以vite为例:
vite-env.d.ts
...
declare module '@utils/directive/vDrag.js'
...
main.ts
...
import { createApp } from 'vue'
import { initVDrag } from '@/utils/directive/vDrag.js'
...
let instance: any = null
instance = createApp(App)
initVDrag(instance)
...
test.vue
<template><div v-drag />
</template>
相关文章:
【Web系列二十七】Vue实现dom元素拖拽并限制移动范围
目录 需求 拖拽功能封装 使用拖拽功能 vite-env.d.ts main.ts test.vue 需求 dom元素拖拽并限制在父组件范围内 拖拽功能封装 export const initVDrag (vue) > {vue.directive(drag, (el) > {const oDiv el // 当前元素oDiv.onmousedown (e) > {let target…...
【IEEE独立出版】2024第四届神经网络、信息与通信工程国际学术会议(NNICE 2024)
2024第四届神经网络、信息与通信工程国际学术会议(NNICE 2024) 2024 4th International Conference on Neural Networks, Information and Communication Engineering 2024第四神经网络、信息与通信工程国际学术会议(NNICE 2024࿰…...
docker 推送tar包到远程仓库
tar 包 推送到远程仓库的步骤 - 导入镜像(docker load -i 镜像名称)示例:docker load -i yiyi-admin.tar- 打标签(docker tag 镜像id registry.cn-hangzhou.aliyuncs.com/空间名称/镜像名称:版本号)示例:docker tag $image_id reg…...
全志XR806基于FreeRTOS下部署竞技机器人先进模糊控制器
前言 很荣幸参与到由“极术社区和全志在线联合组织”举办的XR806开发板试用活动。本人热衷于各种的开发板的开发,同时更愿意将其实现到具体项目中。秉承以上原则,发现大家的重心都放在开发中的环境构建过程,缺少了不少实际应用场景的运用&am…...
python动态加载内容抓取问题的解决实例
问题背景 在网页抓取过程中,动态加载的内容通常无法通过传统的爬虫工具直接获取,这给爬虫程序的编写带来了一定的技术挑战。腾讯新闻(https://news.qq.com/)作为一个典型的动态网页,展现了这一挑战。 问题分析 动态…...
系列二十三、将一个第三方的类配置成bean的方式
一、将一个第三方的类配置成bean的方式 1.1、概述 日常的JavaEE开发中,难免不会遇到需要使用第三方的类的情况,比如:MyBatisPlus、RedisTemplate、DruidDataSource...,这些外部组件是不同的组织或个人提供的,我们为什…...
【长文干货】Python可视化教程
文章目录 数据介绍Matplotlib散点图折线图柱形图直方图 Seaborn散点图折线图柱形图直方图 Bokeh散点图折线条形图交互式 Plotly基本组合优化:定制化下拉菜单 总结 数据介绍 在这个小费数据集中,我们记录了20世纪90年代初期餐厅顾客在两个半月内给出的小…...
软件工程--需求工程--学习笔记(超详细)
软件需求工程是软件开发周期的第一个阶段,也是关系到软件开发成败最关键阶段,本章讲解需求的基础知识和需求工程的关键活动。这些知识对于结构化方法、面向对象方法、面向服务方法等都是适用的 本文参考教材:沈备军老师的《软件工程原理》 目…...
TemplateHit中提取query和hit比对上序列索引的映射字典
template_hits(Sequence[TemplateHit]数据格式)来自结构数据库搜索结果 python运行hhsearch二进制命令的包装器类 映射索引计算:TemplateHit 中含有 indices_query,需要换算成在原始query序列中的index,hit 中indices_hit 需要减去最小index…...
富必达API:一站式无代码开发集成电商平台、CRM和营销系统
一站式无代码开发的连接解决方案 电子商务、客户服务系统以及其它商业应用,是现代企业运营的重要部分。然而,将这些系统进行有效的整合往往需要复杂的API开发,这对很多企业来说是一个巨大的挑战。富必达API以其一站式的无代码开发解决方案&a…...
聊聊接口最大并发处理数
文章目录 前言并发和并行并发(Concurrency)并行(Parallelism)思考一下 前言 生活在 2023 年的互联网时代下,又是在国内互联网越发内卷的背景下,相信大家面试找工作、网上学习查资料时都了解过互联网系统设…...
6.如何利用LIO-SAM生成可用于机器人/无人机导航的二维/三维栅格地图--以octomap为例
目录 1 octomap的安装 2 二维导航节点的建立及栅格地图的构建 3 三维栅格地图的建立 1 octomap的安装 这里采用命令安装: sudo apt install ros-melodic-octomap-msgs ros-melodic-octomap-ros ros-melodic-octomap-rviz-plugins ros-melodic-octomap-server 这样…...
【多传感器融合】BEVFusion: 激光雷达和视觉融合框架 NeurIPS 2022
前言 BEVFusion其实有两篇, 【1】BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework. NeurIPS 2022 | 北大&阿里提出 【2】BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation 2022 | MIT提出 本文先分…...
kafka中的常见问题处理
文章目录 1. 如何防⽌消息丢失2. 如何防⽌重复消费3. 如何做到消息的顺序消费4. 如何解决消息积压问题4.1 消息积压问题的出现4.2 消息积压的解决⽅案 5. 实现延时队列的效果5.1 应用场景5.2 具体方案 1. 如何防⽌消息丢失 ⽣产者:1)使⽤同步发送 2&…...
HarmonyOS(八)——@Styles装饰器:定义组件重用样式
前言 在前面我们介绍过Builder装饰器和BuilderParam装饰器。今天我们继续介绍另外一个装饰器——Styles装饰器:定义组件重用样式。 如果每个组件的样式都需要单独设置,在开发过程中会出现大量代码在进行重复样式设置,虽然可以复制粘贴&…...
手写VUE后台管理系统5 - 整合状态管理组件pinia
整合状态管理组件 安装整合创建实例挂载使用 pinia 是一个拥有组合式 API 的 Vue 状态管理库。 pinia 官方文档:https://pinia.vuejs.org/zh/introduction.html 安装 yarn add pinia整合 所有与状态相关的文件都放置于项目 src/store 目录下,方便管理 在…...
解决webpack打包生成gz格式css/js文件没法在nginx使用的问题--全网唯一正确
本文绝对是全网解决这个问题唯一正确的文章,没有之一! 很多人都说开启nginx gzip压缩,这些人完全是胡说八道!你们到底懂不懂叫gzip压缩啊?! 不信你就试试,如果css/js只有gz文件,ng…...
传统算法: Pygame 实现快速排序
使用 Pygame 模块实现了快速排序的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过快速排序算法对数组进行排序,动画效果可视化每一步的排序过程。在排序的过程中,程序选择一个基准元素(pivot),将数组分成两部分,…...
HarmonyOS入门开发(三) 持久化存储Preferences
接入鸿蒙几天以来,发现各种和Android不一样的地方,今天来看一下Preferences存储 在Android中比如有ShardPreferences、Mmkv这些持久化存储方式,开发起来很方便,读取速度也很快,在鸿蒙里面也提供了对应的持久化存储方案…...
类和对象——(3)再识对象
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言📝 你说那里有你的梦想,…...
AI 大模型未来技术演进方向与应用发展趋势预判
引言:AI 技术快速迭代,未来已来AI 大模型技术正以超乎想象的速度迭代演进,从参数规模扩张到能力提升、从技术架构创新到应用场景拓展、从成本高企到普惠落地,每一次技术突破都在重塑产业格局、改变商业逻辑、影响生活方式。2026 年…...
CMSIS-DSP库更新指南与性能优化实践
1. CMSIS-DSP库更新需求解析在嵌入式开发领域,CMSIS-DSP库是ARM Cortex-M处理器上信号处理的核心支撑。作为专为微控制器优化的数字信号处理库,它包含了滤波器、矩阵运算、FFT等常用算法,其性能直接影响实时信号处理系统的表现。随着编译器版…...
UE5蓝图与C++权力边界:编辑器独占与全栈覆盖解析
1. 这不是“选哪个更好”,而是“谁在什么时候说了算”在UE5项目组里,我见过太多次这样的场景:美术同学改完一个材质参数,发现蓝图里调用的函数突然不生效了;程序刚写完一套C Actor逻辑,策划在编辑器里拖拽组…...
Vue3——defineOptions和defineModel
1.出现背景2.defineOptions2.1 作用当使用setup语法糖后,它把很多东西都隐藏起来了,让你不需要手动写 export default(Vue2) 或者 setup() 原生函数,但是其它组件选项对象需要 export default 存在才能添加。defineOptions用于在单文件组件&a…...
大模型生产环境中的行为漂移监控:从生存驱动到可测可控
1. 这不是科幻片,而是我们正在调试的模型行为现象“AI模型是否发展出了生存驱动”——这个标题在2025年春季突然密集出现在主流科技媒体、AI伦理专栏甚至哲学播客中,背后不是某篇新论文的发布,而是一连串真实发生、可复现、被多个独立实验室记…...
大数据搬运工 · Sqoop
🚛 在「关系型数据库」与「Hadoop 大仓库」之间 | 批量、高效、并行运输数据💡 生活比喻: 想象你的学校图书馆(关系型数据库)有一大堆超重的图书,而学校新建的“超级储藏大楼”(Hado…...
VMware虚拟机创建详细教程(新手小白友好)
本教程以 VMware Workstation Pro 16/17 版本为例,演示如何创建一台新的虚拟机。第一步:启动新建虚拟机向导打开VMware Workstation,点击主界面上的 “创建新的虚拟机”,或依次点击菜单栏“文件” → “新建虚拟机”。图1 VMware创…...
C++继承与组合设计
C继承与组合设计继承和组合是面向对象设计中两种重要的代码复用机制。继承表示"是一个"关系,而组合表示"有一个"关系。理解何时使用继承、何时使用组合是设计良好系统的关键。继承允许派生类继承基类的属性和方法,实现代码复用和多态…...
Unity构建性能分析工具:四层数据采集与包体优化实战
1. 这不是又一个“构建日志查看器”,而是一把能切开Unity构建黑箱的手术刀 我第一次在客户项目里看到Build Report Tool时,它正安静地躺在一个被遗忘的Plugins文件夹里,名字叫 BuildReportTool_v2.3.1.unitypackage 。当时团队正为一个中型…...
Java 面向对象 - 触发类的初始化,执行其中的 static 块(包含不会触发初始化的情况)
触发类的初始化,执行其中的 static 块 访问 static 字段 public class SomeClass {static {System.out.println("static block executed");}public static int num 100; }int num SomeClass.num;访问 static 方法,可以使用空方法(…...
