Vue自定义组件——封装一个简单的可拖拽的弹出框 可拖拽的Dialog

本文主要是介绍Vue自定义组件——封装一个简单的可拖拽的弹出框 可拖拽的Dialog,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先明确需要传入组件的属性:

* @Props: dialogVisible  Number      非0打开allowDrag      Boolean     是否可以拖拽noFoot         Boolean     是否显示按钮行@submit        Function    点击提交按钮的回调-->

设计组件的组成部分,这里简单的加了一个遮罩,只有遮罩层和弹窗主体。

用到了h5的drag属性 HTML5 拖放 | 菜鸟教程

组件内部提供了title和connect两个插槽供使用。

插槽?插槽 — Vue.js

弹窗使用绝对定位供捕获鼠标位置后计算拖拽终点。

<template><div class="dialog"><!-- 遮罩层 --><div class="logOn" @click="showModal = 0" v-show="showModal" /><!-- 弹窗本体 --><divclass="modalOn"v-show="showModal":draggable="allowDrag"@dragstart="dragstart"@dragend="dragend"ref="modal":style="{ top: top + 'px', left: left + 'px' }"><div class="head"><div><slot name="title" /></div><div @click="showModal = 0" class="x">×</div></div><div class="main"><slot name="connect" /></div><!-- 底部按钮行 --><div class="but_line" v-show="!noFoot"><el-button class="but" @click="showModal = 0">取消</el-button><el-button class="but" type="primary" @click="submit"> 提交 </el-button></div></div></div>
</template>

功能实现:dragstart可以获取到拖拽时鼠标相对于弹窗的位置坐标,dragend获得的拖拽后鼠标位置减去鼠标相对于弹窗的位置就是弹窗拖拽的实际位置。

这里用e.preventDefault()阻止了拖拽弹窗时的禁止放置图标

用e.dataTransfer.dropEffect = "move" 重新定义了拖拽时的可移动图标

什么是dataTransfer.dropEffect?  

DataTransfer.dropEffect - Web API 接口参考 | MDN

<script type="text/ecmascript-6">
export default {name: "dragModal",components: {},data() {return {showModal: 0, //是否打开弹窗 非0打开left: "",top: "",};},props: {//父组件传入的弹窗开关状态 非0打开dialogVisible: {type: Number,default: 0,},//是否能拖拽allowDrag: {type: Boolean,default: false,},//是否显示按钮行noFoot: {type: Boolean,default: false,},},mounted() {},computed: {},watch: {//监听父组件弹窗开关状态同步至组件dialogVisible() {this.showModal = this.dialogVisible;},},methods: {/*** @description: 拖拽前的回调* @param {Object} DragEvent* @return void*/dragstart(e) {document.ondragover = function (e) {e.preventDefault();e.dataTransfer.dropEffect = "move";};//获取鼠标相对于拖拽元素的位置this.diffX = e.layerX;this.diffY = e.layerY;},/*** @description: 拖拽后的回调* @param {Object} DragEvent* @return void*/dragend(e) {document.ondragover = function (e) {e.dataTransfer.dropEffect = "none";};//获取元素落点位置 鼠标位置-相对于拖拽元素的位置this.top = e.pageY - this.diffY;this.left = e.pageX - this.diffX;},submit() {this.$emit("submit");},},
};
</script>

一些简单的居中样式和类似el的遮罩样式

.dialog {display: flex;align-items: center;justify-content: center;
}.logOn {background: rgba(0, 0, 0, 0.3);height: 100%;width: 100%;position: absolute;top: 0;left: 0;display: flex;justify-content: center;align-items: center;
}.modalOn {min-width: 600px;background: #fff;position: absolute;border-radius: 3px;padding: 12px;
}.head {display: flex;justify-content: space-between;border-bottom: 1px solid #e6e6e6;height: 30px;
}
.x {width: 30px;display: flex;justify-content: center;cursor: pointer;
}
.main {padding: 12px;
}.but {border-radius: 5px;height: 30px;line-height: 6px;
}.but_line {display: flex;justify-content: flex-end;
}

这篇关于Vue自定义组件——封装一个简单的可拖拽的弹出框 可拖拽的Dialog的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699425

相关文章

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四