首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vue拖动通过指令方式

vue拖动通过指令方式

作者头像
tianyawhl
发布2021-10-09 10:54:54
2480
发布2021-10-09 10:54:54
举报
文章被收录于专栏:前端之攻略前端之攻略

可以在组件上设置指令也可以设置全局指令

目标

1、移动元素并保存位置信息

主要用到 onmousedown onmousemove onmouseup

在组件中设置指令

  directives: {
    drag: {
      inserted(el, binding) {
        let oDiv = el;
        oDiv.onmousedown = function (e) {
          //  鼠标按下,计算当前元素距离可视区的距离
          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;

            oDiv.style.left = l + "px";

            oDiv.style.top = t + "px";

            if (e.clientX - disX <= 0) {
              oDiv.style.left = 0 + "px";
            }

            if (e.clientY - disY <= 0) {
              oDiv.style.top = 0 + "px";
            }
            //     将此时的位置传出去
            binding.value({
              id: oDiv.id,
              left: oDiv.style.left,
              top: oDiv.style.top,
            });
          };
          //     松开事件后,移除事件
          document.onmouseup = function (e) {
            document.onmousemove = null;
            document.onmouseup = null;
          };
        };
      },
    },
  },

使用方法 v-drag="greet"

  <div style="width:400px;height:400px;position:relative;background:pink;">
    <div v-drag="greet" id="001"
      style="width:100px;height:100px;background:gray;position:absolute;left:0;top:0;">
      <div>第一行</div>
      <div>第二行</div>
    </div>
    <div v-drag="greet" id="002"
      style="width:100px;height:100px;background:gray;position:absolute;left:120px;top:0;">
      <div>2-第一行</div>
      <div>2-第二行</div>
    </div>
    <!-- <input v-focus> -->
  </div>

保存数据,因为拖动的时候是不停的执行greet函数,为了性能,采用了防抖

    greet(obj) {
      console.log(obj);
      clearTimeout(this.timer);
      this.timer = setTimeout(() => {
        console.log("setTimeout");
        if (this.positionInfor.length == 0) {
          console.log("等于0");
          this.positionInfor.push(obj);
        } else {
          for (let i = 0; i < this.positionInfor.length; i++) {
            if (this.positionInfor[i].id == obj.id) {
              this.positionInfor.splice(i,1,obj)
              return;
            }
            if (i == this.positionInfor.length - 1) {
              this.positionInfor.push(obj);
            }
          }
        }
      }, 300);
    },
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档