事件 | 描述 | 监听对象 |
ondragstart | 该事件在用户开始拖动元素时触发 | 被拖拽物体 |
drag | 该事件在元素正在拖动时触发 | 被拖拽物体 |
ondragend | 该事件在用户完成元素的拖动时触发 | 被拖拽物体 |
ondragenter | 该事件在拖动的元素进入放置目标时触发 | 放入的区域 |
ondragover | 该事件在拖动元素在放置目标上时触发 | 放入的区域 |
ondrop | 该事件在拖动元素放置在目标区域时触发 | 放入的区域 |
ondragleave | 该事件在拖动元素离开放置目标时触发 | 放入的区域 |
<template> <div :class="$options.name"> <div class="drag" draggable @dragstart="dragstart" @drag="drag" @dragend="dragend" >被拖拽物体</div> <div class="drop" @dragover="$event.preventDefault()" @dragenter="dragenter" @drop="drop" @dragleave="dragleave" >放入的位置1</div> <div class="drop" @dragover="$event.preventDefault()" @dragenter="dragenter" @drop="drop" @dragleave="dragleave" >放入的位置2</div> </div> </template> <script> export default { name: "testDrag", methods: { // 被拖拽物体的监听事件---------------------------------------- dragstart(e) { let 需要传输的内容 = { cssText: `background-color: #F56C6C;color: white;font-size: 24px;`, text: `物体被放进来了`, }; e.dataTransfer.setData("自定义字段名", JSON.stringify(需要传输的内容)); }, drag(e) { e.currentTarget.setAttribute("drag", true); }, dragend(e) { e.currentTarget.removeAttribute("drag"); }, // 放置区域的监听事件---------------------------------------- dragenter(e) { e.currentTarget.setAttribute("dragenter", true); }, drop(e) { e.currentTarget.removeAttribute("dragenter"); let 需要传输的内容 = JSON.parse(e.dataTransfer.getData("自定义字段名")); e.currentTarget.style.cssText = 需要传输的内容.cssText; e.currentTarget.innerHTML = 需要传输的内容.text; }, dragleave(e) { e.currentTarget.removeAttribute("dragenter"); }, }, }; </script> <style lang="scss" scoped> .testDrag { .drag { width: 100px; height: 100px; box-sizing: border-box; border: 1px solid #eee; display: flex; justify-content: center; align-items: center; position: relative; &[drag] { color: #f56c6c; border-color: #f56c6c; &::after { content: "拖拽中"; position: absolute; right: 0; top: 0; background-color: #f56c6c; color: white; font-size: 14px; } } } .drop { margin-top: 20px; width: 200px; height: 200px; box-sizing: border-box; border: 1px solid #eee; display: flex; justify-content: center; align-items: center; flex-direction: column; position: relative; &[dragenter] { color: #f56c6c; border-color: #f56c6c; &::after { content: "物体进入区域"; position: absolute; right: 0; top: 0; background-color: #f56c6c; color: white; font-size: 14px; } } } } </style>
基于下面的例子
进阶的玩法
用第三方插件实现表格的行拖拽排序