首页 > 其他分享 >001. vue+element实现弹窗拖拽效果

001. vue+element实现弹窗拖拽效果

时间:2023-03-10 11:46:16浏览次数:31  
标签:el vue const px element 001 document dragDom 弹窗

一、创建一个js文件

因为本身dialog窗口不具备移动拖拽能力,所以需要以下方法去实现,在src/components同级文件下创建utils文件夹,然后创建名为 directives.js 的文件。

directives.js的代码如下:

 1 import Vue from 'vue'
 2   
 3 // v-dialogDrag: 弹窗拖拽
 4 Vue.directive('dialogDrag', {
 5   bind(el, binding, vnode, oldVnode) {
 6     const dialogHeaderEl = el.querySelector('.el-dialog__header')
 7     const dragDom = el.querySelector('.el-dialog')
 8     dialogHeaderEl.style.cursor = 'move'
 9   
10     // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
11     const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null)
12   
13     dialogHeaderEl.onmousedown = (e) => {
14       // 鼠标按下,计算当前元素距离可视区的距离
15       const disX = e.clientX - dialogHeaderEl.offsetLeft
16       const disY = e.clientY - dialogHeaderEl.offsetTop
17   
18       // 获取到的值带px 正则匹配替换
19       let styL, styT
20   
21       // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
22       if (sty.left.includes('%')) {
23         styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100)
24         styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100)
25       } else {
26         styL = +sty.left.replace(/\px/g, '')
27         styT = +sty.top.replace(/\px/g, '')
28       }
29   
30       document.onmousemove = function(e) {
31         // 通过事件委托,计算移动的距离
32         const l = e.clientX - disX
33         const t = e.clientY - disY
34   
35         // 移动当前元素
36         dragDom.style.left = `${l + styL}px`
37         dragDom.style.top = `${t + styT}px`
38   
39         // 将此时的位置传出去
40         // binding.value({x:e.pageX,y:e.pageY})
41       }
42   
43       document.onmouseup = function(e) {
44         document.onmousemove = null
45         document.onmouseup = null
46       }
47     }
48   }
49 })
50   
51 // v-dialogDragWidth: 弹窗宽度拖大 拖小
52 Vue.directive('dialogDragWidth', {
53   bind(el, binding, vnode, oldVnode) {
54     const dragDom = binding.value.$el.querySelector('.el-dialog')
55   
56     el.onmousedown = (e) => {
57       // 鼠标按下,计算当前元素距离可视区的距离
58       const disX = e.clientX - el.offsetLeft
59   
60       document.onmousemove = function(e) {
61         e.preventDefault() // 移动时禁用默认事件
62   
63         // 通过事件委托,计算移动的距离
64         const l = e.clientX - disX
65         dragDom.style.width = `${l}px`
66       }
67   
68       document.onmouseup = function(e) {
69         document.onmousemove = null
70         document.onmouseup = null
71       }
72     }
73   }
74 })

 

二、在main.js里面引入此模块

代码如下:

 1 import './utils/directives.js' //为弹窗移动 

 

三、在需要进行弹窗的里面设置以下代码,标签引入 v-dialogDrag

 1 <el-dialog
 3             width="80%"
 4             title="标题"
 5             :visible.sync="dialogVisible"
 6             :before-close="handleClose" 
 7             :modal-append-to-body='false'
 8             append-to-body
 9             class="upload-dialog"
10             v-dialogDrag
11             :close-on-click-modal="false"
12         >
13 </el-dialog>

注意::close-on-click-modal="false"一定要添加这句话,要不然没有效果。

 

标签:el,vue,const,px,element,001,document,dragDom,弹窗
From: https://www.cnblogs.com/lengxincheng/p/17202824.html

相关文章

  • 重读vue电商网站49之第三方库使用CDN
    通过externals加载外部CDN资源默认情况下,通过import语法导入的第三方依赖包,最终会被打包合并到同一个文件中,从而导致打包成功后,单文件体积过大的问题。 例如上述chu......
  • Vue 使用插件 Plugin,管理静态常量
    Vue常量使用第一种方法单独定义一个constant.js,内容如下://大屏卡片标题exportconstBIG_SCREEN_CARD_TITLE={memberCount:'注册人员数',todayCou......
  • vue2和vue3
    双向绑定更新vue2的双向数据绑定是利⽤ES5的⼀个API,Object.defineProperty()对数据进⾏劫持结合发布订阅模式的⽅式来实现的。vue3中使⽤了ES6的ProxyAPI对......
  • vue3中 defineComponent
    在这个例子中,父组件引用了MyComponent组件,并通过props传递了一个字符串作为message属性的值。在MyComponent组件中,我们可以通过props参数来获取这个值,并在se......
  • vue (或者 javascript ) 打印彩色日志
    typeAny=any/***创建console所需的style样式*@parambgColor*@paramfontColor*/constcreateStyle=function(bgColor:string,fontColor='#fff......
  • 【django-vue】celery延迟任务、定时任务 django中使用celery 秒杀功能 双写一致性
    目录上节回顾字符编码django-redis今日内容1celery执行异步任务,延迟任务,定时任务延时任务定时任务2django中使用celery2.1秒杀功能2.1.1视图2.1.2任务order_task.p......
  • vue获取公网ip
    <template><div><div>YourPublicIP:{{publicIP}}</div></div></template><script>exportdefault{data(){return{publicIP:''......
  • vue3+vite+element-plus按需加载动态图标icon优化方案
    1、问题:element-plus中icon跟element中的icon完全不同,使用也很多变化,最重要的一点就是按需动态加载了,主要用到unplugin-icons这个库根据按需加载icon的使用方法,是无法满......
  • 初识rollup 打包、配置vue脚手架
    rollupjavascript代码打包器,它使用了es6新标准代码模块格式。特点:面向未来,拥抱es新标准,支持标准化模块导入、导出等新语法。treeshaking静态分析导入的代码。......
  • 在教学中常被问到的几个vue3.x与typescript的问题,统一解答
    在教学当中,学生在学习vue3.x时,常常会问到typescript和vue3.x之间的关系,感觉这两个技术总是绑在一起的,下面老赵来统一解答一下: 那学vue3.x,为什么要求也要掌握typescrip......