HTML5:drag & drop API
绑定在拖拽目标
Evnet | Description |
---|---|
dragstart | 当用户开始拖拽一个元素或者一个文本选取区块的时触发 |
drag | 当用户正在拖拽一个元素或者一个文本选取区块的时触发 |
dragend | 当用户结束拖拽一个元素或者一个文本选取区块的时触发 |
绑定在放置目标
Evnet | Description |
---|---|
dragenter | 当一个元素或文字选取区块被拖曳移动进入一个有效的放置目标时触发 |
dragover | 当一个元素或文字选取区块被拖曳移动经过一个有效的放置目标时触发 |
dragleave | 当一个元素或文字选取区块被拖曳移动离开一个有效的放置目标时触发 |
dragexist | 当一个元素不再是被选取中的拖曳元素时触发 |
drop | 当一个元素或文字选取区块被放置至一个有效的放置目标时触发 |
实操
编写代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>HTML5 drag and drop</title>
<style type="text/css">
*{
padding: 0;
margin: 0;
}
#main{
width: 300px;
height: 200px;
box-sizing: border-box;
padding: 10px;
margin: 10px;
border:2px solid #fd4d4d;
}
.list{
margin: 10px;
font-size: 0;
}
.list li,
#main li{
display: inline-block;
width: 30px;
height: 30px;
margin-right: 10px;
line-height: 30px;
border-radius: 100%;
text-align: center;
background: #58a;
color: #fff;
font-size: 16px;
}
</style>
</head>
<body>
<ul id="main"></ul>
<ul class="list">
<li>A</li>
<li>B</li>
<li>C</li>
</ul>
</body>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
var ELE = '';
var NUB = '';
//拖放元素设置draggable属性
$('.list').find('li').attr('draggable', true);
//拖放元素绑定dragstart, dragend事件
$('.list').on({
'dragstart': function(e){
ELE = $(this);
NUB = ELE.parents().children('li').length;
var _data = parseDom(e.target);
//dataTransfer.setData储存数据(使用 jquery 时要加上originalEvent)
e.originalEvent.dataTransfer.setData("text/plain", _data);
ELE.css('opacity', '0.5');
},
'dragend': function(e){
$('.list').find('li').length === NUB?ELE.css('opacity', '1'):'';
}
}, 'li');
//目标元素绑定dragover, drop事件
$('#main').on({
'dragover': function(e){
e.originalEvent.preventDefault();
},
'drop': function(e){
e.originalEvent.preventDefault();
//dataTransfer.getData读取数据
var _ele = e.originalEvent.dataTransfer.getData("text/plain");
$(this).append(_ele);
ELE.remove();
}
});
});
//DOM转string
function parseDom(node) {
var tmpNode = document.createElement( "div" );
tmpNode.appendChild( node.cloneNode( true ) );
var str = tmpNode.innerHTML;
tmpNode = node = null;
return str;
};
</script>
</html>
总结
drag & drop 带来的应用场景,远不止这些,还有待探索。