Skip to content

拖拽元素 demo

统计信息:字数 2885 阅读6分钟

原生实现:

DIV上设置 dragable 属性,可以拖拽。

然后给被拖拽的元素上设置 onDragStart 事件,并把数据放在 set 到 dataTransfer 上面

然后在可以接受的元素上设置 onDrop 事件,并获取时间对象的属性 (dataTransfer)

可以拖拽数据,可以拖拽界面上的节点(appendChild)

React-dnd 组件也可以实现类似的功能,需要熟练使用

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="utf-8">
    <meta content="width=device-width, initial-scale=1.0" name="viewport">
    <meta content="ie=edge" http-equiv="X-UA-Compatible">
    <title>Document</title>
    </meta>
  </meta>
</meta>
<style>
  .wrapper {display: flex;border: 1px solid orangered;padding: 10px;}
  .col {border: 1px solid #808080;height: 500px;width: 200px;margin: 0 10px;padding: 10px;}
  .item {border: 1px solid #808080;margin: 5px 0;background-color:skyblue;}
  .item:first-child {background-color: pink;}
  .item:last-child {background-color: yellow;}
</style>
</head>
<body>
  <div class="wrapper">
    <div class="col1 col">
      <div class="item" draggable="true" id="item1">item1</div>
      <div class="item" draggable="true" id="item2">item2</div>
      <div class="item" draggable="true" id="item3">item3</div>
    </div>
    <div class="col2 col"></div>
    <div class="col3 col"></div>
    <div class="col4 col"></div>
  </div>
  <script>
    let cols = document.getElementsByClassName('col');   
    //这里演示的是三个div内部拖拽改变位置,并不是把桌面的文件拖拽上传
    for (let col of cols) {    
      col.ondragenter = e => {    
        console.log('放置元素 ondragenter', '<' + e.dataTransfer.getData('item') + '>');    
      }    
      col.ondragover = e => {    
        e.preventDefault();    
        console.log('放置元素 ondragover', '<' + e.dataTransfer.getData('item') + '>');    
      }    
      col.ondragleave = e => {    
        console.log('放置元素 ondragleave', '<' + e.dataTransfer.getData('item') + '>');    
      }    
      col.ondrop = function(e) {    
        console.log('放置元素 ondrop', '<' + e.dataTransfer.getData('item') + '>');    
        this.append(document.getElementById(e.dataTransfer.getData('item')));    
      }
    }    
    let items = document.getElementsByClassName('item');    
    for (let item of items) {    
      item.ondragstart = e => {    
        console.log('拖拽元素 ondragstart');    
        e.dataTransfer.setData('item', e.target.id);    
      }
      item.ondragend = e => {    
        console.log('拖拽元素 ondragend');    
      }
    }
  </script>
</body>
</html>

Last update: November 9, 2024