【JS】1724- 重学 JavaScript API - Drag and Drop API

news2025/1/9 1:27:04

559ec1323161c7475198f7f1b2f428cb.jpeg

前期回顾:

1. Page Visibility API

2. Broadcast Channel API

3. Beacon API

4. Resize Observer API

5. Clipboard API

6. Fetch API

7. Performance API

8. WebStorage API

9. WebSockets API

10. Fullscreen API

11. Geolocation API

🏝 1. 快速入门

1.1 概念介绍

HTML 拖放 API (Drag and Drop[1])用于在网页中实现拖放功能。通过拖放 API,我们可以实现将可拖拽(draggable)元素拖动到另一个可放置(droppable)元素,以及实现交互式的拖放体验。这个 API 提供了一系列的事件和方法,使我们能够轻松地处理拖放操作。

1.2 作用和使用场景

拖放 API 作用在于使网页具备拖放功能,为用户提供更直观、灵活的交互体验。这里介绍几个常见的使用场景:

  • 相册应用中,用户可以拖动图片到不同的分组或标签中进行分类;

  • 项目任务管理应用中,用户可以拖动任务卡片进行排序或分组;

  • 文件上传功能中,用户可以将文件拖动到指定区域进行上传;

  • 游戏中的元素拖放操作,如棋盘游戏中的棋子移动等。

拖放 API 的灵活性和易用性使得它成为开发者们构建交互性强大的网页应用程序的理想选择。

🎨 2. 如何使用

使用拖放 API 主要包括以下 3 个步骤:

  1. 「定义可拖拽的(draggable)元素」:将需要拖动的元素标记为可拖拽,并指定相应的事件处理逻辑。

  2. 「定义可放置的(droppable)元素」:将用来放置被拖动元素的目标区元素标记为可放置,并指定相应的事件处理逻辑。

  3. 「处理拖放事件」:根据需要,处理「可拖拽元素」和放置目标的事件,例如拖动开始(dragstart[2])、拖动过程中(drag[3])、拖动结束(dragend[4])以及放置操作(drop[5])等。

下面是一个简单的示例代码,演示了如何使用拖放 API :

// 定义可拖拽的元素
const dragSource = document.getElementById("drag-source");
dragSource.addEventListener("dragstart", (event) => {
  event.dataTransfer.setData("text/plain", event.target.id);
});

// 定义可放置的元素
const dropTarget = document.getElementById("drop-target");
dropTarget.addEventListener("dragover", (event) => {
  event.preventDefault();
});
// 处理放置事件
dropTarget.addEventListener("drop", (event) => {
  event.preventDefault();
  const data = event.dataTransfer.getData("text/plain");
  const draggedElement = document.getElementById(data);
  dropTarget.appendChild(draggedElement);
});

在这个示例中,我们通过分别将元素 drag-sourcedrop-target 设置为可拖拽元素和可放置元素,冰分别监听 dragstartdragover事件,添加相应的处理逻辑,实现了一个简单的拖放操作。当拖动 drag-source 元素时,使用 event.dataTransfer.setData() 方法设置了拖动数据,而放置目标元素时,执行 drop事件监听的回调方法,实现被拖动的元素添加到可放置元素底下。

🧭 3. 实际应用

拖放 API 在实际应用中有许多用途。下面是一些常见的实际应用场景:

3.1 图片库应用程序

在相册应用中,用户可以拖动图片到不同的分组或标签中进行分类和管理。下面是一个简单的示例代码,演示了如何使用拖放 API 实现图片库的拖放功能:

<style>
  .album {
    display: flex;
    justify-content: space-between;
    margin-bottom: 20px;
  }
  .album img {
    width: 150px;
    height: 150px;
    object-fit: cover;
    cursor: move;
  }
  .highlight {
    border-color: #ff0000;
  }
</style>
</head>
<body>
<div id="album-1" class="album">
  <img id="photo-1" draggable="true" alt="Photo 1"
    src="https://th.bing.com/th/id/OIG.m8Fs4GYEDFhEHVFLHPSv?pid=ImgGn"
  />
  <img id="photo-2" draggable="true" alt="Photo 2"
    src="https://th.bing.com/th/id/OIG.5eGiRmmq0t8jdtIzNjL6?pid=ImgGn"
  />
</div>

