元素碰撞
我们利用元素获取矩形对象来实现
dom.getBoundingClientReact();
left 元素左边距离页面左边的距离
right 元素右边距离页面左边的距离
top 元素顶边距离页面顶端的距离
bottom 元素下边距离页面顶端的距离
<!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>
div{
width:50px;
height:50px;
background-color: red;
position: absolute;
}
#div0{
background-color: blue;
}
</style>
</head>
<body>
<div id="div0"></div>
<div id="div1"></div>
<script>
var obj={
divRandom:function(elem){
//文档减去元素的宽高
var w=document.documentElement.clientWidth-elem.clientWidth;
var h=document.documentElement.clientHeight-elem.clientHeight;
//随机位置
elem.style.left=Math.random()*w+"px";
elem.style.top=Math.random()*h+"px";
},
tuozhuai:function (elem){
elem.addEventListener("mousedown",mouseHandler);
function mouseHandler(e){
switch(e.type){
case "mousedown":
e.preventDefault();
document.addEventListener("mousemove",mouseHandler);
this.addEventListener("mouseup",mouseHandler);
this.x=e.offsetX;
this.y=e.offsetY;
document.elem=this;
break;
case "mousemove":
document.elem.style.left=e.clientX-document.elem.x+"px";
document.elem.style.top=e.clientY-document.elem.y+"px";
//移动碰撞事件,这里需要自定义事件抛发,要不不触发
var evn=new Event("hit");
this.elem.dispatchEvent(evn);
break;
case "mouseup":
document.removeEventListener("mousemove",mouseHandler);
break;
}
}
},
hit:function(elem1,elem2){
var rand0=elem1.getBoundingClientRect();
var rand1=elem2.getBoundingClientRect();
//如果元素1的左上角 碰到元素2
if(rand0.left>=rand1.left && rand0.left<=rand1.right && rand0.top>=rand1.top && rand0.top <=rand1.bottom){
return true;
}
//右上
if(rand0.right>=rand1.left && rand0.left<=rand1.left && rand0.top>=rand1.top && rand0.top <=rand1.bottom){
return true;
}
return false;
}
}
var div0=document.querySelector("#div1");
var div=document.querySelector("#div0");
obj.divRandom(div);
obj.tuozhuai(div0);
//添加div0的自定义事件,碰撞后触发
div0.addEventListener("hit",hitHandler);
function hitHandler(e){
if(obj.hit(div0,div)){
obj.divRandom(div);
}
}
</script>
</body>
</html>

浙公网安备 33010602011771号