H5新特性——拖放
拖放(Drag和drop)是 HTML5 标准的组成部分,拖放是一种常见的特性,即抓取对象以后拖到另一个位置。在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放,非常的好用和重要的,接下来我就简单介绍一下。
拖放的过程:
拖动开始——>拖动过程——>拖动结束
拖放用到的相关函数:
被拖放的元素:
(1)ondragstart:源对象开始被拖动
(2)ondrag:源对象被拖动过程中(鼠标可能在移动也可能未移动)
(3)ondragend:源对象被拖动结束
目的对象:
(1)ondragenter:目标对象被源对象拖动着进入
(2)ondragover:目标对象被源对象拖动着悬停在上方
(3)ondragleave:源对象拖动着离开了目标对象
(4)ondrop:源对象拖动着在目标对象上方释放/松手
拖放的简单步骤
1、设置元素为可拖放
首先,为了使元素可拖动,把draggable属性设置为true。
2、设置被拖动的函数
添加ondragstart事件,这个属性会调用了一个函数,drag(event),它规定了被拖动的数据。
函数中的dataTransfer.setData()方法设置被拖数据的数据类型和值。
例子:
function drag(ev)
{
ev.dataTransfer.setData("Text",ev.target.id);
}
传送数据的数据类型是 "Text",值是被拖动元素的id。
3、设置目的对象的函数
(1)放到何处
添加ondragover事件,这个属性规定在何处放置被拖动的数据。
默认地,无法将数据/元素放置到其他元素中。
这要通过调用ondragover事件的 event.preventDefault()方法:
function allowDrop(ev)
{
ev.preventDefault();
}
(2)进行放置
添加ondrop事件,当放置被拖数据时,会发生ondrop事件。
ondrop 属性调用了一个函数,drop(event):
function drop(ev)
{
ev.preventDefault();
var data=ev.dataTransfer.getData("Text");
ev.target.appendChild(document.getElementById(data));
}
重点:
调用preventDefault()来避免浏览器对数据的默认处理(drop事件的默认行为是以链接形式打开)。
通过 dataTransfer.getData("Text") 方法获得被拖的数据。该方法将返回在 setData() 方法中设置为相同类型的任何数据。被拖数据是被拖元素的id。
最后一行代码是把被拖元素追加到放置元素(目标元素)中。
自己写的一个菜谱菜单的简单的小例子,与大家分享下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>拖拽</title>
<script type="text/javascript">
function drag(ev)
{
ev.dataTransfer.setData("Text",ev.target.id);
}
function allowDrop(ev)
{
ev.preventDefault();
}
function drop(ev)
{
ev.preventDefault();
var data=ev.dataTransfer.getData("Text");
ev.target.appendChild(document.getElementById(data));
}
</script>
<style type="text/css">
body p{
margin: 0px;
padding: 0px;
border:0px;
}
.caipu{
width: 1000px;
height: 500px;
border: solid 1px blue;
overflow:auto;
}
td{
padding: 10px;
}
.caidan{
width: 200px;
height: 500px;
border: solid 1px blue;
margin-left: 50px;
overflow:auto;
}
.caipu, .caidan{
display: inline-block;
}
</style>
</head>
<body>
<div class="div1">
<h1>菜谱</h1>
<div class="caipu">
<table>
<tr>
<td>
<div draggable="true" ondragstart="drag(event)" id="drag1" style="background-image: url(./img/food1.jpg); background-size: 150px 150px;background-repeat: no-repeat; width: 150px; height: 170px;">
<p style="padding-top: 150px;">炒土豆————10元</p>
</div>
</td>
<td>
<div draggable="true" ondragstart="drag(event)" id="drag2" style="background-image: url(./img/food2.jpg); background-size: 150px 150px;background-repeat: no-repeat; width: 150px; height: 170px;">
<p style="padding-top: 150px;">炒土豆————10元</p>
</div>
</td>
<td>
<div draggable="true" ondragstart="drag(event)" id="drag3" style="background-image: url(./img/food2.jpg); background-size: 150px 150px;background-repeat: no-repeat; width: 150px; height: 170px;">
<p style="padding-top: 150px;">炒土豆————10元</p>
</div>
</td>
<td>
<div draggable="true" ondragstart="drag(event)" id="drag4" style="background-image: url(./img/food3.jpg); background-size: 150px 150px;background-repeat: no-repeat; width: 150px; height: 170px;">
<p style="padding-top: 150px;">炒土豆————10元</p>
</div>
</td>
<td>
<div draggable="true" ondragstart="drag(event)" id="drag5" style="background-image: url(./img/food4.jpg); background-size: 150px 150px;background-repeat: no-repeat; width: 150px; height: 170px;">
<p style="padding-top: 150px;">炒土豆————10元</p>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="div2">
<h1>菜单</h1>
<div class="caidan" ondrop="drop(event)" ondragover="allowDrop(event)">
</div>
</div>
</body>
</html>
结果截图:
可以将左边菜谱中的div 拖放到右边的菜单的div中。
希望对大家有用,如果有错误可以指出来,大家互相学习!