1. 拖拽流程:
  2. --1 当鼠标在被拖拽元素上按下时,开始拖拽 onmousedown
  3. --2 当鼠标移动时被拖拽元素跟随鼠标移动 onmousemove
  4. --3 当鼠标松开时,被拖拽元素固定在当前位置 onmouseup
  5. -->1 为一个叫boxdiv绑定一个鼠标按下事件(以下两个事件在此事件里发生,包裹)
  6. -->2 document绑定一个onmousemove事件
  7. | a. 需获取鼠标的坐标(clientXclientY)
  8. | b. 修改box的位置
  9. -->3 document绑定一个鼠标松开事件
  10. 当鼠标松开时,把鼠标的移动事件设置为null
  11. document.onmousemove = null
  12. 松开事件也要取消
  13. document.onmouseup = null
  1. -->当我们拖拽一个网页中的内容时,浏览器会默认去搜索引擎中搜索内容,此时会导致拖拽功能的异常,这个是浏览器提供的默认行为,可以用'reture false'来取消,但是这个方法对IE8及以下浏览器不起作用

1 setCapture() 对相关的事件进行捕获 ,IE支持

  1. -->当一个元素调用此方法时,这个元素将会把下一次所有的相关的事件捕获到自己的身上

2. releaseCapture() 取消对事件的捕获

  1. <style>
  2. #box1 {
  3. width: 100px;
  4. height: 100px;
  5. background-color: pink;
  6. position: absolute;
  7. }
  8. </style>
  9. <p>我不想移动</p>
  10. <div id="box1"></div>
  11. <!-- <div id="box2"></div> -->
  12. <script src="./common.js"></script>
  13. <script>
  14. let box1 = document.getElementById('box1');
  15. box1.onmousedown = function (event) {
  16. // 对鼠标按下相关的事件进行捕获(只对IE浏览器有效)
  17. box1.setCapture && box1.setCapture()
  18. event = event || window.event;
  19. // div的横坐标偏移量:鼠标.clentX - 元素.offsetLeft
  20. // div的纵坐标偏移量:鼠标.clentY - 元素.offsetTop
  21. let ol = event.clientX - box1.offsetLeft;
  22. let ot = event.clientY - box1.offsetTop;
  23. document.onmousemove = function (event) {
  24. event = event || window.event;
  25. let left = event.clientX - ol;
  26. let top = event.clientY -ot;
  27. // div的偏移量跟随鼠标移动
  28. box1.style.left = left + 'px';
  29. box1.style.top = top + 'px';
  30. }
  31. document.onmouseup = function () {
  32. document.onmousemove = null
  33. document.onmouseup = null
  34. // 取消事件的捕获(只对IE浏览器有效)
  35. box1.releaseCapture && box1.releasePointerCapture()
  36. }
  37. // 当我们全选鼠标按下的点击事件时,浏览器会自动选中与起无关的标签,需取消默认行为
  38. return false
  39. }
  40. </script>