当前位置: 首页 > article >正文

使用原生HTML的drag实现元素的拖拽

请添加图片描述

HTML 拖放Drag and Drop)接口使应用程序能够在浏览器中使用拖放功能。例如,用户可使用鼠标选择可拖拽(draggable)元素,将元素拖拽到可放置(droppable)元素,并释放鼠标按钮以放置这些元素。拖拽操作期间,会有一个可拖拽元素的半透明快照跟随着鼠标指针。🔍MDN: HTML 拖放 API

1.draggable 属性:设置元素可以拖拽。true 表示元素可以被拖动,false 表示元素不可以被拖动。

注意:像 <img draggable> 这样的简写是不允许的。正确的用法是 <img draggable="true">

2.@dragstart:在拖拽开始时,将当前拖拽项的索引存储到 draggedIndex,并设置拖拽光标的效果为 move。更新 draggedIndex 实现拖拽过程中的预览。

3.@dragover.prevent:当拖拽项经过其他项时,通过 splice 方法将当前拖拽项临时移除并插入到新的位置。

4.@drop:当拖拽放置完成时,draggedIndex 被重置,以防止任何临时变化影响最终顺序。

案例代码:
请添加图片描述

<template>
  <div class="drag-container">
    <div
      v-for="(item, index) in items"
      :key="item.id"
      class="draggable-item"
      draggable="true"
      :class="{ selected: index === draggedIndex }"
      @dragstart="onDragStart($event, index)"
      @dragover.prevent="onDragOver(index)"
      @drop="onDrop(index)"
    >
      {{ item.name }}
    </div>
  </div>
</template>

<script setup>
import { ref } from "vue";

// 定义拖拽的数据
const items = ref([
  { id: 1, name: "项 1" },
  { id: 2, name: "项 2" },
  { id: 3, name: "项 3" },
  { id: 4, name: "项 4" },
]);

// 用于存储当前被拖拽的元素的索引
const draggedIndex = ref(null);

// 拖拽开始事件
const onDragStart = (event, index) => {
  draggedIndex.value = index;
  //   设置拖拽光标效果
  event.dataTransfer.effectAllowed = "move";
  console.log(`开始拖拽: ${items.value[index].name}`);
};

// 拖拽经过目标时,临时预览排序效果
const onDragOver = (index) => {
  if (draggedIndex.value !== null && draggedIndex.value !== index) {
    //用 splice 方法将拖拽的项从原来的位置移除,并插入到新的位置
    const draggedItem = items.value.splice(draggedIndex.value, 1)[0];
    // 将 draggedItem 插入到 items 数组的 index 位置,从而实现排序的效果。
    items.value.splice(index, 0, draggedItem);
    // 更新 draggedIndex 以匹配新的位置
    draggedIndex.value = index;
  }
};

// 拖拽放置事件
const onDrop = (index) => {
  // 拖拽完成后将索引重置
  draggedIndex.value = null;
  console.log(`放置到: ${items.value[index].name}`);
};
</script>

<style scoped>
.drag-container {
  margin-left: 30px;
  width: 100px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-top: 20px;
}

.draggable-item {
  padding: 10px;
  background-color: #4caf50;
  color: white;
  cursor: grab;
  text-align: center;
}
/* 选中的拖拽项样式 */
.selected {
  border: 2px dashed #ff9800;
}
</style>

在vue中还可以使用第三方库vuedraggable 来实现拖拽:🔍vue3使用vuedraggable实现拖拽(有过渡)


http://www.kler.cn/news/308124.html

相关文章:

  • Linux C execv/execl函数调用 bash -c
  • 【疑难杂症2024-005】docker-compose中设置容器的ip为固定ip后,服务无法启动
  • supermap iclient3d for cesium中entity使用
  • 【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的?
  • 常用压接线端子教程
  • 力扣爆刷第176天之贪心全家桶(共15道题)
  • Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 内存分配和回收规则
  • Linux 基础入门操作-实验二 makefile使用介绍 和 实验三 hello 输出
  • 【计算机网络】HTTP相关问题与解答
  • 深度学习:入门简介
  • ESP01的AT指令连接到阿里云平台
  • 春日教育技术:SpringBoot在线视频教学
  • Vue3: setup语法糖
  • Sass实现文字两侧横线及Sass常用方案
  • 微服务下设计一个注解标识是否需要登录
  • Maven入门学习笔记
  • 数据结构——“二叉搜索树”
  • Python和R均方根误差平均绝对误差算法模型
  • 监听RabbitMQ,向Elasticsearch 创建索引
  • python selenium网页操作
  • C++笔记---二叉搜索树
  • 动手学深度学习(pytorch)学习记录31-批量规范化(batch normalization)[学习记录]
  • C++基础面试题 | C++中的构造函数可以是虚函数吗? C++中的析构函数一定要是虚函数吗?
  • SpringBoot 消息队列RabbitMQ消息的可靠性 配置连接重试 生产者重连
  • 医学数据分析实训 项目三 关联规则分析作业--在线购物车分析--痹症方剂用药规律分析
  • 科技赋能司法:易保全如何重塑法律文书签署与庭审流程
  • yjs07——numpy数组的使用
  • 【Linux】-基本指令(上)
  • 7-16 一元多项式求导(vector)
  • Linux - iptables防火墙