Vue-cli中实现拖拽-自定义指令

附加条件:不能超出父元素

实现思路: 使用vue自定义指令directives, 监听鼠标按下事件,计算按下时目标元素与父元素的距离,最后通过CSS position-absolute : left / top实现距离改变

(父元素需要有宽高,且有position定位)

1、vue文件中实现

使用directives

template中使用指令

script中定义指令

ini 复制代码
methods: {},
directives: {
  drag: {
    inserted: function(el) {
      // console.log('el:', el)
      let oDiv = el; // 当前元素
      // 禁止选择拖拽块上的文字
      document.onselectstart = function () {
        return false;
      };
      oDiv.onmousedown = function (e) {
        // 获取父元素dom
        let pbox = document.getElementById('video-wrap-hls')
        // console.log('parent-box', pbox.clientWidth, pbox.clientHeight)
        // console.log('child-box', oDiv.clientWidth, oDiv.clientHeight)
        // console.log('e:', e, oDiv.offsetLeft, oDiv.offsetTop)
        // 鼠标按下,计算当前元素距离可视区的距离
        let disX = e.clientX - oDiv.offsetLeft;
        let disY = e.clientY - oDiv.offsetTop;
        document.onmousemove = function (e) {
          // 通过事件委托,计算移动的距离
          let l = e.clientX - disX;
          let t = e.clientY - disY;
          if (l < 0) {
            l = 0
          } else if (l > (pbox.clientWidth - oDiv.clientWidth)) {
            l = pbox.clientWidth - oDiv.clientWidth
          }
          if (t < 0) {
            t = 0
          } else if (t > (pbox.clientHeight - oDiv.clientHeight)) {
            t = pbox.clientHeight - oDiv.clientHeight
          }
          // 移动当前元素
          oDiv.style.left = l + "px";
          oDiv.style.top = t + "px";
        };
        document.onmouseup = function (e) {
          document.onmousemove = null;
          document.onmouseup = null;
        };
        // 防止黏连
        return false;
      };
    },
  }
},

2、main.js全局引入

创建directives.js 在入口文件引入 并Vue.use,实现代码与文件内实现基本相同。

vue官方directive使用方法

from vue官网

from vue官网

项目中使用

在入口文件引入并使用

上述步骤完成后可直接在页面文件中使用

3、小坑

需注意如果css使用了transition过渡, 不能使用all 因为 left / top 改变也会发生过渡 导致发生拖拽延迟效果

如果需要鼠标hover后有动画效果 可以分别写出来

栗子

相关推荐
daols885 分钟前
vue 甘特图组件 vxe-gantt 修改滚动条样式-让滚动条自动隐藏
javascript·vue.js·甘特图
特立独行的猫A1 小时前
仓颉UI开发实战:我用仓颉写了个桌面版力扣:从判题机到 100 道题
vue.js
用户1733598075371 小时前
纯前端 PDF 双面打印避坑指南:翻页顺序错了整个白印?
前端·javascript·vue.js
码艺-Alimjan13 小时前
Tauri 源码备份 · 打包 & 解压 总结,源码收集之路
前端·javascript·vue.js
顽疲16 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
毕业设计70317 小时前
(免费领源码)基于node的学生公寓管理系统06412- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
vue.js·mysql·node.js·maven·mybatis·express·b/s
古夕17 小时前
地址变了,页面是空的:一次 Vue Router 菜单切换复盘
前端·vue.js
沙漏无语1 天前
pnpm 安装@vue-office包的幽灵依赖问题解决
前端·javascript·vue.js
雪芽蓝域zzs1 天前
第 9 节:面积测量(测面工具)
vue.js
℘团子এ1 天前
vue2中自定义指令的使用
前端·javascript·vue.js