<div id="album-2" class="album">
  <img id="photo-3" draggable="true" alt="Photo 3"
    src="https://th.bing.com/th/id/OIG.D4dUFPI0FNTcK5qlrc3b?pid=ImgGn"
  />
  <img id="photo-4" draggable="true" alt="Photo 4"
    src="https://th.bing.com/th/id/OIG.oJmwyH4Eobphjk0qtZxz?pid=ImgGn"
  />
</div>

<script>
  const albums = document.querySelectorAll(".album");
  albums.forEach((album) => {
    album.addEventListener("dragstart", (event) => {
      event.dataTransfer.setData("text/plain", event.target.id);
      event.target.classList.add("highlight");
    });

    album.addEventListener("dragend", (event) => {
      event.target.classList.remove("highlight");
    });

    album.addEventListener("dragover", (event) => {
      event.preventDefault();
      album.classList.add("highlight");
    });

    album.addEventListener("dragleave", () => {
      album.classList.remove("highlight");
    });

    album.addEventListener("drop", (event) => {
      event.preventDefault();
      album.classList.remove("highlight");
      const photoId = event.dataTransfer.getData("text/plain");
      const photo = document.getElementById(photoId);
      const clonedPhoto = photo.cloneNode(true);
      album.appendChild(clonedPhoto);
    });
  });
</script>

在这个示例中,我们创建了两个相册容器(「album-1」「album-2」),每个相册容器中包含了一些可拖动的图片元素。当拖动图片时,我们使用 dragstart 事件将图片的 ID 存储在 dataTransfer 对象中。在放置目标容器上,我们使用 dragover 事件阻止默认行为并添加一些过渡样式,使用 dragleave 事件移除过渡样式,使用 drop 事件在放置目标容器中追加拖动的图片元素。通过这样的实现,用户可以轻松地将图片拖动到不同的相册中进行分类和管理。

3.2 项目任务管理应用

在项目任务管理应用中,用户可以通过拖动任务卡片进行排序、分组或更改任务状态。下面是一个简单的示例代码,演示了如何使用拖放 API 实现项目任务管理应用中的拖放功能:

<div id="task-list">
  <div class="task" draggable="true">任务 1</div>
  <div class="task" draggable="true">任务 2</div>
  <div class="task" draggable="true">任务 3</div>
</div>
<script>
  // 定义拖动源
  const draggableTasks = document.querySelectorAll(".task");
  draggableTasks.forEach((task) => {
    task.addEventListener("dragstart", (event) => {
      event.dataTransfer.setData("text/plain", event.target.innerText);
    });
  });

  // 定义放置目标
  const taskList = document.getElementById("task-list");
  taskList.addEventListener("dragover", (event) => {
    event.preventDefault();
    taskList.classList.add("highlight");
  });
  taskList.addEventListener("dragleave", () => {
    taskList.classList.remove("highlight");
  });
  taskList.addEventListener("drop", (event) => {
    event.preventDefault();
    taskList.classList.remove("highlight");
    const taskName = event.dataTransfer.getData("text/plain");
    const task = document.createElement("div");
    task.innerText = taskName;
    task.classList.add("task");
    taskList.appendChild(task);
  });
</script>

在上述示例中,我们创建了一个任务列表容器(task-list),其中包含了几个可拖动的任务卡片。当拖动任务卡片时:

  • 使用 dragstart 事件将任务名称存储在 dataTransfer 对象中;

  • 使用 dragover 事件阻止默认行为并添加视觉反馈;

  • 使用 dragleave 事件移除视觉反馈;

  • 使用 drop 事件在任务列表容器中创建新的任务卡片。

通过这样的实现,用户可以通过拖动任务卡片来进行排序、分组或更改任务状态。

3.3 页面生成器

拖放 API 在页面生成器应用程序中也有广泛的应用,尤其是海报设计器、低代码平台等。页面生成器允许用户通过拖放组件来创建自定义的网页布局和内容。下面是一个完整示例代码,演示了如何使用拖放 API 实现页面生成器中的拖放功能:

<style>
  #canvas {
    border: 2px dashed #ccc;
    padding: 10px;
    min-height: 200px;
    margin-bottom: 20px;
  }
  .component {
    background-color: #f0f0f0;
    padding: 10px;
    margin-bottom: 10px;
    cursor: move;
  }
  #page {
    border: 2px solid #ccc;
    padding: 20px;
    min-height: 200px;
  }
  .highlight {
    border-color: #ff0000;
  }
</style>

