css
.container{
display: flex;
}
.container .table{
margin-left: 50px;
border: 1px solid #f5f5f5;
}
.dropBGC{
background-color: blue;
}
html
<h1>课程表</h1>
<div class="container">
<div data-drop="move">
<div data-effect="copy" draggable="true">语文</div>
<div data-effect="copy" draggable="true">数学</div>
<div data-effect="copy" draggable="true">英语</div>
<div data-effect="copy" draggable="true">音乐</div>
<div data-effect="copy" draggable="true">政治</div>
</div>
<div>
<table border="1">
<colgroup>
<col/>
<col/>
<col/>
<col/>
</colgroup>
<thead>
<tr>
<td></td>
<th>星期一</th>
<th>星期二</th>
<th>星期三</th>
<th>星期四</th>
<th>星期五</th>
</tr>
</thead>
<tbody>
<tr>
<th >上午</th>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
</tr>
<tr>
<th>下午</th>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
<td data-drop="copy"></td>
</tr>
</tbody>
</table>
</div>
</div>
js:
const container = document.querySelector('.container')
let source
container.ondragstart = (e) =>{
e.dataTransfer.effectAllowed = e.target.dataset.effect
source= e.target
}
container.ondragover = e=>{
e.preventDefault()
}
function clearDropStyle(){
const dropNodes = document.querySelectorAll('.dropBGC')
dropNodes.forEach(node=>{
node.classList.remove('dropBGC')
})
}
function getDropNode(node){
while(node){
if(!node.dataset.drop){
return node = node.parentNode
}
return node
}
}
container.ondragenter = e=>{
clearDropStyle()
const dropNode = getDropNode(e.target)
if(!dropNode){
return
}
if(e.dataTransfer.effectAllowed === dropNode.dataset.drop){
dropNode.classList.add('dropBGC')
}
}
function removeAllChild(node){
while(node.hasChildNodes())
{
node.removeChild(node.firstChild);
}
}
container.ondrop = e=>{
clearDropStyle()
const dropNode = getDropNode(e.target)
if(!dropNode){
return
}
if(e.dataTransfer.effectAllowed !== dropNode.dataset.drop){
return;
}
if(dropNode.dataset.drop === 'copy'){
removeAllChild(dropNode)
dropNode.innerHtml=''
const cloned = source.cloneNode(true)
cloned.dataset.effect='move'
dropNode.appendChild(cloned)
}else{
dropNode.innerHtml=''
source.remove()
}
}