js 实现 拖动
实现拖动的步骤
监听鼠标事件
在JavaScript中实现拖动功能需要监听三个鼠标事件:mousedown、mousemove和mouseup。当用户在元素上按下鼠标时触发mousedown,移动鼠标时触发mousemove,释放鼠标时触发mouseup。
const draggableElement = document.getElementById('draggable');
draggableElement.addEventListener('mousedown', startDrag);
计算初始位置
在mousedown事件中,记录鼠标按下时的初始位置和元素当前的偏移量。这有助于在拖动过程中计算元素的新位置。
let offsetX, offsetY;
function startDrag(e) {
offsetX = e.clientX - draggableElement.getBoundingClientRect().left;
offsetY = e.clientY - draggableElement.getBoundingClientRect().top;
document.addEventListener('mousemove', drag);
document.addEventListener('mouseup', stopDrag);
}
更新元素位置
在mousemove事件中,根据鼠标的当前位置计算元素的新位置,并更新元素的样式属性(如left和top)以实现拖动效果。
function drag(e) {
draggableElement.style.left = (e.clientX - offsetX) + 'px';
draggableElement.style.top = (e.clientY - offsetY) + 'px';
}
停止拖动
在mouseup事件中,移除mousemove和mouseup事件监听器,停止拖动。
function stopDrag() {
document.removeEventListener('mousemove', drag);
document.removeEventListener('mouseup', stopDrag);
}
完整示例代码
以下是一个完整的实现示例,包含HTML和CSS部分:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Draggable Element</title>
<style>
#draggable {
width: 100px;
height: 100px;
background-color: #3498db;
position: absolute;
cursor: move;
}
</style>
</head>
<body>
<div id="draggable"></div>
<script>
const draggableElement = document.getElementById('draggable');
let offsetX, offsetY;
function startDrag(e) {
offsetX = e.clientX - draggableElement.getBoundingClientRect().left;
offsetY = e.clientY - draggableElement.getBoundingClientRect().top;
document.addEventListener('mousemove', drag);
document.addEventListener('mouseup', stopDrag);
}
function drag(e) {
draggableElement.style.left = (e.clientX - offsetX) + 'px';
draggableElement.style.top = (e.clientY - offsetY) + 'px';
}
function stopDrag() {
document.removeEventListener('mousemove', drag);
document.removeEventListener('mouseup', stopDrag);
}
draggableElement.addEventListener('mousedown', startDrag);
</script>
</body>
</html>
注意事项
- 确保元素的
position属性设置为absolute或relative,否则left和top样式不会生效。 - 拖动过程中可能会触发文本选中或其他浏览器默认行为,可以通过
e.preventDefault()阻止默认行为。 - 如果需要支持触摸设备,可以添加
touchstart、touchmove和touchend事件监听器。
通过以上步骤,可以实现一个基本的拖动功能。根据需求,可以进一步扩展功能,如限制拖动范围或添加动画效果。






