美文网首页
元素拖拽 单个与多个

元素拖拽 单个与多个

作者: 无题syl | 来源:发表于2021-07-16 11:31 被阅读0次

基础知识

1.鼠标按下 onmousedown
2.鼠标移动 onmousemove
3.鼠标抬起 onmouseup


image.png

pageX与clientX
pageX是距离整个页面的x轴距离(包括滚动条滚动看不到那部分的页面)
clientX是目前可视区域的页面
当页面无滚动条时 e.pageX=e.clientX


小知识 组织默认事件
modal.oncontextmenu=e=>{
e.preventDault() 鼠标右键菜单,阻止这个默认事件
}

单个元素拖拽

1.html

 <div  id="box"><div>

2.js

      let modal = document.getElementById('box');
      let x = 0, y = 0,canMove=false
      let maxX = window.innerWidth - modal.offsetWidth;
      let maxY = window.innerHeight - modal.offsetHeight;
      //x = e.pageX - modal.offsetLeft;
     // y = e.pageY - modal.offsetTop;


      modal.onmousedown = (e) => {
        canMove = true;
      x = e.pageX - modal.offsetLeft; //在box内部按下时候 记录鼠标e相对于box的上下距离
      y = e.pageY - modal.offsetTop;

      }
      window.onmousemove = (e) => {
        //e.preventDefault && e.preventDefault();
        if (canMove) {  //标识 只有在box并且按下时才能移动
          let modalX = e.pageX - x, //减去x  始终让鼠标在box上(相对位置不变)
            modalY = e.pageY - y;
          if (modalX < 0) modalX = 0;  //最小x轴偏移
          else if (modalX > maxX) modalX = maxX; //最大x轴偏移
          if (modalY < 0) modalY = 0;
          else if (modalY > maxY) modalY = maxY;
          modal.style["left"] = modalX + "px"; //box随鼠标移动
          modal.style["top"] = modalY + "px";
        }
      };
      window.onmouseup = (e) => {
        canMove = false;
      };

多个元素的拖拽

1.html

<div>
<div class="box" id="box1"  @mousedown="drag($event,'box1')" >
        <div>
<div class="box" id="box2"  @mousedown="drag($event,'box2')" >
        <div>
<div class="box" id="box3"  @mousedown="drag($event,'box3')" >
        <div>
</div>

2.js

    drag(e,r) {
      let modal = document.getElementById(r);
      let x = 0, y = 0;
      let maxX = window.innerWidth - modal.offsetWidth;
      let maxY = window.innerHeight - modal.offsetHeight;
      x = e.pageX - modal.offsetLeft;
      y = e.pageY - modal.offsetTop;

      window.addEventListener("mousemove", move);
      function move(e) {
        e.preventDefault && e.preventDefault();
        let modalX = e.pageX - x,
        modalY = e.pageY - y;
        if (modalX < 0) modalX = 0;
        else if (modalX > maxX) modalX = maxX;
        if (modalY < 0) modalY = 0;
        else if (modalY > maxY) modalY = maxY;
        modal.style["left"] = modalX + "px";
        modal.style["top"] = modalY + "px";
      }
      // 添加鼠标抬起事件,鼠标抬起,将事件移除
      window.addEventListener("mouseup", function() {
        window.removeEventListener("mousemove", move);
      });
      // 鼠标离开父级元素,把事件移除
      window.addEventListener("mouseout", function() {
        window.removeEventListener("mousemove", move);
      });
      

    },

相关文章

网友评论

      本文标题:元素拖拽 单个与多个

      本文链接:https://www.haomeiwen.com/subject/hinvpltx.html