前言:很多时候,我们业务中需要对鼠标点击的元素进行拖拽,使用原生JS实现这个方法,主要用到鼠标事件和监听。
- onmousedown:鼠标按下事件
- onmousemove:鼠标移动事件
- onmouseup:鼠标抬起事件
注意:
- 被拖拽的元素一定要是绝对定位,脱离文档流才可以移动
- 绑定拖拽的元素,移动和鼠标松开后是对document的绑定,因为移动的是整个div。
实现思路
- 先获取被拖拽元素所能移动的最大距离,超过这个距离就移动不了
- 给元素的onmousedown绑定一个function(e)事件
- 获取鼠标按下的原点距离盒子边缘的距离diffX和diffY
- 设置onmousemove事件,将被拖拽元素的left和top设置
- left的值是拖拽之后的那个位置的鼠标的x值减去diffX
- top的值是拖拽之后的那个位置的鼠标的y值减去diffY
- 设置鼠标松开事件onmouseup
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| <body> <div class="box"> <img src="https://tvax4.sinaimg.cn/large/ec43126fgy1gzp7qtgjs0j213a1jlnpd.jpg" alt="" ondragstart="return false"> </div> </body> </html>
<style> .box{ width: 150px; position: absolute; }
.box img{ width: 100%; position: absolute; } </style>
<script> var box = document.querySelector('.box') var maxLeft = window.innerWidth - box.offsetWidth; var maxTop = window.innerHeight - box.offsetHeight; box.onmousedown = function(e){ e = e || window.event let diffX = e.clientX - box.offsetLeft let diffY = e.clientY - box.offsetTop box.onmousemove = function(e){ e = e || window.event let x = e.clientX - diffX let y = e.clientY - diffY
x = x < 0 ? 0 : x > maxLeft ? maxLeft : x y = y < 0 ? 0 : y > maxTop ? maxTop : y
box.style.left = x + 'px'; box.style.top = y + 'px'; }
box.onmouseup = function(e){ this.onmousemove = null this.onmouseup = null }
} </script>
|
实现效果