查看: 73|回复: 3

[文章教程] JavaScript拖拽效果演示和说明

[复制链接]
xuanxiao 发表于 2025-1-2 11:43:47 | 显示全部楼层 |阅读模式
HTML5 提供了原生的拖放功能,允许用户在网页上通过鼠标或其他指针设备拖动和放置元素。这组 API 可以应用于各种 HTML 元素

drag事件:在元素被拖动的过程中持续触发。可以用于实时更新一些视觉效果等,不过在实际应用中使用相对较少。

dragend:当拖动操作结束时触发,不管是成功放置还是中途取消。例如,可以在这个事件中清理一些在拖动过程中设置的临时状态。

dragenter:当被拖动的元素进入一个有效的放置目标时触发

dragover:当被拖动的元素在放置目标元素上方移动时触发。和dragenter一样,通常需要调用e.preventDefault()来允许放置操作。

drop:当被拖动的元素被放置到目标元素上时触发。这个事件用于处理放置后的逻辑,例如获取被拖动元素携带的数据并进行相应的操作

dragleave:当被拖动的元素离开一个放置目标时触发。例如,可以在这个事件中恢复放置目标元素在被拖动元素进入之前的视觉状态
ezgif-1-cb13258850.gif

  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>js拖拽</title>
  7.     <style>
  8.         .content {
  9.             display: flex;
  10.             width: 50%;
  11.             margin: 50px auto;
  12.         }

  13.         .box1 {
  14.             box-sizing: border-box;
  15.         }

  16.         .item {
  17.             width: 150px;
  18.             height: 40px;
  19.             color: #fff;
  20.             background-color: rgb(63, 127, 255);
  21.             margin: 0 0 10px 0;
  22.             text-align: center;
  23.             line-height: 40px;
  24.             cursor: pointer;
  25.         }

  26.         .box2 {
  27.             margin-left: 30px;
  28.         }

  29.         tr {
  30.             width: 100%;
  31.         }

  32.         td {
  33.             width: 150px;
  34.             height: 40px;
  35.         }
  36.     </style>
  37. </head>

  38. <body>
  39.     <div class="content">
  40.         <div class="box1">
  41.             <div draggable="true" class="item">数据一</div>
  42.             <div draggable="true" class="item">数据二</div>
  43.             <div draggable="true" class="item">数据三</div>
  44.             <div draggable="true" class="item">数据四</div>
  45.             <div draggable="true" class="item">数据5</div>
  46.         </div>

  47.         <div class="box2">
  48.             <table border="1">
  49.                 <tr>
  50.                     <td></td>
  51.                     <td></td>
  52.                     <td></td>
  53.                 </tr>
  54.                 <tr>
  55.                     <td></td>
  56.                     <td></td>
  57.                     <td></td>
  58.                 </tr>
  59.                 <tr>
  60.                     <td></td>
  61.                     <td></td>
  62.                     <td></td>
  63.                 </tr>
  64.                 <tr>
  65.                     <td></td>
  66.                     <td></td>
  67.                     <td></td>
  68.                 </tr>
  69.                 <tr>
  70.                     <td></td>
  71.                     <td></td>
  72.                     <td></td>
  73.                 </tr>
  74.                 <tr>
  75.                     <td></td>
  76.                     <td></td>
  77.                     <td></td>
  78.                 </tr>
  79.             </table>
  80.         </div>
  81.     </div>
  82. </body>


  83. <script>
  84.     // 实现拖拽左侧的div到右侧的表格中
  85.     var items = document.querySelectorAll('.item');
  86.     var tds = document.querySelectorAll('td');
  87.     var index = 0; // 记录当前拖拽的元素

  88.     // 给左侧的div添加拖拽事件
  89.     for (var i = 0; i < items.length; i++) {
  90.         // 给每个元素添加索引
  91.         items[i].ondragstart = function (e) {
  92.             e.dataTransfer.setData('text/plain', e.target.innerHTML);
  93.             e.dataTransfer.setData('text/plain', e.target.innerHTML);
  94.         }
  95.         // 记录当前拖拽的元素
  96.         items[i].ondragend = function (e) {
  97.             e.dataTransfer.setData('text/plain', e.target.innerHTML);
  98.             e.dataTransfer.setData('text/plain', e.target.innerHTML);
  99.         }
  100.     }

  101.     // 给右侧的td添加拖拽事件
  102.     for (var i = 0; i < tds.length; i++) {

  103.         // 这一步是必须的,阻止默认行为 否则ondrop事件不会触发
  104.         tds[i].ondragover = function (e) {
  105.             e.preventDefault();
  106.             // 已经有一个元素放置到td上了,则不执行
  107.             if (e.target.innerHTML) {
  108.                 return;
  109.             }
  110.             // 给当前td添加一个背景色 移动到td上时显示
  111.             e.target.style.backgroundColor = 'blue';
  112.         }

  113.         // 当鼠标离开td时,清除背景色
  114.         tds[i].ondragleave = function (e) {
  115.             // 已经有一个元素放置到td上了,则不执行
  116.             if (e.target.innerHTML) {
  117.                 return;
  118.             }
  119.             e.target.style.backgroundColor = '';
  120.         }

  121.         // ondrop事件可以获取到最终放置的元素
  122.         tds[i].ondrop = function (e) {
  123.             e.preventDefault();

  124.             // 已经有一个元素放置到td上了,则不执行
  125.             if (e.target.innerHTML) {
  126.                 return;
  127.             }

  128.             // 获取当前拖拽元素的值
  129.             var data = e.dataTransfer.getData('text/plain');
  130.             // 设置给当前td的值
  131.             e.target.innerHTML = data;
  132.             console.log(e.target.innerHTML);

  133.             // 获取当前被拖拽的元素的样式,然后添加给右侧的td
  134.             var style = window.getComputedStyle(items[index]);
  135.             e.target.style.backgroundColor = style.backgroundColor;
  136.             e.target.style.color = style.color;
  137.             e.target.style.border = style.border;
  138.             e.target.style.width = style.width;
  139.             e.target.style.height = style.height;
  140.             e.target.style.textAlign = style.textAlign;
  141.         }
  142.     }
  143. </script>

  144. </html>
复制代码
一往情僧 发表于 2025-1-3 08:22:26 | 显示全部楼层
有新帖,我必顶~
熊瑞 发表于 2025-1-3 09:57:03 | 显示全部楼层
不错!支持一下!
刘刘刘 发表于 2025-1-12 19:10:53 | 显示全部楼层
拖进可以,播出大家谁研究,如果与ASP数据库交互有知道的朋友么,学习一下。感谢分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表

在线客服

售前咨询
售后咨询
服务热线
023-58418553
微信公众号