此项目使用了 拖拽、碰撞 、动画运动、定位转换
判断最近的一个位置,采用勾股定理的方法
是否碰撞? 画张图勾出来了,
<html> <head> <meta charset="utf-8"> <title>图片中间放大-拖拽移动</title> <script type="text/javascript" src="js/base.js"></script> <style type="text/css"> body,ul,li,img{margin:0px;padding:0px;} ul,li{list-style:none;} #ul1{ width:660px; margin:15px auto; height:auto; position:relative; z-index:1; } #ul1::after{ } #ul1 li{ width:200px; height:160px; margin:10px; float:left; overflow:hidden; cursor: move; } #ul1 li img{ display:block; width:200px; height:160px; } #ul1 li.active{ border:1px dashed #f60; } </style> <script type="text/javascript"> window.onload=function(){ var oUl=document.getElementById("ul1"); var oUlLi=oUl.getElementsByTagName("li"); var isZindex=1; var liPosition=[]; for(var i=0;i<oUlLi.length;i++){ oUlLi[i].style['left']=oUlLi[i].offsetLeft; oUlLi[i].style['top']=oUlLi[i].offsetTop; oUlLi[i].index=i; liPosition.push({"top":oUlLi[i].offsetTop,"left":oUlLi[i].offsetLeft}); } for(var i=0;i<oUlLi.length;i++){ oUlLi[i].style['position']="absolute"; oUlLi[i].style['zIndex']=isZindex++; oUlLi[i].style['margin']="0px"; } var prev_x=0; var prev_y=0; for(var i=0;i<oUlLi.length;i++){ oUlLi[i].onmousedown=function(ev){ var _this=this; var oEvent=ev||event; var mouseX=oEvent.clientX; var mouseY=oEvent.clientY; var diffx=mouseX-_this.offsetLeft; var diffy=mouseY-_this.offsetTop; var _near=null; _this.style['zIndex']=(++isZindex); document.onmousemove=function(ev){ var oEvent=ev||event; var oMouseX=oEvent.clientX; var oMouseY=oEvent.clientY; var ol=oMouseX-diffx; var ot=oMouseY-diffy; _this.style['left']=ol+"px"; _this.style['top']=ot+"px"; _near=near(_this,oUlLi); for(var i=0;i<oUlLi.length;i++){ oUlLi[i].className=""; } if(_near){ _near.className="active"; } } document.onmouseup=function(){ document.onmousemove=null; document.onmouseup=null; for(var i=0;i<oUlLi.length;i++){ oUlLi[i].className=""; } var temp=_this.index; if(_near){ (new Base(_this)).startMove({"left":liPosition[_near.index].left,"top":liPosition[_near.index].top},200); _near.style['zIndex']=(++isZindex); (new Base(_near)).startMove({"left": liPosition[temp].left,"top": liPosition[temp].top},200,"linear"); _this.index=_near.index; _near.index=temp; }else{ (new Base(_this)).startMove({"left": liPosition[temp].left,"top": liPosition[temp].top},200); } } return false; } } } function near(obj,objList){ var divs=objList; var nearObj=false; var nearNum=9999999; for(var i=0;i<divs.length;i++){ if(obj===divs[i]){ continue; } if(pz(obj,divs[i])){ var t=obj.offsetTop-divs[i].offsetTop; var l=obj.offsetLeft-divs[i].offsetLeft; //使用了勾股定理 两边的平方等于斜边的平方 var dis=Math.sqrt(l*l+t*t); if(dis<nearNum){ nearNum=dis; nearObj=divs[i]; } } } return nearObj; } function pz(obj1,obj2){ var left1=obj1.offsetLeft; var right1=obj1.offsetLeft+obj1.offsetWidth; var top1=obj1.offsetTop; var bottom1=obj1.offsetTop+obj1.offsetHeight; var left2=obj2.offsetLeft; var right2=obj2.offsetLeft+obj2.offsetWidth; var top2=obj2.offsetTop; var bottom2=obj2.offsetTop+obj2.offsetHeight; //left1>left2 || right1>left2 //bottom1>top2 //如果第一个的右边大于第二个的左边 碰撞 //如果第二个的左边大于第二个的右边 过了,因此 left1<right2 /** 如果第一个的bottom大于第二个的top 则碰撞 如果第一个的top大于第二个的bottom 则过了 top1<bottom2 **/ if((right1>left2 && left1<right2) && (bottom1>top2 && top1<bottom2)){ return true; }else{ return false; } } </script> </head> <body> <ul id="ul1"> <li><img src="images/1.jpg"></li> <li><img src="images/2.jpg"></li> <li><img src="images/3.jpg"></li> <li><img src="images/4.jpg"></li> <li><img src="images/5.jpg"></li> <li><img src="images/6.jpg"></li> <li><img src="images/1.jpg"></li> <li><img src="images/2.jpg"></li> <li><img src="images/3.jpg"></li> <li><img src="images/4.jpg"></li> <li><img src="images/5.jpg"></li> <li><img src="images/6.jpg"></li> </ul> </body> </html>
项目借助了 base.js