element弹框拖拽

这篇博客介绍了如何在Vue.js应用中创建一个自定义指令`v-dialogDrag`,实现弹框的拖拽功能。首先,创建了一个新的directive.js文件,定义了指令并绑定到弹框的头部元素,使得用户可以通过鼠标按下和移动来拖动弹框。接着,在main.js中引入了这个指令。最后,展示了在el-dialog组件上使用该指令的例子,允许用户自定义弹框的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

element弹框拖拽

弹框拖拽

1.新建directive.js文件

import Vue from 'vue'
Vue.directive("dialogDrag", {
    bind(el, binding, vnode, oldVnode) {
      const dialogHeaderEl = el.querySelector(".el-dialog__header");
      const dragDom = el.querySelector(".el-dialog");
      dialogHeaderEl.style.cursor = "move";
   
      // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
      const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);
   
      dialogHeaderEl.onmousedown = e => {
        // 鼠标按下,计算当前元素距离可视区的距离
        const disX = e.clientX - dialogHeaderEl.offsetLeft;
        const disY = e.clientY - dialogHeaderEl.offsetTop;
   
        // 获取到的值带px 正则匹配替换
        let styL, styT;
   
        // 注意在ie中 第一次获取到的值为组件自带0% 移动之后赋值为px
        if (sty.left.includes("%")) {
          styL =
            +document.body.clientWidth * (+sty.left.replace(/\%/g, "") / 100);
          styT =
            +document.body.clientHeight * (+sty.top.replace(/\%/g, "") / 100);
        } else {
          styL = +sty.left.replace(/\px/g, "");
          styT = +sty.top.replace(/\px/g, "");
        }
   
        document.onmousemove = function(e) {
          // 通过事件委托,计算移动的距离
          const l = e.clientX - disX;
          const t = e.clientY - disY;
   
          // 移动当前元素
          dragDom.style.left = `${l + styL}px`;
          dragDom.style.top = `${t + styT}px`;
   
          // 将此时的位置传出去
          // binding.value({x:e.pageX,y:e.pageY})
        };
   
        document.onmouseup = function(e) {
          document.onmousemove = null;
          document.onmouseup = null;
        };
      };
    }
  });

2.main.js引入

/* 注册全局指令 --弹框拖拽 */
import "@/common/drag/directive.js"

3.使用:自定义指令v-dialogDrag

<el-dialog
	v-dialogDrag
	:visible.sync="dialogVisible" 
	append-to-body top="32vh"
 >
	弹框内容...
</el-dialog>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值