demo效果:
鼠标移入盒子,按下鼠标,开启移动跟随移动模式,再次按下关闭移动模式
涉及主要属性
在元素上单击鼠标按钮时输出鼠标指针的坐标:
var x = event.pageX; // 获取水平坐标
var y = event.pageY; // 获取垂直坐标
元素offsetLeft和offsetTop属性:
相当于最近一个有定位的父元素而言的位置,如果父元素没有定位则相当于body的x,y位置。
还有元素的offsetXXX属性不能修改只能用来读取(比如不能写:元素.offsetLeft=200),所以如果要使用(元素.style.xxx)来修改对应的原始位置
元素的offsetXXX和元素的style属性的区别:
1、offsetXX属性只读,style属性可以修改(最主要的区别)
2、offsetXX可以获取任何样式表上的样式,style属性则只能获取style=‘xxx’(行内样式)
3、还有其他的区别可以自己去搜搜嘻嘻
思路:
1、鼠标移入盒子,按下鼠标:开始计算在盒子的相对位置relativeX,relativeY
2、监听鼠标在盒子里面的移动(盒子和鼠标的位置关系始终保持不变)
3、根据鼠标位置和鼠标相对于盒子的位置计算得出当前盒子位置
4、鼠标再次点击取消跟随移动
具体代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
/* 清楚浏览器样式 */
*{
margin: 0;
border: 0;
}
.box{
width: 300px;
height: 300px;
background-color: brown;
position: relative;
left: 200px;
top: 200px;
}
</style>
</head>
<body>
<div class="box" id="box">
</div>
<script >
let boxEl = document.getElementById('box')
let relativeX = 0
let relativeY = 0
let needMoving = false// 盒子跟随鼠标移动
boxEl.addEventListener('click',(event)=>{
// 盒子内部点击 修改是否跟随鼠标移动
needMoving = !needMoving
//计算相对位置
if(needMoving){
boxEl.style.cursor = 'grab'
boxMoveWithMouse(event,boxEl)
document.addEventListener('mousemove', changeElXY)
}else{
relativeX = 0
relativeY = 0
boxEl.style.cursor = 'default'
// 移除鼠标移动事件
document.removeEventListener('mousemove', changeElXY);
}
})
// 鼠标移入盒子 盒子跟随鼠标移动
function boxMoveWithMouse(e,el){
// 鼠标在文档位置
let pageX = e.pageX
let pageY = e.pageY
// 盒子在文档位置
let boxOffX = el.offsetLeft
let boxOffY = el.offsetTop
// console.log('boxOffX',boxOffX)
// console.log('boxOffY',boxOffY)
// 盒子在文档相对位置
relativeX = pageX - boxOffX
relativeY = pageY - boxOffY
// console.log('relativeX',relativeX)
// console.log('relativeY',relativeY)
}
//修改元素位置
function changeElXY(event){
// //鼠标不在盒子里面
if(relativeX<0||relativeY<0){
return
}
let pageX = event.pageX
let pageY = event.pageY
// console.log('pageX',pageX)
// console.log('pageY',pageY)
// 盒子位置
let boxX = pageX - relativeX
let boxY = pageY - relativeY
// console.log('boxX',boxX)
// console.log('boxY',boxY)
//修改盒子位置
boxEl.style.left = boxX+'px'
boxEl.style.top = boxY + 'px'
}
</script>
</body>
</html>