<div id="canvas">
  <div class="component" draggable="true">文本组件</div>
  <div class="component" draggable="true">图片组件</div>
  <div class="component" draggable="true">按钮组件</div>
</div>

<div id="page">
  <h1>我的页面</h1>
</div>

<script>
  // 定义拖动源
  const draggableComponents = document.querySelectorAll(".component");
  draggableComponents.forEach((component) => {
    component.addEventListener("dragstart", (event) => {
      event.dataTransfer.setData("text/plain", event.target.innerText);
    });
  });

  // 定义放置目标
  const page = document.getElementById("page");
  page.addEventListener("dragover", (event) => {
    event.preventDefault();
    page.classList.add("highlight");
  });
  page.addEventListener("dragleave", () => {
    page.classList.remove("highlight");
  });
  page.addEventListener("drop", (event) => {
    event.preventDefault();
    page.classList.remove("highlight");
    const componentName = event.dataTransfer.getData("text/plain");
    const component = document.createElement("div");
    component.innerText = componentName;
    component.classList.add("component");
    page.appendChild(component);
  });
</script>

📋 4. 兼容性和优缺点

4.1 兼容性

以下是 Channel Messaging API 的兼容性列表,包含了主流浏览器及其支持的最低版本:

  • Chrome 4+✅

  • Firefox 3.5+✅

  • Safari 3.1+✅

  • Edge 12+✅

  • Opera 12.1+✅

  • IE 6+✅9f1cef733a0bb44de3e631d7677da955.png

也可以在 caniuse.com[6] 上查看具体的兼容性信息。

4.2 优缺点

拖放 API 有以下优点和缺点:优点:

  • 提供了直观、灵活的拖放功能,提高用户体验。

  • 可以轻松实现拖放排序、文件上传等常见交互操作。

  • 提供了丰富的事件和方法,使开发者可以自定义拖放行为。

缺点:

  • 在某些较旧的浏览器中可能存在兼容性问题。

  • 拖放操作可能受到设备的限制,如移动设备上的触摸操作。

  • 需要一定的学习成本和开发时间来理解和实现。

4.3 工具推荐

以下是 5 个推荐的工具,可辅助您在使用拖放 API 进行开发时提高效率:

  1. Sortable[7]: 27k⭐,可拖放排序库,具有丰富的自定义选项和事件。Reorderable drag-and-drop lists for modern browsers and touch devices. No jQuery or framework required.

  2. dragula[8]: 21.6kk⭐,简化拖放操作的 JavaScript 库,浏览器支持包括所有常用浏览器和**IE7+**,框架支持包括 vanilla JavaScript,Angular 和 React。👌 Drag and drop so simple it hurts

  3. React DnD[9]: 19.3k⭐,适用于 React 的强大拖放库。Drag and Drop for React.

  4. Vue.Draggable[10]: 18.9k⭐, Vue.js 的拖放组件,提供了易用的拖放功能。Vue component (Vue.js 2.0) or directive (Vue.js 1.0) allowing drag-and-drop and synchronization with view model array.

通过使用这些工具,您可以简化拖放操作的实现,并提高开发效率。

🎯 5. 使用建议和注意事项

以下是一些建议和注意事项:

  • 了解不同浏览器对拖放 API 的支持情况,并做好兼容性处理。

  • 使用现有的拖放库或框架,以简化拖放操作的实现。

  • 注意性能问题,特别是在处理大量拖放元素时。

  • 考虑移动设备上的触摸操作,确保拖放功能在移动设备上的可用性和易用性。

  • 提供适当的视觉反馈和指导,以帮助用户理解和使用拖放功能。

遵循这些建议和注意事项,可以更好地应用拖放 API ,并为用户提供优秀的拖放体验。

🍭 6. 总结

本文主要介绍了 Drag and Drop API,我们了解了这个 API 的作用和如何使用,在文章中还通过一些常见使用示例和大家展示代码如何实现,最后还给出一些使用建议和注意,希望大家能够更好的了解 Drag and Drop API,在实际工作中能够合理使用。

📚 7. 拓展阅读

以下是一些拓展阅读资源,可以帮助您深入学习和理解拖放 API :

  • MDN Web - HTML Drag and Drop API[11]:MDN 上关于拖放 API 的详细文档。

  • HTML5 Rocks - Native HTML5 Drag and Drop[12]:HTML5 Rocks 上的一篇关于原生 HTML5 拖放的教程。

  • A List Apart - Beyond Drag and Drop[13]:一篇深入探讨拖放交互设计的文章。

