案例的核心 为当鼠标按下时 触发多个事件
1 在按下时 先获取 鼠标在盒子内的坐标
2 在鼠标按下的同时移动 用鼠标在盒子内的坐标减去 盒子的 top 和 left ,得到盒子了页面的 left 和 top
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.box {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 400px;
height: 200px;
border: 2px solid #999;
}
.box_top {
width: 100%;
height: 50px;
border: 2px solid #999;
}
</style>
</head>
<body>
<div class="box">
<div class="box_top">
</div>
<div class="box_but"></div>
</div>
<script>
var box = document.querySelector('.box')
var box_top = document.querySelector('.box_top')
// 先注册鼠标按下事件
box_top.addEventListener('mousedown', function (e) {
// 这里获取的是 鼠标在文档中获取的坐标 减去 box 大盒子上边距与下边距 得到鼠标在盒子内部的坐标
var x = e.pageX - box.offsetLeft
var y = e.pageY - box.offsetTop
// 调试
// console.log(e.pageX);
// console.log(box.offsetLeft);
// console.log(x);
// 在鼠标按下不妨的途中 设置 鼠标移动事件
document.addEventListener('mousemove', move)
// 这里获取的是 鼠标在文档中获取的坐标 减去鼠标在盒子内的坐标 得到盒子左边框里页面和上边框里页面的距离 left 和 top 的值 从而每当鼠标移动的时候 盒子的 left 和 top 的值都会改变
function move(e) {
box.style.left = e.pageX - x + 'px'
box.style.top = e.pageY - y + 'px'
}
// 在鼠标弹起后 清除鼠标移动事件
document.addEventListener('mouseup', function () {
document.removeEventListener('mousemove', move)
})
})
</script>
</body>
</html>```