(十五)原生js案例之面向对象的拖拽及越界判断

业务中常见的拖拽功能,比如拖拽弹窗等业务的实现

效果请添加图片描述

代码实现

  • 必要的css
 *{
    margin: 0;
    padding: 0;
  }
  html,body{
    height: 100vh;
  }
  #drag {
    width: 100px;
    height: 100px;
    background-color: red;
    position: absolute;
  }
  • 面向过程的实现
window.onload = function () {
  oDrag = document.getElementById("drag");

  oDrag.onmousedown = function (e) {
    let ev = e || event;
    const disX = ev.clientX - oDrag.offsetLeft;
    const disY = ev.clientY - oDrag.offsetTop;
    document.onmousemove = function (e) {
      let ev = e || event;
      oDrag.style.left = ev.clientX - disX + "px";
      oDrag.style.top = ev.clientY - disY + "px";
    };
    document.onmouseup = function () {
      document.onmousemove = null;
      document.onmousedown = null;
    };
    return false;
  };
};
  • 面向对象的实现
window.onload = function () {
  const oBox = new Box();
  oBox.init();
};

function Box() {
  this.oDiv = document.getElementById("drag");
  this.disX = 0;
  this.disY = 0;
}

Box.prototype.init = function () {
  const _that = this;
  this.oDiv.onmousedown = function (e) {
    _that.fnDown(e);
  };
};

Box.prototype.fnDown = function (e) {
  let ev = e || event;
  const _that = this;
  this.disX = ev.clientX - this.oDiv.offsetLeft;
  this.disY = ev.clientY - this.oDiv.offsetTop;
  document.onmousemove = function (e) {
    _that.fnMove(e);
  };
  document.onmouseup = this.fnUp;
  return false;
};

Box.prototype.fnMove = function (e) {
  let ev = e || event;
  let l = ev.clientX - this.disX;
  let t = ev.clientY - this.disY;
  if (l < 0) {
    l = 0;
  }
  if (t < 0) {
    t = 0;
  }

  if (l >= document.body.clientWidth - this.oDiv.offsetWidth) {
    l = document.body.clientWidth - this.oDiv.offsetWidth;
  }
  if (t >= document.body.clientHeight - this.oDiv.offsetHeight) {
    t = document.body.clientHeight - this.oDiv.offsetHeight;
  }
  this.oDiv.style.left = l + "px";
  this.oDiv.style.top = t + "px";
};

Box.prototype.fnUp = function () {
  document.onmousemove = null;
  document.onmousedown = null;
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值