<!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>