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

vue3 拖拽插件(drag)

前端vue项目中,经常会有弹框拖拽的需求,下面介绍常用方法:
1.如果你使用的是elementPlus插件的el-dialog组件,只需要增加draggable属性即可,代码如下:

<el-dialogv-model="showDiloag"width="500"draggable></e--dialog>

2.如果不使用ele 的组件,自己写弹框,那么可以自定义指令,代码如下(vue3):

drag.js文件:

const drag = {mounted(el, binding) {el.style.position = "absolute";const data = binding.value || { x: 0, y: 0, zIndex: 99999 };let { x, y, zIndex = 99999 } = data;el.style.left = x + "px";el.style.top = y + "px";el.style.zIndex = zIndex;let isDragging = false;let baseMousePosition = { x: 0, y: 0 };let dom = data.targetRef || document.getElementById(data.targetId) || el;dom.style.cursor = "move";const onDragStart = (e) => {if (e.button === 0) {isDragging = true;baseMousePosition.x = e.pageX;baseMousePosition.y = e.pageY;window.addEventListener("mousemove", onDraging);}};const onDragEnd = (e) => {isDragging = false;x = parseInt(el.style.left);y = parseInt(el.style.top);window.removeEventListener("mousemove", onDraging);};const onDraging = (e) => {if (isDragging) {el.style.left = e.pageX - baseMousePosition.x + x + "px";el.style.top = e.pageY - baseMousePosition.y + y + "px";}};dom.addEventListener("mousedown", onDragStart);window.addEventListener("mouseup", onDragEnd);},
};const directives = {install: function (app) {app.directive('drag', drag)}
}
export default directives

vue文件使用:

<script setup>
import { ref } from "vue";const dragRef = ref()
const dragOptions= ref({x: 100,y: 200,targetRef: dragRef,
})
</script><template><div v-drag="dragOptions" class="dialog"><div class="dialog_header" ref="dragRef">弹框标题</div><div class="dialog_content">弹框内容</div></div><template>

这里的dragOptions就是配置项,x和y是弹框的初始位置的left和top值,targetRef的值是你希望鼠标在哪个dom元素可以拖拽,如果不传,就默认在整个弹框范围,都可以拖拽。

相关文章:

  • UG NX二次开发(C#)-加工-创建加工坐标系,将刀位点和刀轴矢量变换到加工坐标系
  • 【python】函数介绍
  • 电子相册|智能化电子相册|基于java的电子相册管理系统设计与实现(源码+数据库+文档)
  • Python的风格应该是怎样的?除语法外,有哪些规范?
  • 深度学习之开发环境(CUDA、Conda、Pytorch)准备(4)
  • Kafka:架构与核心机制
  • Python酷库之旅-第三方库Pandas(129)
  • UML中类和类之间关系和各种图
  • C语言 | Leetcode C语言题解之第445题两数相加II
  • 【C++】Eclipse技巧汇总
  • python 实现data transformations数据转换算法
  • 使用Prometheus进行系统监控,包括Mysql、Redis,并使用Grafana图形化表示
  • 《C++并发编程实战》笔记(五)
  • 学习C语言(21)
  • poetry安装
  • 《深入 React 技术栈》
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2017 年终总结 —— 在路上
  • 4. 路由到控制器 - Laravel从零开始教程
  • java中的hashCode
  • PHP变量
  • Python爬虫--- 1.3 BS4库的解析器
  • React中的“虫洞”——Context
  • Spark RDD学习: aggregate函数
  • SpriteKit 技巧之添加背景图片
  • Vue2 SSR 的优化之旅
  • 蓝海存储开关机注意事项总结
  • 前端学习笔记之观察者模式
  • 如何用vue打造一个移动端音乐播放器
  • 如何在 Tornado 中实现 Middleware
  • 思考 CSS 架构
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 自动记录MySQL慢查询快照脚本
  • 选择阿里云数据库HBase版十大理由
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #AngularJS#$sce.trustAsResourceUrl
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • %check_box% in rails :coditions={:has_many , :through}
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (C++)八皇后问题
  • (Matlab)使用竞争神经网络实现数据聚类
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (zhuan) 一些RL的文献(及笔记)
  • (补)B+树一些思想
  • (回溯) LeetCode 78. 子集
  • (三) diretfbrc详解
  • (三)终结任务
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (一)Neo4j下载安装以及初次使用
  • (转) Android中ViewStub组件使用
  • (转)Android学习笔记 --- android任务栈和启动模式
  • ../depcomp: line 571: exec: g++: not found
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .class文件转换.java_从一个class文件深入理解Java字节码结构