js 碰撞检测

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>九宫格碰撞</title>
<style>
#box{ width:300px; height:300px; border:1px solid #ccc; margin:50px auto;}
#box span{ display:block; width:100px; height:100px; float:left; color:#000; font-size:40px; text-align:center; line-height:100px; cursor:pointer; }
#box span.bor{ border:1px dashed #f00; position:absolute;}
</style>

<script>
window.οnlοad=function(){
var oBox=document.getElementById('box');
var aSpan=oBox.getElementsByTagName('span');
for(var i=aSpan.length-1;i>=0;i--){
aSpan[i].innerHTML=i+1;
aSpan[i].style.background='rgb('+rand(0,255)+','+rand(0,255)+','+rand(0,255)+')';
var ls=getPos(aSpan[i]).left;
var ts=getPos(aSpan[i]).top;
aSpan[i].style.left=ls+'px';
aSpan[i].style.top=ts+'px';
aSpan[i].style.position='absolute';

//设置坐标 为什么这儿不能用这个函数呢?请牛人指教下;
//setAttr(aSpan[i],{left:ls+'px',top:ts+'px',position:'absolute'});

drag(aSpan[i]);
}

//生成n-m之间的随机数
function rand(n,m){
return parseInt( Math.random()*(m-n+1)+n)
};
//获取样式
function getStyle(obj,attr){
return getComputedStyle()?getComputedStyle(obj,flase)[attr]:obj.getCurrentStyle(attr)
};
//获取坐标
function getPos(obj){
var l=0,t=0;
while(obj){
l+=obj.offsetLeft;
t+=obj.offsetTop;
obj=obj.offsetParent;
}
return {left:l,top:t}
}

//设置css
function setAttr(obj,json){
//alert(obj)
for(i in json){
obj.style[i]=json[i];
}
}

function isPeng(obj1,obj2){
var l1 = obj1.offsetLeft,
r1 = obj1.offsetLeft + obj1.offsetWidth,
t1 = obj1.offsetTop,
b1 = obj1.offsetTop + obj1.offsetHeight,
l2 = obj2.offsetLeft,
r2 = obj2.offsetLeft + obj2.offsetWidth,
t2 = obj2.offsetTop,
b2 = obj2.offsetTop + obj2.offsetHeight;

if(r1<l2 || b1<t2 || l1>r2 || t1>b2)return false;
return true;
}

var z=0;
//拖动效果
function drag(obj){
obj.οnmοusedοwn=function(ev){
z++;
var oEvent=ev||event;
var oNewSpan=document.createElement('span');
oNewSpan.className='bor';
setAttr(oNewSpan,{left:obj.offsetLeft+'px',top:obj.offsetTop+'px'});

var oPar=this.parentNode;
oPar.appendChild(oNewSpan)

obj.style.zIndex=z;
var disX=oEvent.clientX-this.offsetLeft;
var disY=oEvent.clientY-this.offsetTop;
//记录刚开始的创建的span的坐标;
var posJson={l:obj.offsetLeft,t:obj.offsetTop};

document.οnmοusemοve=function(ev){
var oEvent=ev||event;
var l=oEvent.clientX-disX;
var t=oEvent.clientY-disY;

setAttr(obj,{left:l+'px',top:t+'px'});


var i=0,len=aSpan.length,m=9999999999999999,near;
for(i;i<len;i++){
if(aSpan[i]==obj)continue;
if(isPeng(aSpan[i],obj)){
var ls=Math.abs(aSpan[i].offsetLeft-obj.offsetLeft);
var ts=Math.abs(aSpan[i].offsetTop-obj.offsetTop);
var cs=ts*ts+ls*ls;
if(cs<m){
m=cs;
near=aSpan[i];
}

}
}

if(!near || near==obj){
return;
}else{
setAttr(oNewSpan,{left:near.offsetLeft+'px',top:near.offsetTop+'px'});

setAttr(near,{left:posJson.l+'px',top:posJson.t+'px'});

posJson.l=oNewSpan.offsetLeft;
posJson.t=oNewSpan.offsetTop;
}

}
document.οnmοuseup=function(){
document.οnmοusemοve=document.οnmοuseup=null;
oPar.removeChild(oNewSpan)

setAttr(obj,{left:posJson.l+'px',top:posJson.t+'px'});
}
return false;
}
}
}
</script>

</head>

<body>
<div id="box">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>

</body>
</html>

转载于:https://www.cnblogs.com/theyes/p/3872525.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值