div-drag.html 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .item {
  8. width: 100px;
  9. height: 100px;
  10. border: 1px solid black;
  11. display: inline-block;
  12. margin-right: 10px;
  13. text-align: center;
  14. line-height: 100px;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div class="sortable">
  20. <a class="item">Item 1</a>
  21. <div class="item">Item 2</div>
  22. <div class="item">Item 3</div>
  23. <a class="item">Item 4</a>
  24. <div class="item">Item 5</div>
  25. </div>
  26. <script>
  27. function setDrag(cssSelector) {
  28. function addNewStyle(newStyle) {
  29. let elementId = 'styles_js______';
  30. let styleElement = document.getElementById(elementId);
  31. if (!styleElement) {
  32. styleElement = document.createElement('style');
  33. styleElement.type = 'text/css';
  34. styleElement.id = elementId;
  35. document.getElementsByTagName('head')[0].appendChild(styleElement);
  36. }
  37. styleElement.appendChild(document.createTextNode(newStyle));
  38. }
  39. // 调用方式
  40. addNewStyle('.dragging { opacity: 0.5; } .over,.over * { background-color: red; }');
  41. let elements = document.querySelectorAll(cssSelector);
  42. for (let i = 0; i < elements.length; i++) {
  43. elements[i].setAttribute('draggable', 'true');
  44. }
  45. let draggingItem = null;
  46. let draggingIndex = -1;
  47. function handleDragStart(e) {
  48. draggingItem = this;
  49. draggingIndex = getIndex(this);
  50. e.dataTransfer.effectAllowed = 'move';
  51. e.dataTransfer.setData('text/html', this.innerHTML);
  52. this.classList.add('dragging');
  53. }
  54. function handleDragOver(e) {
  55. if (e.preventDefault) {
  56. e.preventDefault();
  57. }
  58. e.dataTransfer.dropEffect = 'move';
  59. return false;
  60. }
  61. function handleDragEnter(e) {
  62. this.classList.add('over');
  63. }
  64. function handleDragLeave(e) {
  65. this.classList.remove('over');
  66. }
  67. function handleDrop(e) {
  68. if (e.stopPropagation) {
  69. e.stopPropagation();
  70. }
  71. if (draggingItem !== this) {
  72. let dropIndex = getIndex(this);
  73. let parent = this.parentNode;
  74. if (draggingIndex < dropIndex) {
  75. parent.insertBefore(draggingItem, this.nextSibling);
  76. } else {
  77. parent.insertBefore(draggingItem, this);
  78. }
  79. items = document.querySelectorAll(cssSelector);
  80. [].forEach.call(items, function (item, index) {
  81. item.setAttribute('data-index', index);
  82. });
  83. }
  84. return false;
  85. }
  86. function handleDragEnd(e) {
  87. this.classList.remove('dragging');
  88. let items = document.querySelectorAll(cssSelector);
  89. [].forEach.call(items, function (item) {
  90. item.classList.remove('over');
  91. });
  92. }
  93. function getIndex(el) {
  94. let index = 0;
  95. let sibling = el;
  96. while (sibling != null) {
  97. sibling = sibling.previousElementSibling;
  98. index++;
  99. }
  100. return index - 1;
  101. }
  102. let items = document.querySelectorAll(cssSelector);
  103. [].forEach.call(items, function (item) {
  104. item.addEventListener('dragstart', handleDragStart, false);
  105. item.addEventListener('dragover', handleDragOver, false);
  106. item.addEventListener('dragenter', handleDragEnter, false);
  107. item.addEventListener('dragleave', handleDragLeave, false);
  108. item.addEventListener('drop', handleDrop, false);
  109. item.addEventListener('dragend', handleDragEnd, false);
  110. });
  111. }
  112. setDrag(".item")
  113. // notion-page-mention-token notion-text-mention-token
  114. </script>
  115. </body>
  116. </html>