<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>拖拽功能</title>
</head>
<body>
<div></div>
<script>
//获取标签
let divEle = document.getElementsByTagName("div")[0];
//对标签设置简单样式
divEle.style.width = `200px`;
divEle.style.height = `200px`;
divEle.style.position = `absolute`;
divEle.style.left = `0`;
divEle.style.backgroundColor = `skyblue`;
//添加事件:鼠标按下
divEle.addEventListener("mousedown", function (e) {
//设置事件对象
let event1 = e || window.event;
//鼠标移动事件调用函数
let yidong = function (e) {
//设置时间对象
let event = e || window.event;
//当鼠标移动时 设置div的定位位置(这里是重点)
//问1: 为什么yidong函数要写在事件内
//问2:为什么要用event1.offsetX 而不是 event.offsetX
divEle.style.left = event.clientX-event1.offsetX + `px`;
divEle.style.top = event.clientY-event1.offsetY + `px`;
}
//鼠标按下时div自身添加边框
this.style.border = `2px solid red`;
//当按下时 对document设置鼠标移动事件
document.addEventListener("mousemove", yidong);
//鼠标抬起事件
divEle.addEventListener("mouseup", function (e) {
//删除鼠标移动事件
document.removeEventListener("mousemove", yidong);
//取消边框
this.style.border = `none`;
})
})
</script>
</body>
</html>
问2:因为如果需要让鼠标固定在:鼠标按下去的时候鼠标在div内的位置
那么就需要获得鼠标按下去时,鼠标距离div顶部、左侧的距离,所以需要用event1
问1:为什么移动函数写在事件内
因为如果需要用到事件内声明的变量(event1) 如果将函数写在外面的话,没有办法拿到事件内声明的值。并且只有鼠标按下的时候才能移动div的位置,所以移动事件也需要写在事件内,并且鼠标松开时要删除它。