鼠标拖动的原理就是实时计算鼠标移动的相对位置,改变元素对象的位置,那么浏览器窗体的一些属性我们先了解下
clientY 指的是距离可视页面左上角的距离
pageY 指的是距离可视页面左上角的距离(不受页面滚动影响)
screenY 指的是距离屏幕左上角的距离
layerY 指的是找到它或它父级元素中最近具有定位的左上角距离
offsetY 指的是距离它自己左上角的距离
一张图带大家简单了解了解
拖动效果如上,我们来通过二种方式实现拖动效果
一、vue自定义指令directive方式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>BFW NEW PAGE</title> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/vue.2.2.min.js"></script> <style> </style> </head> <body> <div id="box"> 位置 <br>x:{{val.x}} <br>y:{{val.y}} <div v-drag="greet" id="drag" :style="style"> 注意这里要通过指令绑定函数将当前元素的位置数据传出来 </div> </div> <script type="text/javascript"> Vue.directive('drag', //自定义指令 { bind: function (el, binding) { let oDiv = el; //当前元素 let self = this; //上下文 oDiv.onmousedown = function (e) { //鼠标按下,计算当前元素距离可视区的距离 let disX = e.clientX - oDiv.offsetLeft; let disY = e.clientY - oDiv.offsetTop; document.onmousemove = function (e) { //通过事件委托,计算移动的距离 let l = e.clientX - disX; let t = e.clientY - disY; //移动当前元素 oDiv.style.left = l + 'px'; oDiv.style.top = t + 'px'; //将此时的位置传出去 binding.value({ x: e.pageX, y: e.pageY }) }; document.onmouseup = function (e) { document.onmousemove = null; document.onmouseup = null; }; }; } } ); window.onload = function () { let vm = new Vue({ el: '#box', data: { val: '123', style: { width: '100px', height: '100px', background: 'aqua', position: 'absolute', right: '30px', top: 0 } }, methods: { //接受传来的位置数据,并将数据绑定给data下的val greet(val) { vm.val = val; } }, }); } </script> </body> </html>
二、计算鼠标偏移量
<!DOCTYPE html> <html> <head> ...
点击查看剩余70%
网友评论0