写在前面
这个需求的实现重点就是鼠标 mouse 的三个事件的监听处理。即 mousedown、mousemove、mouseup。
实现方法
<body><div id="xxx"></div></body>
#xxx{position: absolute;width: 100px;height: 100px;border: 1px solid red;}
let dragging = false;let position = [];xxx.addEventListener('mousedown',(e)=>{dragging = true;position = [e.clientX, e.clientY];})document.addEventListener('mousemove',(e)=>{if(!dragging) return;const x = e.clientX;const y = e.clientY;const deltaX = x - position[0];const deltaY = y - position[1];console.log(deltaX,deltaY);const left = parseInt(xxx.style.left || 0);const top = parseInt(xxx.style.top || 0);xxx.style.left = left + deltaX + 'px';xxx.style.top = top + deltaY + 'px';// 为了更好的性能,不要用left,用transform(x,y)position = [x,y];})document.addEventListener('mouseup',(e)=>{dragging = false;})
注意事项:
- style.left 得到的是带有 px 单位的值,需要进行数值转化。
- style.left 的值可能为 undefined,parseInt(undefined) = NaN,因此记得保留值 || 0。
- mousedown 必须是绑定在 xxx 元素上,为了使得移动流畅,mousemove 一般绑定在 document 上,mouseup也是。
- 为了性能,移动元素位置的时候要用transform 代替绝对定位的left
