js拖拽效果的原理及实现

743 阅读2分钟

js拖拽效果的原理及实现

拖拽的3个事件
  • onmousedown:鼠标按下事件
  • onmousemove:鼠标移动事件
  • onmouseup:鼠标抬起事件
原理

鼠标在元素上按下的时候{ 拖拽状态=1 记录下鼠标的x和y坐标 记录下元素的x和y坐标}

x: e.offsetX, y: e.offsetY 

鼠标在元素上移动的时候{ 如果拖拽状态是0就什么也不做。 如果拖拽状态是1,那么 元素y=现在鼠标y-原来鼠标y+原来元素y 元素x=现在鼠标x-原来鼠标x+原来元素x}

document.div.style.left = e.clientX - document.offset.x + "px";

鼠标在任何时候放开的时候{ 拖拽状态=0 如果鼠标释放,则执行移除事件侦听}

document.removeEventListener("mousemove", mouseHandler);
document.removeEventListener("mouseup", mouseHandler);

代码实现

 function mouseHandler(e) {
    //通过判断事件的类型来执行对应的条件语句
    if (e.type === "mousedown") {
      e.preventDefault();
      //这里将e.target赋给document.div,相当于设了一个局部变量,在触发mousemove事件后,
      //再次进入函数时,保证触发事件的div就是我们要改变位置的那个div
      document.div = e.target;
      //这里也是将鼠标相对拖拽的那个div元素
      //左上角的位置,设置成一个对象进行保存其实相当于如下两条
      document.offset = { x: e.offsetX, y: e.offsetY };
      //document.offsetx=e.offsetX;将e.offsetX赋值给自定义变量document.offsetx
      //document.offsety=e.offsetY;将e.offsetY赋值给自定义变量document.offsety
      //和上面是两种写法
      //在鼠标点击后,如果发生鼠标移动事件,则再次进入该函数进行执行鼠标移动的执行语句
      document.addEventListener("mousemove", mouseHandler);
      //在鼠标点击后,如果发生鼠标释放事件,则再次进入该函数进行执行,则再次进入该函数进行执行鼠标释放的执行语句
      document.addEventListener("mouseup", mouseHandler);
    } else if (e.type === "mousemove") {
      //判断触发的事件类型是mousemove之后执行
      //这里的document.div和document.offset.x都是之前定义好的变量,用e.clientX-document.offset.x
      //是因为元素的position位置是相对元素的左上顶点的位置的,因此鼠标所在的位置值不能直接赋给它。
      document.div.style.left = e.clientX - document.offset.x + "px";
      document.div.style.top = e.clientY - document.offset.y + "px";
    } else if (e.type === "mouseup") {
      //如果鼠标释放,则执行移除事件侦听
      document.removeEventListener("mousemove", mouseHandler);
      document.removeEventListener("mouseup", mouseHandler);
    }
 }