在vue3中给element-plus的el-dialog增加拖拽功能

拖拽演示
https://www.zhihu.com/zvideo/1380450791975731200

Step1 建立一个js文件

const dialogDrag = (app) => {
	app.directive('dialogdrag', {
    	// 渲染完毕
    	mounted(el) {
	      // 可视窗口的宽度
	      const clientWidth = document.documentElement.clientWidth
	      // 可视窗口的高度
	      const clientHeight = document.documentElement.clientHeight
	      // 记录坐标
	      let domset = {
	        x: clientWidth / 4, // 默认width 50%
	        y: clientHeight * 15 / 100  // 根据 15vh 计算
	      }
	
	      // 弹窗的容器
	      const domDrag = el.firstElementChild.firstElementChild
	      // 重新设置上、左距离
	      domDrag.style.marginTop = domset.y + 'px'
	      domDrag.style.marginLeft = domset.x + 'px'
	
	      // 记录拖拽开始的光标坐标,0 表示没有拖拽
	      let start = { x: 0, y: 0 }
	      // 移动中记录偏移量
	      let move = { x: 0, y: 0 }

	      // 鼠标按下,开始拖拽
	      document.onmousedown = (e) => {
	        // 判断对话框是否重新打开
	        if (domDrag.style.marginTop === '15vh') {
	          // 重新打开,设置 domset.y  top
	          domset.y = clientHeight * 15 / 100
	        }
	        start.x = e.clientX
	        start.y = e.clientY
	        domDrag.style.cursor = 'move' // 改变光标形状
	      }

	      // 鼠标移动,实时跟踪
	      document.onmousemove = (e) => {
	        if (start.x === 0) { // 不是拖拽状态
	          return
	        }
	        move.x = e.clientX - start.x
	        move.y = e.clientY - start.y
	
	        // 初始位置 + 拖拽距离
	        domDrag.style.marginLeft = ( domset.x + move.x )  + 'px'
	        domDrag.style.marginTop = ( domset.y + move.y )  + 'px'
	      }
	      // 鼠标抬起,结束拖拽
	      document.onmouseup = (e) => {
	        move.x = e.clientX - start.x
	        move.y = e.clientY - start.y
	
	        // 记录新坐标,作为下次拖拽的初始位置
	        domset.x += move.x
	        domset.y += move.y
	        domDrag.style.cursor = '' // 恢复光标形状
	        domDrag.style.marginLeft = domset.x + 'px'
	        domDrag.style.marginTop = domset.y + 'px'
	        // 结束拖拽
	        start.x = 0
	      }
    	}
  	})
  }
export default dialogDrag

Step2 在 main.js 里面挂载

import dialogDrag from '@/data/dialogDrag.js' // 地址就是dialogDrag.js在位置
const app = createApp(App)
app.use(dialogDrag)

Step3 在.vue文件中使用

<template>
  <!-- 注意:在el-dialog标签外包裹一个div标签后,使用v-dialogdrag即可调用该自定义插件,
  不要直接在el-dialog上调用,否则将无法生效 -->
  <div v-dialogdrag>
    <el-dialog 
    	:title="dialogStandbySample.title" 
    	v-model="dialogStandbySample.visible" 
    	center 
    	:close-on-click-modal="false">
		...
    </el-dialog>
  </div>
</template>

出处:https://www.cnblogs.com/jyk/p/14807244.html

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Vue使用element-ui的el-dialog对话框并实现拖动功能,可以使用vue-draggable-resizable插件来实现。 1. 安装插件 使用npm或者yarn进行安装。 ``` npm install vue-draggable-resizable --save ``` 或者 ``` yarn add vue-draggable-resizable ``` 2. 引入插件 在Vue组件引入vue-draggable-resizable插件,并注册为全局组件。 ```javascript import Vue from 'vue' import VueDraggableResizable from 'vue-draggable-resizable' import 'vue-draggable-resizable/dist/VueDraggableResizable.css' Vue.component('vue-draggable-resizable', VueDraggableResizable) ``` 3. 使用插件 在el-dialog组件嵌套vue-draggable-resizable组件,并设置对话框的宽度和高度。 ```html <template> <div> <el-button type="primary" @click="dialogVisible = true">打开对话框</el-button> <el-dialog title="提示" :visible.sync="dialogVisible" width="30%" :before-close="handleClose"> <vue-draggable-resizable :w="dialogWidth" :h="dialogHeight"> <p>这是一个可以拖动的对话框</p> </vue-draggable-resizable> </el-dialog> </div> </template> <script> export default { data() { return { dialogVisible: false, dialogWidth: 400, dialogHeight: 300 } }, methods: { handleClose(done) { this.dialogVisible = false done() } } } </script> ``` 在这个示例,我们将vue-draggable-resizable组件嵌套在el-dialog组件,并设置了对话框的宽度和高度。我们还定义了一个handleClose方法来处理对话框关闭的事件。 现在你可以在Vue使用element-ui的el-dialog对话框并实现拖动功能了。注意:vue-draggable-resizable插件的样式可能需要根据自己的需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值