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. 拖动逻辑:与前面的示例类似,但增加了两个容器之间的交互。

相关推荐
郭涤生6 分钟前
第二章:影响优化的计算机行为_《C++性能优化指南》notes
开发语言·c++·笔记·性能优化
申朝先生1 小时前
面试的时候问到了HTML5的新特性有哪些
前端·信息可视化·html5
@小张要努力1 小时前
第十三届蓝桥杯国赛电子类单片机学习记录(客观题)
单片机·嵌入式硬件·mcu·学习·蓝桥杯·51单片机·proteus
吴梓穆1 小时前
UE4学习笔记 FPS游戏制作32 主菜单,暂停游戏,显示鼠标指针
笔记·学习·ue4
m0_678693332 小时前
深度学习笔记19-YOLOv5-C3模块实现(Pytorch)
笔记·深度学习·yolo
汪超2 小时前
Transformers快速入门-学习笔记(二)
笔记·学习·自然语言处理
代码AC不AC3 小时前
【数据结构】栈 与【LeetCode】20.有效的括号详解
数据结构·学习·leetcode·练习·
郭涤生4 小时前
Chapter 2:A Tale of Two Values_《clean architecture》notes
开发语言·c++·笔记
LoserChaser4 小时前
李宏毅机器学习笔记(1)—机器学习基本概念+深度学习基本概念
笔记·深度学习·机器学习
云上艺旅4 小时前
K8S学习之基础五十八:部署nexus服务
学习·docker·云原生·容器·kubernetes