vue3全局自定义指令实现div在指定区域拖拽

const drag = {
  mounted(el, binding, vnode) {
    //传入的值,用来检测是否包括侧边栏的宽度
    let dragvalue = binding.value.dragvalue;
    el.onmousedown = function (e) {
      // let wtidthvalue = binding.value;
      let id = e.currentTarget.id;
       //计算鼠标位置相对于元素的偏移量
      let divx = e.clientX - document.getElementById(id).offsetLeft;
      let divy = e.clientY - document.getElementById(id).offsetTop;

      document.onmousemove = function (e) {
        el.style.pointerEvents = "none";
        //计算鼠标位置相对于元素新的偏移量
        let l = e.clientX - divx;
        let t = e.clientY - divy;
        // 检查拖拽位置是否超出屏幕边界
        const maxX = window.innerWidth - el.offsetWidth - dragvalue;
        const maxY = window.innerHeight - el.offsetHeight - 100;
        //限制最大最小范围
        l = Math.max(0, Math.min(l, maxX));
        t = Math.max(60, Math.min(t, maxY));

        document.getElementById(id).style.left = l + "px";
        document.getElementById(id).style.top = t + "px";
      };

      document.onmouseup = function (e) {
        el.style.pointerEvents = null;
        document.onmousemove = null;
        document.onmouseup = null;
      };
    };
  },
};

export { drag };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue Element中,你可以使用自定义指令实现一些特定的功能。在你提供的代码中,你使用了一个自定义指令`v-dialog-drag`来实现拖拽功能。这个指令是通过在外层div上绑定该指令来实现的。当点击打开按钮时,dialog会显示出来,并且可以通过拖拽来移动它的位置。\[1\] 另外,你还提到了如何使用二次确认框Dialog。在你的代码中,你使用了一个自定义的组件`SubDialog`来实现二次确认框的功能。你可以通过调用`proxy.$subDialog`方法来打开二次确认框,并传入相应的参数,比如宽度、是否隐藏标题栏、是否显示关闭按钮等。在确认按钮被点击时,你可以通过回调函数来处理确认操作。\[2\] 最后,在`main.ts`文件中,你需要引入并注册`SubDialog`组件,以便在整个应用程序中可以使用它。你可以使用`createApp`方法创建Vue实例,并通过`use`方法注册`SubDialog`组件。\[3\] #### 引用[.reference_title] - *1* [【vue3】使用自定义指令实现el-dialog的拖拽功能。](https://blog.csdn.net/Android062005/article/details/126941193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Vue3封装全局自定义弹框,结合element的el-dialog](https://blog.csdn.net/HelloWorldLJY/article/details/125874489)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值