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 分钟前
学习黑客 week1周测 & 复盘
网络·学习·web安全
science怪兽1 小时前
【进阶】C# 委托(Delegate)知识点总结归纳
开发语言·笔记·c#
源码方舟1 小时前
【HTML5】轮播图的实现方式一
前端·javascript·css·html·html5
源码方舟1 小时前
【HTML5】老式放映机原理-实现图片无缝滚动
前端·javascript·css·html·css3·html5
海尔辛2 小时前
学习黑客Linux 命令
linux·运维·学习
love530love2 小时前
修复笔记:获取 torch._dynamo 的详细日志信息
运维·人工智能·pytorch·笔记·python·深度学习·virtualenv
ZeroOne电平浪客3 小时前
AUTOSAR_BSW_从入门到精通学习笔记系列_EcuM
笔记·mcu·学习·汽车·autosar·普华小满
dankokoko3 小时前
OPENGLPG第九版学习 -视口变换、裁减、剪切与反馈
学习
江安的猪猪3 小时前
大连理工大学选修——图形学:第二章 计算机图形硬件及绘图系统
笔记
xin007hoyo3 小时前
算法笔记.求约数
c++·笔记·算法