基础用法
1、官网代码
1 2 3 4
| <div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<img loading="lazy" id="drag1" src="/images/logo.png" draggable="true" ondragstart="drag(event)" width="336" height="69">
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function allowDrop(ev) { ev.preventDefault(); } function drag(ev) { ev.dataTransfer.setData("Text",ev.target.id); } function drop(ev) { ev.preventDefault(); var data=ev.dataTransfer.getData("Text"); ev.target.appendChild(document.getElementById(data)); }
|
代码解释:
- 调用 preventDefault() 来避免浏览器对数据的默认处理(drop 事件的默认行为是以链接形式打开)
- 通过 dataTransfer.getData(“Text”) 方法获得被拖的数据。该方法将返回在 setData() 方法中设置为相同类型的任何数据。
- 被拖数据是被拖元素的 id (“drag1”)
- 把被拖元素追加到放置元素(目标元素)中
鼠标默认显示
1、效果描述
一个课表,每个格子都是一个课程。拖到空白元素的可新增,而有课程的地方需要显示禁选。理想效果如下图:

2、代码:
1 2 3 4 5 6 7 8
| allowDrop(e, week, index, id) { if (!week) { e.preventDefault(); } }
|
拖动中样式设置
1、效果描述
拖动过程中,我希望我能知道我现在悬停在哪个元素上。实现效果如下:

2、实现思路
dragover事件监听的其实是被拖到的位置,于是可以在dragover事件中获取当前元素,给它一个标记。
由于我的代码是用vue循环得出,于是我给了一个下标值标记。
伪代码如下:
1 2 3 4 5 6 7 8 9 10
| <!-- dragHoverIndex 代表当前悬浮的元素 drag-hover-cell 为悬浮元素的样式 --> <td v-for="(week, wi) in d.arrangeList" :key="'daily_week_'+wi" :class="{'drag-hover-cell': dragHoverIndex === (wi + '_' + d.id)}"" class="course-cell has-class" @drop="drop($event, d, wi)" @dragover="allowDrop($event, week, wi, d.id)" > ... </td>
|
1
| .drag-hover-cell{border: 1px solid #409EFF;}
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| allowDrop(e, week, index, id) { if (!week) { e.preventDefault(); this.dragHoverIndex = index + "_" + id; } else { this.dragHoverIndex = -1; } }
|