拖拽属性

**

针对对象 事件名称 说明
被拖动的元素 dragstart 开始被拖动触发,不是元素图形进行目标区域触发的,是鼠标指针进入时才触发的
drag 拖动时反复触发
dragend 拖拽完成时
目标对象 dragenter 进入目标对象
dragover 目标对象内
dragleave 拖动元素没有被放下就离开目标元素
drop 在目标元素放下(需要取消浏览器默认行为)


备注:方法中需要在加上 on 例如 **ondragstart.

所有的标签元素,当拖拽周期结束时,默认事件是回到原处。
阻止浏览器的默认行为,e.preventDefault()。
**



默认带拖拽属性**
a img 标签

拖拽的生命周期
1.拖拽开始,拖拽进行中,拖拽结束
2.被拖拽的物体,目标区域

clientX
clientY

简单实现 (注:pc端 移动端下面无法实现

  1. <style>
  2. .a{
  3. position: absolute;
  4. }
  5. </style>
  6. <body>
  7. <div class="a" draggable="true"></div>
  8. <!--
  9. 按下物体的瞬间是不会触发事件的
  10. -->
  11. <script>
  12. var oDrageDiv = document.getElementsByClassName("a")[0]
  13. var beginX = 0
  14. var beginY = 0
  15. oDrageDiv.ondragstart = function (e) {
  16. // console.log(e)
  17. beginX = e.clientX
  18. beginY = e.clientY
  19. }
  20. // oDrageDiv.ondrag = function(e){
  21. // console.log(e)
  22. // }
  23. oDrageDiv.ondragend = function (e) {
  24. // console.log(e)
  25. var x = e.clientX - beginX
  26. var y = e.clientY - beginY
  27. oDrageDiv.style.left = oDrageDiv.offsetLeft + x + "px"
  28. oDrageDiv.style.top = oDrageDiv.offsetTop + y + "px"
  29. }
  30. </script>
  31. </body>

例子实现

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. <style>
  8. *{
  9. margin: 0;
  10. padding: 0;
  11. }
  12. .box1 {
  13. position: absolute;
  14. width: 150px;
  15. height: auto;
  16. border: 1px solid black;
  17. padding-bottom: 10px;
  18. }
  19. .box2 {
  20. position: absolute;
  21. width: 150px;
  22. min-height:100px ;
  23. border: 1px solid black;
  24. padding-bottom: 10px;
  25. left: 300px;
  26. }
  27. li {
  28. position: relative;
  29. width: 100px;
  30. height: 30px;
  31. background: #abcdef;
  32. margin: 10px auto;
  33. list-style: none;
  34. }
  35. </style>
  36. </head>
  37. <body>
  38. <div class="box1">
  39. <ul>
  40. <li>1</li>
  41. <li>2</li>
  42. <li>3</li>
  43. </ul>
  44. </div>
  45. <div class="box2"></div>
  46. <script>
  47. var dragDom;
  48. var liList = document.getElementsByTagName("li")
  49. for(var i=0;i<liList.length;i++){
  50. liList[i].setAttribute("draggable",true)
  51. liList[i].ondragstart = function(e){
  52. dragDom = e.target
  53. console.log(e)
  54. }
  55. }
  56. var box2 = document.getElementsByClassName("box2")[0]
  57. box2.ondragover = function(e){
  58. e.preventDefault();
  59. }
  60. box2.ondrop = function(e){
  61. console.log(e)
  62. box2.appendChild(dragDom)
  63. dragDom = null
  64. }
  65. var box1 = document.getElementsByClassName("box1")[0]
  66. box1.ondragover = function(e){
  67. e.preventDefault();
  68. }
  69. box1.ondrop = function(e){
  70. box1.appendChild(dragDom)
  71. dragDom = null
  72. }
  73. </script>
  74. </body>
  75. </html>

http://jartto.wang/2017/10/23/html5-drag/

https://juejin.im/post/6844904040711585799

符合题意但是无法实现
原因:移动端不支持这个事件
https://segmentfault.com/a/1190000014572113