《Vue》你的弹窗能拖动吗?Vue自定义指令实现可拖动弹窗

求关注,求收藏,谢谢!

之前负责了我司的几个后台管理型的项目的迭代和新需求开发,第一次以前端负责人的身份参与项目,从技术方案的选型到需求的迭代,再到工作包的分配,组件的拆分,代码的审核,最后的提测、改BUG,虽然有点累,但确实接触到了很多以前不曾接触到的东西,涨了很多见识,当然也见识到了一些叹为观止的骚操作…

今天要说的是组件开发中的一项,我司的项目技术栈主要是围绕着Vue的体系开发的,UI框架基本上不是IView就是Element,且这两者都有其自带的基础组件:弹窗组件,但是从需求的角度出发,这两者的弹窗组件其实都不能满足业务的开发,比如,我司的需求中有一项比较常用但是组件又没有的功能,拖动,(IView可以拖动,但是设置拖动属性会强制将遮罩移除,这个问题直到4.6.0版本才改为不强制,而我司的iView又比较早,升级是不可能升级了);

考虑到其他模块中也有使用到了拖动这个功能,且在Vue中DOM的操作能和自定义指令非常完美契合,最终决定使用自定义指令实现该功能,并且该功能会被作为一个基础组件放入项目;

效果图

=============================================================

话不多说,直接先看最终的效果图,后台模版借用的是IVew的,这个无所谓,主要是弹窗:

在这里插入图片描述

大致效果其实就是这样,挺简单的,这部分的用法就是我们指定了只有按住title部分才可以触发拖动,且拖动的时候是整个弹窗都会被拖动;

下载

============================================================

其实我们已经积累了一部分常用的自定义指令作为后台模版的基础建设,比如v-loading,以及这个v-move之类的,如果有需要的话,可以看看后面怎么办,这里先暂时上传了v-move的相关开发版的代码,有需要的小伙伴可以下载看看:v-move自定义指令,如果不能下载请及时留言告知,谢谢;

流程图

=============================================================

既然是一个自定义的指令,并且该指令具有一定的通用性,那么我们就必须要进行一些简单的设计,毕竟在开发前我们就想的很周到的话,那么不是就可以轻松很多,并且后期有人接手维护也能有一定的参考,不是啥资料都没有,大致流程图如下:

在这里插入图片描述

代码实现

==============================================================

其实整个代码的实现并不复杂,拖动相关的功能说到底就是一个跟踪鼠标移动实时改变被拖DOM的x轴和y轴坐标的过程,坐标改变了,那么就相当于被拖的DOM拖动了

基础知识


阅读一下功能模块需要对vue的自定义指令有一些基础认知,具体可以直接看官网的说明:Vue自定义指令,简单的说自定义指令就是Vue允许通过自定义指令来对DOM元素进行一些相关操作;

接下来,就按照流程图的顺序,逐一开发相关代码

合法参数验证


在这个阶段,我们需要验证自定义指令的绑定对象,先直接看代码:

/**

  • 初始化阶段

  • @param {HTMLElement} el 待待绑定的元素

  • @param {Object} binding Vue bin

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个实现拖拽弹窗头部的 Vue 自定义指令: ```js // draggable.js const draggable = { bind: function(el, binding, vnode) { let isDragging = false; let x = 0; let y = 0; let initialX = 0; let initialY = 0; el.style.cursor = 'move'; function mouseDown(e) { initialX = e.clientX - x; initialY = e.clientY - y; if (e.target === el) { isDragging = true; } } function mouseMove(e) { if (isDragging) { x = e.clientX - initialX; y = e.clientY - initialY; el.style.transform = `translate3d(${x}px, ${y}px, 0)`; } } function mouseUp(e) { isDragging = false; } el.addEventListener('mousedown', mouseDown); el.addEventListener('mousemove', mouseMove); el.addEventListener('mouseup', mouseUp); el._cleanup = function() { el.removeEventListener('mousedown', mouseDown); el.removeEventListener('mousemove', mouseMove); el.removeEventListener('mouseup', mouseUp); }; }, unbind: function(el, binding, vnode) { el._cleanup && el._cleanup(); } }; export default draggable; ``` 这个自定义指令实现了在鼠标按下时将弹窗拖动到指定位置的功能。指令会在绑定时给指定的元素添加 mousedown、mousemove 和 mouseup 事件监听器,当鼠标按下时,记录下当前鼠标位置和弹窗位置的偏移量,并将 isDragging 状态设置为 true;当鼠标移动时,根据当前鼠标位置和偏移量计算出弹窗的新位置,并使用 CSS transform 属性将其移动到指定位置;当鼠标松开时,将 isDragging 状态设置为 false。 使用这个自定义指令非常简单,只需要在弹窗头部元素上添加 v-draggable 指令即可: ```html <template> <div class="modal"> <div class="modal-header" v-draggable> <h3 class="modal-title">{{ title }}</h3> <button class="modal-close" @click="$emit('close')">x</button> </div> <div class="modal-body"> <slot></slot> </div> </div> </template> <script> import draggable from './draggable'; export default { directives: { draggable }, props: { title: String, visible: Boolean } }; </script> <style scoped> .modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: white; box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); } .modal-header { display: flex; align-items: center; justify-content: space-between; padding: 10px; background-color: #eee; cursor: move; } .modal-title { margin: 0; } .modal-close { border: none; background-color: transparent; font-size: 20px; cursor: pointer; } </style> ``` 在这个组件中,我们将 v-draggable 指令绑定到了弹窗头部的元素上。指令会自动添加鼠标事件监听器,并在鼠标拖拽实现弹窗的移动效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值