Vue实现元素拖拽不超过页面宽高

拖拽元素必须为固定定位

data(){
return{
 isLiveDrop:true
}
}
     /**
     * @function 元素拖拽
     * @param {*} dom id选择器
     */
    setDomDrop(dom) {
      const DROP = document.getElementById(dom)
      // 鼠标按下的初始坐标
      let StartX = null
      let StartY = null
      // 鼠标移动时候的坐标
      let MoveX = null
      let MoveY = null
      // 鼠标的最终位置
      let EndX = null
      let EndY = null
      // 获取盒子的初始值
      let DOMLeft = null
      let DOMTop = null
      // 元素的宽高
      let DOMHeight = null
      let DOMWidth = null
      //当前元素移动的最大距离
      let MaxX = null
      let MaxY = null
      // 当前元素移动最小距离
      let MinX = 0
      let MinY = 77
      // 元素的最终位置
      let DOMEndLeft = null
      let DOMEndTop = null
      const _this=this;
      // 鼠标按下
      DROP.onmousedown = function(e) {
        //鼠标按下事件
        e = e || window.event //事件对象
        StartX = e.clientX //鼠标按下X的坐标
        StartY = e.clientY //鼠标按下Y的坐标
        DOMLeft = this.offsetLeft //获取盒子的初始left值
        DOMTop = this.offsetTop //获取盒子的初始top值
        // 获取元素的宽
        DOMHeight = this.offsetHeight
        DOMWidth = this.offsetWidth
        // 获取元素的高
        document.onmousemove = function(e) {
          // 赋值为拖拽
          _this.isLiveDrop=false;
          //鼠标移动事件
          e = e || window.event
          MoveX = e.clientX //鼠标移动X的坐标
          MoveY = e.clientY //鼠标移动Y的坐标
          //移动的坐标减去按下的坐标 = 移动的距离
          EndX = MoveX - StartX
          EndY = MoveY - StartY
          // 当前页面可视区域内宽高-元素宽高=当前元素移动的最大距离
          MaxX = document.documentElement.clientWidth - DOMHeight //页面高度
          MaxY = document.documentElement.clientHeight - DOMWidth //页面宽度
          // 元素最终位置
          DOMEndLeft = DOMLeft + EndX
          DOMEndTop = DOMTop + EndY
          // 判断元素位置是否到达最小位置
          if (DOMEndLeft <= MinX) {
            DOMEndLeft = MinX
          }
          if (DOMEndTop <= MinY) {
            DOMEndTop = MinY
          }
          // 判断元素是否达到最大位置
          if (DOMEndLeft >= MaxX) {
            DOMEndLeft = MaxX
          }
          if (DOMEndTop >= MaxY) {
            DOMEndTop = MaxY
          }
          //赋值给left和top
          DROP.style.top =DOMEndTop +'px'
          DROP.style.left =DOMEndLeft +'px'
        }     
          //鼠标抬起事件
        document.onmouseup = function() {
   
          //清除移动和抬起事件
          this.onmousemove = this.onmouseup = null
          // 区分拖拽还是点击事件
          if(_this.isLiveDrop){
            _this.showLiveList()
          }
          _this.isLiveDrop=true;
        }
        return false //阻止默认事件
      }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端J先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值