问题:使用js制作一个可以根据鼠标拖动的盒子
分析:
- 这个盒子需要是绝对定位,可以改变left和top值
- 需要鼠标按下触发事件,移动触发事件,鼠标松开触发事件
- 按下时可以执行移动的事件,松开时不执行移动事件
小知识
e.clientX //获取横坐标,值是数字
e.clientY //获取纵坐标,值是数字
xxx.style.left //这是id为xxx的盒子的left值,值带有 px
parseInt(xxx.style.left)可以获取纯数字
完整代码
html
<div id="xxx"></div>
css
#xxx{
border:1px solid red;
height: 100px;
width: 100px;
position:absolute;
left: 0;
top: 0;
}
js代码
var dragging=false
var position = null
xxx.addEventListener('mousedown',function(e){
dragging=true
//获取初始位置
position = [e.clientX,e.clientY]
});
document.addEventListener('mousemove',function(e){
//如果按下了鼠标则开始执行移动
if(dragging){
var x =e.clientX;
var y = e.clientY;
var deltaX = x-position[0];
var deltaY = y-position[1];
//有可能left值为null,parseInt是为了获取纯数字
var left = parseInt(xxx.style.left || 0);
var top = parseInt(xxx.style.top || 0)
//初始位置+移动距离+'px'
xxx.style.left=left + deltaX+"px";
xxx.style.top=top + deltaY+"px";
//将移动后的位置设置为初始位置
position=[x,y]
}
})
document.addEventListener('mouseup',function(e){
//松开鼠标后不再执行移动事件
dragging=false
})
使用document是为了防止鼠标移动过快而盒子跟不上