【JavaScript DOM】使用原生JS实现拖拽元素

一、 文章关键要点

1、三个事件

onmousedown、onmousemove、onmouseup
后两个事件要绑给document

2、核心逻辑

(1)鼠标按下:获取元素的左上偏移量(offsetLeft、offsetTop),鼠标距离可视区域横纵坐标(clientX、clientY)。
(2)鼠标移动:获取两次距离差(新的可视区域横纵坐标 - 旧的的可视区域横纵坐标 ,鼠标距离差+元素最初的offsetLeft、offsetTop为元素最终位置。
(3)鼠标抬起,将移动事件清空。

3、边界值判断逻辑

(1)大于最大值等于最大值
(2)小于最小值等于最小值
在这里插入图片描述

二、HTML代码

<div id="box">拖拽</div>

三、CSS代码

 *{
    margin: 0;
    padding: 0;
  }
  #box{
     width: 100px;
     height: 100px;
     background: pink;
     position: absolute;
     left: 0;
     top: 0;
     color:ghostwhite;
     text-align:center;
}

四、JS代码

 //元素鼠标按下事件   
 //当鼠标在这个元素身上按下的时候 就会触发回调函数  
  box.onmousedown = function (event) {
    event = event || window.event;   
      // 获取元素起始位置
      var eleX = box.offsetLeft;
      var eleY = box.offsetTop;
      // 鼠标按下的坐标
      var startX = event.clientX;
      var startY = event.clientY;
// 低版本ie选中文字,不能拖拽,低版本自带功能
// 解决方案:开启全局捕获
// 把所有后续的鼠标事件全部强制到这个元素身上,不让事件去处理文字
      box.setCapture && box.setCapture();
      //鼠标抬起事件
      document.onmousemove = function (event) {
          console.log('移动');
          event = event || window.event;
          // 获取鼠标移动后的位置
          var endX = event.clientX;
          var endY = event.clientY;
          // 鼠标距离差 = 鼠标移动后位置 - 鼠标按下的位置
          var disX = endX - startX;
          var disY = endY - startY;
          // 元素最终的位置 = 元素初始位置 + 鼠标距离差
          var lastX = eleX + disX;
          var lastY = eleY + disY;

          // 边界值判断  (吸附效果)
          // 边界值判断逻辑 大于最大值等于最大值 小于最小值等于最小值
          if(lastX > document.documentElement.clientWidth - box.offsetWidth -20){
            lastX = document.documentElement.clientWidth - box.offsetWidth;
          }else if(lastX < 20){
            lastX = 0;
          }
          if(lastY > document.documentElement.clientHeight - box.offsetHeight -20){
            lastY = document.documentElement.clientHeight - box.offsetHeight;
          }else if(lastY < 20){
            lastY = 0;
          }
          // 设置元素移动位置
          box.style.left = lastX + 'px';
          box.style.top = lastY + 'px';
      };
      
      //鼠标抬起事件
      document.onmouseup = function () {
          document.onmousemove = null;
          // 针对低版本浏览器要在逻辑结束的地方 释放全局捕获
          box.releaseCapture && box.releaseCapture();
      };
      return false;
    };
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值