- 首先是三个事件,分别是mousedown,mousemove,mouseup。
- 当鼠标点击按下的时候,需要一个tag标识此时已经按下,可以执行mousemove里面的具体方法。
- clientX,clientY标识的是鼠标的坐标,分别标识横坐标和纵坐标,并且我们用offsetLeft和offsetTop来表示元素的元素的初始坐标。
- 也就是说定位信息为: 鼠标移动时候的坐标 - 鼠标按下去时候的坐标 + 元素初始情况下的坐标(元素.offetLeft/offetTop)。
- 总结为:鼠标移动时候的坐标 - 鼠标相对于元素的坐标(在mousedown中就要定义)
- 还有一点也是原理性的东西,也就是拖拽的同时是绝对定位,我们改变的是绝对定位条件下的left以及top等等值。
<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript" src='../Vuedemo/vue.js'></script><title>鼠标拖拽元素实现</title><style type="text/css">*{
margin: 0px;}#demo {
width: 100px;height: 100px;position: absolute;background: red;}</style>
</head>
<body><div id="app" ><div id="demo" v-drag></div></div><script type="text/javascript">var vm = new Vue({
el:'#app',data:{
},methods:{
},directives:{
drag(el,binding){
var isDrag = false;el.addEventListener('mousedown', function(e) {
var e = e || window.event;mouseOffsetX = e.offsetX; mouseOffsetY = e.offsetY; isDrag = true;})document.onmouseup = function(e) {
isDrag = false;}document.onmousemove = function(e) {
var e = e || window.event;var mouseX = e.clientX; var mouseY = e.clientY;if (isDrag) {
var pageWidth = window.innerWidth;var pageHeight = window.innerHeight;var elWidth = el.offsetWidth; var elHeight = el.offsetHeight;var maxX = pageWidth-elWidth; var maxY = pageHeight-elHeight;var moveX = mouseX- mouseOffsetX;var moveY = mouseY - mouseOffsetY;var moveX = Math.min(maxX, Math.max(0, moveX));var moveY = Math.min(maxY, Math.max(0, moveY));el.style.left = moveX + 'px';el.style.top = moveY + 'px';}};}}})</script>
</body>
</html>