简单讲述ondragstart、drag、ondragend、ondragenter、ondragover、ondrop、ondragleave七个与拖拽相关的监听事件,并运用实现拖拽过程放置样式变化

简介: 简单讲述ondragstart、drag、ondragend、ondragenter、ondragover、ondrop、ondragleave七个与拖拽相关的监听事件,并运用实现拖拽过程放置样式变化


事件 描述 监听对象
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>

基于下面的例子

image.png

进阶的玩法

image.png

用第三方插件实现表格的行拖拽排序

image.png


相关文章
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
|
5月前
|
JavaScript
vue 组件封装 | s-fullpage 全屏滚动 (内含绑定鼠标滑轮滚动事件、避免鼠标滑轮连续滚动、滑动过渡动画等实用技巧)
vue 组件封装 | s-fullpage 全屏滚动 (内含绑定鼠标滑轮滚动事件、避免鼠标滑轮连续滚动、滑动过渡动画等实用技巧)
130 4
|
5月前
|
JavaScript
vue实战——元素的拖拽 + 控制元素无法拖拽出盒子 + 随元素拖拽自适应变化大小的盒子
vue实战——元素的拖拽 + 控制元素无法拖拽出盒子 + 随元素拖拽自适应变化大小的盒子
57 1
|
5月前
|
JavaScript
vue 组件封装 | 随鼠标移动的信息框 (含监听鼠标移动、移出事件,获取元素的宽高、获取浏览器的宽高)
vue 组件封装 | 随鼠标移动的信息框 (含监听鼠标移动、移出事件,获取元素的宽高、获取浏览器的宽高)
53 1
|
7月前
|
JavaScript
vue中多组件调用,实现上下分屏,上下拖动
vue中多组件调用,实现上下分屏,上下拖动
222 0
|
前端开发 容器
封装React组件DragLine,鼠标拖拽的边框改变元素宽度
封装React组件DragLine,鼠标拖拽的边框改变元素宽度
187 0
|
算法 API C#
Winform控件优化之圆角按钮【各种实现中的推荐做法】(下)
最终优化实现ButtonPro按钮(继承自Button),既提供Button原生功能,又提供扩展功能,除了圆角以外,还实现了圆形、圆角矩形的脚尖效果、边框大小和颜色、背景渐变颜色...
2114 0
Winform控件优化之圆角按钮【各种实现中的推荐做法】(下)
|
7月前
|
JavaScript
【经典】原生JS实现“用鼠标拖拽(drag)内容DIV”,滚动条对应同步滚动
【经典】原生JS实现“用鼠标拖拽(drag)内容DIV”,滚动条对应同步滚动
|
7月前
【sgDragSize】自定义组件:自定义拖拽修改DIV尺寸组件,适用于窗体大小调整
【sgDragSize】自定义组件:自定义拖拽修改DIV尺寸组件,适用于窗体大小调整
|
容器
uniapp滚动页面改变背景颜色
uniapp滚动页面改变背景颜色
405 0