HTML5 拖放(Drag and Drop)学习笔记

一、HTML5 拖放简介

HTML5 拖放(Drag and Drop)是HTML5标准的一部分,允许用户抓取一个对象并将其拖动到另一个位置。拖放功能在现代网页中非常常见,例如文件上传、任务管理、布局调整等场景。

HTML5 拖放功能支持以下浏览器:

  • Internet Explorer 9+

  • Firefox

  • Opera

  • Chrome

  • Safari(注意:Safari 5.1.2不支持拖放功能)

二、HTML5 拖放的基本实现

1. 设置元素为可拖放

要使一个元素可拖动,需要将draggable属性设置为true。例如:

HTML复制

复制代码
<img id="drag1" src="logo.png" draggable="true" ondragstart="drag(event)">

预览

2. 拖动什么:ondragstartsetData()

当元素被拖动时,会触发ondragstart事件。在这个事件中,可以使用dataTransfer.setData()方法设置拖动数据的类型和值。例如:

JavaScript复制

复制代码
function drag(ev) {
    ev.dataTransfer.setData("text", ev.target.id);
}
  • ev.dataTransfer.setData():设置拖动数据的类型和值。

  • "text":表示拖动数据的类型,这里使用"text"表示文本类型。

  • ev.target.id:表示被拖动元素的id

3. 放到何处:ondragover

ondragover事件用于指定允许放置拖动数据的位置。默认情况下,元素是不允许放置拖动数据的。要允许放置,必须调用event.preventDefault()方法。例如:

JavaScript复制

复制代码
function allowDrop(ev) {
    ev.preventDefault();
}

4. 进行放置:ondrop

当拖动的数据被放置到目标元素时,会触发ondrop事件。在这个事件中,可以使用dataTransfer.getData()方法获取拖动的数据。例如:

JavaScript复制

复制代码
function drop(ev) {
    ev.preventDefault();
    var data = ev.dataTransfer.getData("text");
    ev.target.appendChild(document.getElementById(data));
}
  • ev.preventDefault():避免浏览器对数据的默认处理(例如以链接形式打开)。

  • ev.dataTransfer.getData("text"):获取拖动数据,返回在setData()方法中设置的值。

  • ev.target.appendChild():将被拖动的元素追加到目标元素中。

三、HTML5 拖放的完整示例

以下是一个完整的HTML5拖放示例,展示了如何将一个图片拖动到一个矩形框中:

HTML复制

复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>HTML5 拖放示例</title>
    <style>
        #div1 {
            width: 350px;
            height: 70px;
            padding: 10px;
            border: 1px solid #aaaaaa;
        }
    </style>
    <script>
        function allowDrop(ev) {
            ev.preventDefault();
        }

        function drag(ev) {
            ev.dataTransfer.setData("text", ev.target.id);
        }

        function drop(ev) {
            ev.preventDefault();
            var data = ev.dataTransfer.getData("text");
            ev.target.appendChild(document.getElementById(data));
        }
    </script>
</head>
<body>
    <p>拖动 RUNOOB.COM 图片到矩形框中:</p>
    <div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
    <br>
    <img id="drag1" src="logo.png" draggable="true" ondragstart="drag(event)" width="336" height="69">
</body>
</html>

预览

示例说明:

  1. <img>元素 :设置draggable="true",使其可拖动,并绑定ondragstart事件。

  2. <div>元素 :绑定ondropondragover事件,用于处理拖放逻辑。

  3. JavaScript函数

    • drag():设置拖动数据。

    • allowDrop():允许放置。

    • drop():处理放置逻辑。

四、更多实例

1. 在两个<div>元素之间拖放图像

以下是一个更复杂的示例,展示了如何在两个<div>元素之间拖放图像:

HTML复制

复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>HTML5 拖放 - 两个 div 之间</title>
    <style>
        .box {
            width: 150px;
            height: 150px;
            border: 1px solid #aaaaaa;
            margin: 10px;
            padding: 10px;
        }
    </style>
    <script>
        function allowDrop(ev) {
            ev.preventDefault();
        }

        function drag(ev) {
            ev.dataTransfer.setData("text", ev.target.id);
        }

        function drop(ev) {
            ev.preventDefault();
            var data = ev.dataTransfer.getData("text");
            ev.target.appendChild(document.getElementById(data));
        }
    </script>
</head>
<body>
    <p>在两个矩形框之间拖动图片:</p>
    <div class="box" id="div1" ondrop="drop(event)" ondragover="allowDrop(event)">
        <img id="drag1" src="logo.png" draggable="true" ondragstart="drag(event)" width="100" height="100">
    </div>
    <div class="box" id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
</body>
</html>

预览

示例说明:

  1. 两个<div>元素:分别作为源容器和目标容器。

  2. 拖动逻辑:与前面的示例类似,但增加了两个容器之间的交互。

相关推荐
NULL指向我4 小时前
STM32F407VET6学习笔记5:STM32CubeMX配置串口工程_HAL库
笔记·stm32·学习
朗迹 - 张伟6 小时前
Unity数字人开发笔记
笔记·unity·游戏引擎
TechTorch7 小时前
数据库大学实验二
数据库·经验分享·笔记·mysql
xx24067 小时前
vite学习笔记
笔记·学习
林晓lx8 小时前
[学习笔记] 从零开始虚拟化搭建数据库服务器
数据库·redis·笔记·centos
江畔柳前堤8 小时前
PyQt学习系列08-插件系统与模块化开发
运维·开发语言·数据库·python·学习·机器学习·pyqt
tongxianchao8 小时前
以少学习:通过无标签数据从大型语言模型进行知识蒸馏
人工智能·学习·语言模型
CC数学建模10 小时前
2025 年江西研究生数学建模竞赛题C题基于大雾背景视频学习的能见度回归建模完整思路 模型代码 结果 成品分享
学习·数学建模·回归
蓝婷儿10 小时前
6个月Python学习计划 Day 6 - 综合实战:学生信息管理系统
java·python·学习
Shi_haoliu11 小时前
前端vue2-完全前端生成pdf->pdf-lib,html2canvas+jspdf,原生打印,三种方式(打印带有echarts图的pdf)
前端·javascript·vue.js·git·pdf·echarts·html5