关于拖拽demo

79 阅读1分钟
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Drag and Drop Example</title>
    <style>
      
        .content{
            width: 200px;
            height: 200px;
            border:1px solid red;
        }
        .item{
            width:100px;
            height: 100px;
            border:1px solid red
        }
        .hello{
            width: 150px;
            height: 150px;
            border: 1px solid red;
        }
        .drop-over{
             background-color: blue;
        }
    </style>
</head>
data-drop="copy"表示可以接受元素copy
<div class="container">
    <div draggable="true" data-effect='move' class="item">one</div>
    <div draggable="true" data-effect='move'  class="item">two</div>
    <div draggable="true" data-effect='move' class="item">three</div>
  <div style="display: flex;">

     <div  class="hello" data-drop="copy">copy</div>
     <div  class="hello" data-drop="copy">copy</div>

      <div class="hello"  data-drop="move" >move</div>
      <div class="hello" data-drop="move">move</div>
  </div>
</div>

 <div draggable="true">draggable</div>
<script>
    const container=document.querySelector('.container')
    let source
    container.ondragstart=(e)=>{//这个表示开始拖拽
       // e.preventDefault()
       source=e.target//当前的目标元素
      // e.dataTransfer.effectAllowed='move' //表示 移动
       e.dataTransfer.effectAllowed=e.target.dataset.effect;
    }
    container.ondragover=function(e){
        e.preventDefault()
      //  console.log('over',e.target)
    }
    function clearDropOver(){
        let node= document.querySelectorAll('.drop-over')
        node.forEach(node=>{
            node.classList.remove('drop-over')
        })
    }
    //找到有data-drop的节点
    function getDropNode(node){
        while(node){
            if(node.dataset&& node.dataset.drop){
                return node
            }
            node=node.parentNode
        }
    }
    container.ondragenter=function(e){
        clearDropOver()
        //const dropNode=e.target
        const dropNode=getDropNode(e.target)
        if(dropNode && dropNode.dataset.drop==e.dataTransfer.effectAllowed){
            //表示这个元素接受拖拽的节点
            dropNode.classList.add('drop-over')
        }
    }
     container.ondrop = function (e) {
        clearDropOver()
         //const dropNode=e.target
         const dropNode = getDropNode(e.target) //找到那个可以接收的容器
         if (dropNode && dropNode.dataset.drop == e.dataTransfer.effectAllowed) {
            if(dropNode.dataset.drop=='move'){
                dropNode.innerHTML=''
                const clone=source.cloneNode(true)
                clone.dataset.effect='copy'
                dropNode.appendChild(clone)
            }else{
               source.remove()
            }
         }
    }
</script>
<body>