vue点击标题栏实现拖拽

    moveFun() {
      const mainBoxs = document.querySelector(".mainBoxs");
      const dialogHeaderEl = this.$refs.titbox;
      const dragDom = this.$refs.darbox;
      //mainBoxs=最外层盒子,用来计算移动盒子的位置 dialogHeaderEl=移动的头部 dragDom=移动的盒子

      // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
      const sty =
        dragDom.currentStyle || window.getComputedStyle(dragDom, null);
      dragDom.style.position = "absolute";
      let width = dragDom.style.width;
      if (width.includes("%")) {
        width = +document.body.clientWidth * (+width.replace(/\%/g, "") / 100);
      } else {
        width = +width.replace(/\px/g, "");
      }
      dragDom.style.left = `${
        (mainBoxs.clientWidth - dragDom.clientWidth) / 2
      }px`;

      dialogHeaderEl.onmousedown = (e) => {
        // console.log(e);
        // 鼠标按下,计算当前元素距离可视区的距离
        const disX = e.clientX - dialogHeaderEl.offsetLeft;
        const disY = e.clientY - dialogHeaderEl.offsetTop;

        // 获取到的值带px 正则匹配替换
        let styL, styT;
        // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
        if (sty.left.includes("%")) {
          styL =
            +document.body.clientWidth * (+sty.left.replace(/\%/g, "") / 100);
          styT =
            +document.body.clientHeight * (+sty.top.replace(/\%/g, "") / 100);
        } else {
          styL = +sty.left.replace(/\px/g, "");
          styT = +sty.top.replace(/\px/g, "");
        }

        document.onmousemove = function (e) {
          // console.log(e);
          // 通过事件委托,计算移动的距离
          const l = e.clientX - disX;
          const t = e.clientY - disY;
          // 计算右边和底部的边界
          const maxRight = mainBoxs.clientWidth - dragDom.clientWidth;
          const maxBottom = mainBoxs.clientHeight - dragDom.clientHeight;

          // 将计算好的边界值赋值,styX代表X轴移动, styY代表Y轴移动
          let styX = 0,
            styY = 0;
          styX = l + styL;
          styY = t + styT;
          if (styX < 0) {
            styX = 0;
          }
          if (styY < 0) {
            styY = 0;
          }
          if (styX > maxRight) {
            styX = maxRight;
          }
          if (styY > maxBottom) {
            styY = maxBottom;
          }
          // 移动当前元素
          dragDom.style.left = `${styX}px`;
          dragDom.style.top = `${styY}px`;
          // 将位置坐标显示到dom上
          dialogHeaderEl.innerHTML = `X:${styX},Y:${styY}`;
        };
        document.onmouseup = function (e) {
          // console.log(e);
          document.onmousemove = null;
          document.onmouseup = null;
        };
      };
    },


//最后在Dom渲染完成之后调用函数方法
  mounted() {
    this.moveFun();
  },
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值