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

使用原生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"><divv-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实现拖拽(有过渡)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【RAG】RAG再进化?基于长期记忆的检索增强生成新范式-MemoRAG
  • kitti数据深度图转点云坐标计算方法与教程(代码实现)
  • 关于Spring Cloud Gateway中 Filters的理解
  • 逻辑模型/物理模型
  • Flutter启动无法运行热重载
  • 部署opengauss5.0.3,细节满满
  • 力扣最热一百题——螺旋矩阵
  • 18063 圈中的游戏
  • C/C++语言基础--从C到C++的不同(上)
  • ListBox显示最新数据、左移和右移操作
  • 对中文进行文本分类的常用方法
  • openssl+keepalived安装部署
  • GPT-4论文阅读
  • 9.15 BFS中等 133 Clone Graph review 138 随机链表的复制
  • TikTok商家如何通过真人测评提高流量和销量?
  • [nginx文档翻译系列] 控制nginx
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Go 语言编译器的 //go: 详解
  • windows下使用nginx调试简介
  • Zepto.js源码学习之二
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 深入浏览器事件循环的本质
  • 学习笔记:对象,原型和继承(1)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 优化 Vue 项目编译文件大小
  • 优秀架构师必须掌握的架构思维
  • ​数据结构之初始二叉树(3)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (14)Hive调优——合并小文件
  • (3)(3.5) 遥测无线电区域条例
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (八十八)VFL语言初步 - 实现布局
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (转)visual stdio 书签功能介绍
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .bat批处理(六):替换字符串中匹配的子串
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 5种线程安全集合
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net core 6 redis操作类
  • .NET MVC之AOP
  • .net 中viewstate的原理和使用
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .Net7 环境安装配置
  • .net和jar包windows服务部署
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • //解决validator验证插件多个name相同只验证第一的问题
  • ??eclipse的安装配置问题!??
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)