js 拖拽事件

拖放API基础

作用于被拖放元素的事件

dragstart 开始拖拽时触发。

drag 在拖拽的过程中触发。

dragend 拖拽完成时触发。

作用于目标元素的事件

dragenter 拖放元素进入目标元素时触发。

dragover 拖放元素在目标元素上时触发。

dragleave 拖放元素在目标元素上离开时触发(在目标元素上时如果松开鼠标也会触发)。

drop 被拖放的元素在目标元素上同时鼠标放开触发的事件。【注:需要阻止dragover的默认行为才会触发drop事件】

被拖拽的元素一定要有 draggable="true" 属性,才能被拖动。

示例

实现简单的拖拽事件(将一个 div 中的内容拖拽到另一个 div ),被拖放元素需要 dragstart、dragend 这两个事件;目标元素需要 dragover、dragenter、drop 事件。

<template>
  <div>
    <div class="page">
      <!-- 被拖拽元素 -->
      <div>
        <ul
          v-for="(item, index) in left"
          :key="index"
          draggable="true"
          @dragstart="dragstart(index)"
          @dragend="dragend"
          class="box"
        >
          <li>{{ item }}</li>
        </ul>
      </div>
      
      <!-- 目标元素 -->
      <div>
        <div
          @dragover="dragover($event)"
          @dragenter="dragenter($event, index)"
          @drop="drop($event, index)"
          v-for="(item, index) in right"
          :key="index"
          class="divBox"
        >
          {{ item.value }}
        </div>
      </div>
    </div>
  </div>
</template>
<script lang="ts">
import { toRefs, reactive, onMounted, defineComponent, watch } from "vue";
export default defineComponent({
  name: "demo",
  components: {},
  setup() {
    const state = reactive({
      left: ["aaa", "bbb"],
      right: [
        {
          style: "",
          value: "",
        },
        {
          style: "",
          value: "",
        },
        {
          style: "",
          value: "",
        },
      ],
      leftIndex: 0,
      rightIndex: 0,
    });

    const dragstart = (index) => {
      state.leftIndex = index;
    };

    const dragenter = (e, index) => {
      e.preventDefault();
      state.rightIndex = index;
    };

    const drop = (e, index) => {
      if (state.rightIndex == index) {
        dealData();
      }
    };

    const dragover = (e) => {
      e.preventDefault();
    };

    const dealData = () => {
      state.right[state.rightIndex].value = state.left[state.leftIndex];
    };

    return {
      dragstart,
      dragenter,
      drop,
      dragover,
      ...toRefs(state),
    };
  },
});
</script>
<style scoped lang="scss">
.page {
  width: 800px;
  margin: 0 auto;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.box {
  width: 200px;
  height: 100px;
  border: 1px solid #eeeeee;
}
.divBox {
  width: 300px;
  height: 200px;
  border: 1px solid #eeeeee;
}
</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值