阅读这些资源将帮助大家更深入地了解拖放 API 的更多细节和最佳实践。

参考资料

[1]

Drag and Drop: https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API

[2]

dragstart: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragstart_event

[3]

drag: https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLElement/drag_event

[4]

dragend: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragend_event

[5]

drop: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/drop_event

[6]

caniuse.com: https://caniuse.com/?search=Drag%20and%20Drop

[7]

Sortable: https://github.com/SortableJS/Sortable

[8]

dragula: https://github.com/bevacqua/dragula

[9]

React DnD: https://github.com/react-dnd/react-dnd

[10]

Vue.Draggable: https://github.com/SortableJS/Vue.Draggable

[11]

MDN Web - HTML Drag and Drop API: https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API

[12]

HTML5 Rocks - Native HTML5 Drag and Drop: http://www.html5rocks.com/en/tutorials/dnd/basics/

[13]

A List Apart - Beyond Drag and Drop: https://alistapart.com/article/beyonddraganddrop/

往期回顾

#

如何使用 TypeScript 开发 React 函数式组件?

#

11 个需要避免的 React 错误用法

#

6 个 Vue3 开发必备的 VSCode 插件

#

3 款非常实用的 Node.js 版本管理工具

#

6 个你必须明白 Vue3 的 ref 和 reactive 问题

#

6 个意想不到的 JavaScript 问题

#

试着换个角度理解低代码平台设计的本质

d2b5f35a57ce2a454a1ede0c20479e64.gif

回复“加群”,一起学习进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/685969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ThinkPHP6.0 数据迁移工具 migration 入门使用教程

文章目录 安装数据库迁移工具创建迁移文件执行迁移回滚参考资料 开始前需要做好的准备工作&#xff1a; 搭建好 PHP 开发环境&#xff08;推荐 phpstudy&#xff0c;PHP>7.2.5&#xff0c;MySql5.7.x&#xff09;。安装好 ThinkPHP6.0&#xff0c;并做配置可正常连接到 MySq…

docker安装nginx,发布部署vue项目

场景 前后端项目&#xff0c;实现前后端简单部署到服务器。前端vue&#xff0c;后端springboot。服务器ubuntu&#xff08;18.04&#xff09;<linux系统同理>. 后端通过(nohup java -jar xxx.jar &) 指令简单部署。该文主要说明部署前端vue项目。 部署vue需要安装ng…

一文看懂51单片机和stm32区别,怎么用怎么学怎么选

一文看懂51单片机和stm32区别&#xff0c;怎么用怎么学怎么选 对于初学单片机的童鞋而言&#xff0c;开始会有这样的疑问&#xff1f;到底选哪个怎么选呢&#xff1f; 1、工业控制51优于stm&#xff1f; 2、没区别,51就是个入门级,不过也有贵的,我用的就是51,用的还可以&…

PG系列4:linux下编译安装PG15

文章目录 一. 源码安装1.1 下载并解压1.2 安装依赖包1.3 开始编译安装1.4 创建用户1.5 创建目录及修改权限1.6 设置环境变量1.7 初始化数据库1.8 启动和关闭数据库 二. 验证2.1 查看数据库后台进程2.2 验证和登陆数据库2.3 查看数据库版本2.4 查看数据库运行状态2.5 修改白名单…

Sangfor华东天勇战队:h2数据库console命令执行( CVE-2021-42392 漏洞)

漏洞版本 1.1.100 < H2 Console < 2.0.204 漏洞复现 此处复现版本1.4.197 启动项目如下 在Driver Class中输入javax.naming.InitialContext 在JDBCURL中输入jndi注入恶意链接 生成链接命令&#xff1a; java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C …

CCD与CMOS

#1, 相机内部结构 https://zhuanlan.zhihu.com/p/158502818 #2&#xff0c;

大数据从0到1的完美落地之Hive分区

分区简介 为什么分区 Hive的Select查询时&#xff0c;一般会扫描整个表内容。随着系统运行的时间越来越长&#xff0c;表的数据量越来越大&#xff0c;而hive查询做全表扫描&#xff0c;会消耗很多时间&#xff0c;降低效率。而有时候&#xff0c;我们需求的数据只需要扫描表…

java面试高频面试题

