一、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. 拖动什么:ondragstart
和 setData()
当元素被拖动时,会触发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>
预览
示例说明:
-
<img>
元素 :设置draggable="true"
,使其可拖动,并绑定ondragstart
事件。 -
<div>
元素 :绑定ondrop
和ondragover
事件,用于处理拖放逻辑。 -
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>
预览
示例说明:
-
两个
<div>
元素:分别作为源容器和目标容器。 -
拖动逻辑:与前面的示例类似,但增加了两个容器之间的交互。