本文实例讲述了Vue使用自定义指令实现拖拽行为。分享给大家供大家参考,具体如下:
需求
通过自定义指令的方式实现拖拽效果,预期的使用方式为:
<div style="background: #f00; width: 200px; height: 200px;" v-drag> XXXX </div>
更重要的一个需求点:
- 拖拽元素内部的子元素可以自行阻止拖拽行为
比如:
<div style="background: #f00; width: 200px; height: 200px;" v-drag> <el-button @mousedown.native.stop>test</el-button> </div>
曾经使用过vue-resizable
,由于该组件是通过事件捕获的方式实现的,拖拽元素的子元素也会触发拖拽行为,不符合开发需求,所以自行实现了拖拽指令,相关源码如下。
无任何依赖,复制即可使用
源码
/** * @file 自定义拖拽命令 */ import Vue from 'vue'; const Drag = { install(Vue: any) { // 如需禁止拖拽元素内部某些元素触发拖拽,在内部不可触发拖拽元素上添加@mousedown.native.stop即可 Vue.directive('drag', { bind(el: any) { el.style.position = 'absolute'; el.style.zIndex = el.style.zIndex || '3000'; }, inserted(el: any) { // 设置元素初始位置 const boundingClientRect = el.getBoundingClientRect(); el.style.left = boundingClientRect.x + 'px'; el.style.top = boundingClientRect.y + 'px'; // 将拖拽元素置于body子元素,防止被relative的父元素遮挡 document.body.appendChild(el); let originX: number; let originY: number; const mouseDownHandler = (evt: MouseEvent) => { originX = evt.clientX - el.offsetLeft; originY = evt.clientY - el.offsetTop; el.style.cursor = 'pointer'; }; const mouseMoveHandler = (evt: MouseEvent) => { if (evt.buttons === 1 && originX && originY) { el.style.left = evt.clientX - originX + 'px'; el.style.top = evt.clientY - originY + 'px'; } }; const mouseUpHandler = () => { el.style.cursor = 'default'; }; el.addEventListener('mousedown', mouseDownHandler); el.addEventListener('mousemove', mouseMoveHandler); el.addEventListener('mouseup', mouseUpHandler); el.__mouseDownHandler__ = mouseDownHandler; el.__mouseMoveHandler__ = mouseMoveHandler; el.__mouseUpHandler__ = mouseUpHandler; }, unbind(el: any) { el.removeEventListener('mousedown', el.__mouseDownHandler__); el.removeEventListener('mousemove', el.__mouseMoveHandler__); el.removeEventListener('mouseup', el.__mouseUpHandler__); // 当父组件销毁触发unbind的时候需要手动删除这个节点,不然会一直存留在body中 el.parentNode.removeChild(el); } }); } }; Vue.use(Drag); export default Drag;
希望本文所述对大家vue.js程序设计有所帮助。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年09月21日
2024年09月21日
- 《艾诺提亚:失落之歌》PC版反向跳票!9月17日PC开玩
- 老外谈《黑神话:悟空》:在我心里10分 但它确实是8分游戏
- 陈秋霞.1977-温馨在我心(LP版)【歌林】【WAV+CUE】
- 张秀卿.2019-感情骗子【豪记】【WAV+CUE】
- 林隆璇.1993-收藏昨日【福茂】【WAV+CUE】
- 魔兽世界wlk德拉诺金钻如何获得 wlk德拉诺金钻获取方法介绍
- 魔兽世界wlk祖阿曼战熊如何获得 wlk祖阿曼战熊获取方式介绍
- 魔兽世界阿奴巴拉克有什么背景故事 阿奴巴拉克背景故事介绍
- NeilYoung-EarlyDaze(2024)[24Bit]WAV
- NeaveTrio-Rooted(2024)[24Bit-WAV]
- [吉他演奏]RCAREDSEAL《Rodrigo-ConciertoDeAranjues》[WAV+CUE]
- 气质绝了!《黑神话》蜘蛛四妹演员COS自己正片释出
- 《黑神话:悟空》第五章动画大闹天宫内容被删:牛魔王是主角
- 玩家吐槽《黑神话》如意金箍棒属性差:就该是最强武器
- 《邓紫棋 上古情歌2CD》[WAV/分轨][1.1GB]