vue 自定义指令 拖拽

之前看别人vue的视频,练习写了个自定义指令-拖拽,当时引入vue.js的版本是1.0.28,现在也可以正常使用。上代码

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>vue 指令 -拖拽</title>
	<script src="vue.js"></script>
	<style>
	#box{width: 100px;height: 100px;background: blue;position: absolute;left: 0;top: 0}
	</style>
</head>
<body>
	<div id="box" v-drag></div>
	<script>
	Vue.directive('drag',function(){
		console.log('this:',this);//Directive
		var oDiv = this.el;
		oDiv.onmousedown = function(ev){
			var ev = ev || window.event;
			var disX = ev.clientX-oDiv.offsetLeft;
			var disY = ev.clientY-oDiv.offsetTop;


			document.onmousemove = function(ev){
				var l = ev.clientX-disX;
				var t = ev.clientY-disY;
				oDiv.style.left = l+'px';
				oDiv.style.top = t+'px';
			};
			document.onmouseup = function(){
				document.onmousemove = null;
				document.onmouseup = null;
			}
		};
		
	});
	new Vue({
		el: '#box',
		data:{
		}
	});
	</script>
</body>
</html>

两点注意:Vue.directive()指令一定要在vue实例创建之前,dom元素一定要设置绝对定位。

现在用2.0版本就不好使了,去看了下文档,修改了一下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title></title>
    <link rel="stylesheet" href="">
    <script src="./vue.js"></script>
    <style>
        .drag{
            position: absolute;
            width: 200px;
            height: 200px;
            background: yellowgreen
        }
    </style>
    <script>
        Vue.directive('drag',
          {bind: function(el){
            var oDiv = el;//el就是指令绑定的元素
            oDiv.onmousedown = function(ev){
                var startX = ev.clientX - oDiv.offsetLeft;
                var startY = ev.clientY - oDiv.offsetTop;

                document.onmousemove = function(e){
                    oDiv.style.left = (e.clientX - startX==0)? 0 : e.clientX - startX+ 'px';
                    oDiv.style.top = e.clientY - startY==0? 0: e.clientY - startY + 'px';
                    
                }

                document.onmouseup = function () {
                    document.onmousemove = null;
                    document.onmouseup = null
                }
            }
        }})
        window.onload = function(){
            var vm = new Vue({
                el: '#app',
                data:{
                    
                }
            })
        }
    </script>
</head>
<body>
    <div id="app">
        
        <div class="drag" v-drag></div>
    </div>
</body>
</html>

文档地址:https://cn.vuejs.org/v2/guide/custom-directive.html

边界检测什么的还没有做,先记下来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值