vue3使用自定义指令简单实现一个可拖拽弹窗组件

embedded/2024/12/20 2:31:22/

vue3使用自定义指令简单实现一个可拖拽弹窗组件

在这里插入图片描述
在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>可拖拽弹窗</title><!-- 引入 Vue CDN --><script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script><style>.drag-dialog {position: fixed;background: white;border: 1px solid #ccc;border-radius: 4px;padding: 20px;box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);}.dialog-header {cursor: move;padding: 10px;background: #f5f5f5;margin: -20px -20px 10px -20px;border-radius: 4px 4px 0 0;user-select: none;}.dialog-body {padding: 10px 0;}.dialog-footer {text-align: right;margin-top: 20px;}button {padding: 6px 12px;margin-left: 10px;cursor: pointer;}</style>
</head><body><div id="app"><button @click="showDialog">打开弹窗</button><div class="drag-dialog" v-show="visible" :style="dialogStyle" v-drag><div class="dialog-header">可拖拽弹窗标题</div><div class="dialog-body">这是弹窗内容</div><div class="dialog-footer"><button @click="visible = false">关闭</button><button @click="handleConfirm">确定</button></div></div></div><script>javascript">const app = Vue.createApp({data() {return {visible: false,dialogStyle: {left: '50%',top: '50%',transform: 'translate(-50%, -50%)'}}},methods: {showDialog() {this.visible = true;},handleConfirm() {alert('点击了确定按钮');this.visible = false;}}});// 注册自定义指令app.directive('drag', {mounted(el) {el.style.position = 'fixed';const header = el.querySelector('.dialog-header');header.onmousedown = function (e) {// 鼠标按下时的位置const startX = e.clientX;const startY = e.clientY;// 当前元素的位置const left = el.offsetLeft;const top = el.offsetTop;document.onmousemove = function (e) {// 计算移动距离const moveX = e.clientX - startX;const moveY = e.clientY - startY;// 更新位置el.style.left = left + moveX + 'px';el.style.top = top + moveY + 'px';};document.onmouseup = function () {document.onmousemove = null;document.onmouseup = null;};};}});app.mount('#app');</script>
</body></html>

http://www.ppmy.cn/embedded/147163.html

相关文章

概率论得学习和整理27:关于离散的数组 随机变量数组的均值,方差的求法3种公式,思考和细节。

目录 1 例子1&#xff1a;最典型的&#xff0c;最简单的数组的均值&#xff0c;方差的求法 2 例子1的问题&#xff1a;例子1只是1个特例&#xff0c;而不是普遍情况。 2.1 例子1各种默认假设&#xff0c;导致了求均值和方差的特殊性&#xff0c;特别简单。 2.2 我觉得 加权…

13.继承和多态的实例 C#

这是一个动物园的动物发出不同的声音&#xff0c;使用了继承和多态 using System; using System.Collections.Generic;namespace InheritanceAndPolymorphismExample {//一个动物类&#xff0c;包含属性&#xff1a;名称。包含方法&#xff1a;发出叫声public class Animal{pub…

Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能

背景&#xff1a;现在有一个新需求&#xff0c;需要借助树结构来实现词库的分类管理&#xff0c;树的节点是不同的分类&#xff0c;不同的分类可以有自己的词库&#xff0c;所以父子节点是互不影响的&#xff1b;同样为了选择的方便性&#xff0c;提出了新需求&#xff0c;选择…

Oracle JDK需登录下载解决

JDK下载地址 地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ 登录账号获取 访问&#xff1a;https://bugmenot.com/view/oracle.com 直接复制账号密码登录下载

音频开发中常见的知识体系

在 Linux 系统中&#xff0c;/dev/snd 目录包含与声音设备相关的文件。每个文件代表系统中的一部分音频硬件或音频控制接口。以下是你列出的文件及其含义&#xff1a; 一.基本术语 样本长度(sample)&#xff1a;样本是记录音频数据最基本的单位&#xff0c;计算机对每个通道采…

DolphinScheduler部署

DolphinScheduler部署 3种方式通过 Docker 完成 DolphinScheduler 的部署 快速体验&#xff0c;推荐 standalone-server 镜像较完整服务&#xff0c;推荐 docker-compose 启动服务已有自己数据库或 zk 服务&#xff0c;想沿用这些基础服务&#xff0c;参考沿用已有的 Postgre…

基于注意力的几何感知的深度学习对接模型 GAABind - 评测

GAABind 作者是苏州大学的生物基础与医学院, 期刊是 Briefings in Bioinformatics, 2024, 25(1), 1–14。GAABind 是一个基于注意力的几何感知蛋白-小分子结合模式与亲和力预测模型,可以捕捉小分子和蛋白的几何、拓扑结构特征以及相互作用。使用 PDBBind2020 和 CASF2016 作…

synchronized 锁升级实现原理

synchronized 锁升级实现原理 对象的内存结构 在HotSpot虚拟机中&#xff0c;对象在内存中存储的布局可分为3块区域&#xff1a;对象头&#xff08;Header&#xff09;、实例数据&#xff08;Instance Data&#xff09;和对齐填充 我们需要重点分析MarkWord对象头 MarkWord …