<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>练习:自定义指令 实现元素的拖拽</title>
<script src="js/vue.js"></script>
<style>
#itany div{
width: 100px;
height: 100px;
position:absolute;
}
#itany .hello{
background-color:red;
top:0;
left:0;
}
#itany .world{
background-color:blue;
top:0;
right:0;
}
</style>
</head>
<body>
<div id="itany">
<div class="hello" v-drag>itany</div>
<div class="world" v-drag>网博</div>
</div>
<script>
Vue.directive('drag',function(el){
el.onmousedown=function(e){
//获取鼠标点击处分别与div左边和上边的距离:鼠标位置-div位置
var disX=e.clientX-el.offsetLeft;
var disY=e.clientY-el.offsetTop;
console.log(disX,disY);
//包含在onmousedown里面,表示点击后才移动,为防止鼠标移出div,使用document.onmousemove,点击后再移动
//使用document.onmousemove,不要使用el.onmousemmove
//在这个文档里出不去
document.onmousemove=function(e){
//获取移动后div的位置:鼠标位置-disX/disY
var l=e.clientX-disX;
var t=e.clientY-disY;
el.style.left=l+'px'; //必须要有单位
el.style.top=t+'px';
}
//停止移动,鼠标弹起
document.onmouseup=function(e){
document.onmousemove=null;
document.onmouseup=null;
}
}
});
var vm=new Vue({
el:'#itany',
data:{
msg:'welcome',
username:'alice'
},
methods:{
change(){
this.msg='animals'
}
}
});
</script>
</body>
</html>
代码注意:
- VUE自定义指令实现的方式,Vue.directive();
- 自定义指令使用的方式必须加v-;
- 拖拽功能思路:是把要拖拽的DOM的position:设置为absolute,这样就可以基于父窗口,或者根元素进行展示;
- 先在自定义指令中获取DOM元素,然后设置onmousedown事件,获取点击的位置坐标,然后就是小算法计算位置的问题;
- 移动使用document.onmousemove,不要使用el.onmousemove
- 移动结束后,即鼠标弹起后,要把onmousemove和onmouseup事件清除;