文章目录 面向对象 什么是面向对象&#xff1f;封装继承多态 和equals比较hashCode与equals重载和重写的区别Final类加载器spring是什么AOP的理解谈谈你对IOC的理解零拷贝RocketMQ 架构设计RocketMq 事务消息原理RockeMq顺序消息消费原理简述RockerMQ持久化机制RocketMQ如何保…

redis学习整理

目录 一、简述 二、作用 三、五大基本数据类型 Key命令 1.String字符串 2.List列表 3.Set(集合&#xff09; 4.Hash&#xff08;哈希&#xff09; 5.zSet&#xff08;有序集合&#xff09; 四、主从复制 与 哨兵模式 1. 主从复制&#xff1a; 2. 哨兵模式&#xff…

【正点原子STM32连载】 第四十一章 游戏手柄实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第四…

【从零开始学习C++ | 第二十一篇】C++新增特性 (上)

目录 前言&#xff1a; 委托构造函数&#xff1a; 类内初始化&#xff1a; 空指针&#xff1a; 枚举类&#xff1a; 总结&#xff1a; 前言&#xff1a; C的学习难度大&#xff0c;内容繁多。因此我们要及时掌握C的各种特性&#xff0c;因此我们更新本篇文章&#xff0c;向…

部署vue element-ui admin报错(vue2)

部署vue element-ui admin报错(vue2) 目录 部署vue element-ui admin报错(vue2) 一、官方安装说明 二、部署报错的关键影响因素 2.1、“开发模板”版本 2.2、完整版 2.2.1、基础知识和基础依赖 2.2.2、原理-安装过程 三、完整版 3.3、win10环境 四、效果 4.1、win7…

云安全技术——kvm虚拟化技术

目录 10-1 kvm简介 10-2 在CentOS 7 图形化界面下安装KVM 使用IDEA开发读写MySQL数据库程序 实验目的 了解 CentOS7图形化界面的部署方法 了解 KVM的组成和作用 了解 KVM的技术架构 了解KVM的安装方法 了解 KVM创建虚拟机的方法 了解KVM的常用管理命令 实验要求 能部署图形化…

为什么建议孩子学Python?理由都在这!

近几年&#xff0c;越来越多的家长选择让孩子学习编程&#xff0c;以此提高孩子的逻辑思维、信息素养等综合能力。 Python作为一种计算机程序设计语言&#xff0c;在科技行业中有广泛的应用&#xff0c;逐渐成为少儿编程教育中必学课程之一。今天&#xff0c;编编就为大家详细…

【开发者指南】如何在MyEclipse中编辑HTML或JSP文件?(二)

在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍了HTML / JSP编辑器、智能代码完成和内容辅助等功能&#xff0c;本文将继续介绍Emmet支持、Outline 视图功能等。 MyEclipse v2023.1正式版下载 如果您有HTML或JSP文件要编辑&#xff0c;这里…

chatgpt赋能python:Python聊天程序:现代化交流的必备工具

Python聊天程序&#xff1a;现代化交流的必备工具 在信息技术快速发展的现代社会&#xff0c;聊天作为一种流行的交流方式已经取代了传统的语音电话和短信。由于智能手机和电脑的广泛普及&#xff0c;越来越多的人习惯于使用聊天软件来与朋友、家人和同事保持联系。因此&#…

GBASE南大通用携手麒麟软件、索信达 共推金融信创联合解决方案

在国家信创战略推动下&#xff0c;我国正逐步实现基础硬件-基础软件-行业应用软件的国产化替代。信创浪潮中&#xff0c;各产业链以及不同垂直细分领域的创新主体&#xff0c;正以开放、创新、团结的姿态&#xff0c;形成高凝聚力的生态合作&#xff0c;共推信创产业发展&#…

【Java】JVM学习(三)

JVM的整体内存结构 本地方法栈 本地方法栈跟 Java 虚拟机栈的功能类似&#xff0c;Java 虚拟机栈用于管理 Java 函数的调用&#xff0c;而本地方法栈则用于管理本地方法的调用。但本地方法并不是用 Java 实现的&#xff0c;而是由 C 语言实现的(比如Object.hashcode方法)。 …

PCA(主成分分析)

PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示&#xff0c;可用于提取数据的主要特征分量&#xff0c;常用于高维数据的降维。数据降维是无监督学习的另外一个常见问题。 数据的向量表示及降维问题 …

PostgreSQL 如何对索引进行分析和处理

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…