拖拽属性
**
针对对象 | 事件名称 | 说明 |
---|---|---|
被拖动的元素 | dragstart | 开始被拖动触发,不是元素图形进行目标区域触发的,是鼠标指针进入时才触发的 |
drag | 拖动时反复触发 | |
dragend | 拖拽完成时 | |
目标对象 | dragenter | 进入目标对象 |
dragover | 目标对象内 | |
dragleave | 拖动元素没有被放下就离开目标元素 | |
drop | 在目标元素放下(需要取消浏览器默认行为) |
备注:方法中需要在加上 on 例如 **ondragstart.
所有的标签元素,当拖拽周期结束时,默认事件是回到原处。
阻止浏览器的默认行为,e.preventDefault()。
**
默认带拖拽属性**
a img 标签
拖拽的生命周期
1.拖拽开始,拖拽进行中,拖拽结束
2.被拖拽的物体,目标区域
clientX
clientY
简单实现 (注:pc端 移动端下面无法实现
<style>
.a{
position: absolute;
}
</style>
<body>
<div class="a" draggable="true"></div>
<!--
按下物体的瞬间是不会触发事件的
-->
<script>
var oDrageDiv = document.getElementsByClassName("a")[0]
var beginX = 0
var beginY = 0
oDrageDiv.ondragstart = function (e) {
// console.log(e)
beginX = e.clientX
beginY = e.clientY
}
// oDrageDiv.ondrag = function(e){
// console.log(e)
// }
oDrageDiv.ondragend = function (e) {
// console.log(e)
var x = e.clientX - beginX
var y = e.clientY - beginY
oDrageDiv.style.left = oDrageDiv.offsetLeft + x + "px"
oDrageDiv.style.top = oDrageDiv.offsetTop + y + "px"
}
</script>
</body>
例子实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
.box1 {
position: absolute;
width: 150px;
height: auto;
border: 1px solid black;
padding-bottom: 10px;
}
.box2 {
position: absolute;
width: 150px;
min-height:100px ;
border: 1px solid black;
padding-bottom: 10px;
left: 300px;
}
li {
position: relative;
width: 100px;
height: 30px;
background: #abcdef;
margin: 10px auto;
list-style: none;
}
</style>
</head>
<body>
<div class="box1">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</div>
<div class="box2"></div>
<script>
var dragDom;
var liList = document.getElementsByTagName("li")
for(var i=0;i<liList.length;i++){
liList[i].setAttribute("draggable",true)
liList[i].ondragstart = function(e){
dragDom = e.target
console.log(e)
}
}
var box2 = document.getElementsByClassName("box2")[0]
box2.ondragover = function(e){
e.preventDefault();
}
box2.ondrop = function(e){
console.log(e)
box2.appendChild(dragDom)
dragDom = null
}
var box1 = document.getElementsByClassName("box1")[0]
box1.ondragover = function(e){
e.preventDefault();
}
box1.ondrop = function(e){
box1.appendChild(dragDom)
dragDom = null
}
</script>
</body>
</html>
http://jartto.wang/2017/10/23/html5-drag/
https://juejin.im/post/6844904040711585799
符合题意但是无法实现
原因:移动端不支持这个事件
https://segmentfault.com/a/1190000014572113