JavaScript碰撞检测原理及拖拽实现

作者:函数茶馆时间:2026-10-23 16:32:06浏览:637

本文详解JavaScript中碰撞检测的核心原理,通过九宫格模型解析两个绝对定位元素不发生碰撞的边界条件。结合可拖拽div与固定div的模拟场景,提供完整测试代码,帮助开发者理解并实现前端交互中的碰撞逻辑。

JavaScript碰撞检测原理及拖拽实现

本文分享JavaScript实现碰撞检测的具体代码,供读者参考学习。

模拟碰撞场景

1. 模拟碰撞场景

首先进行简单的碰撞过程模拟:使用一个可拖拽的div2去尝试碰撞一个固定的div1,两个元素均采用绝对定位方式布局。

碰撞检测原理分析

2. 碰撞检测原理分析

JavaScript碰撞检测原理及拖拽实现

如图所示,为div分别设置四个距离属性:L(left)、T(top)、R(right)和B(bottom)。对于div1,可以画出一个九宫格区域,当div2在除中心以外的8个格子中任意移动时,均不会发生碰撞。

JavaScript碰撞检测原理及拖拽实现

具体而言,只要满足以下任一条件,即可判定未发生碰撞:oDiv2.div2R小于oDiv1.div1L,或oDiv2.div2L大于oDiv1.div1R,或oDiv2.div2B小于oDiv1.div1T,或oDiv2.div2T大于oDiv1.div1B。

具体测试代码实现

3. 具体测试代码实现


<html>
<head>
 <title></title>
 <style type="text/css">
 body{margin: 0;padding: 0;}
 #div2{height: 100px;width: 200px;background-color: orange;position: absolute;left: 0px;top:0px;z-index: 1;}
 #div1{height: 100px;width: 100px;background-color: #a6e22e;position: absolute;left: 600px;top:400px;}
 </style>
 <script type="text/javascript">
 //获取对象样式属性值
 function getObjStyle(obj,attr)
 {
  return getComputedStyle(obj)?getComputedStyle(obj)[attr]:obj.currentStyle[attr];
 }
 </script>
 <script type="text/javascript">
 window.οnlοad=function (){
  var oDiv1=document.getElementById('div1');
  var oDiv2=document.getElementById('div2');



  oDiv2.οnmοusedοwn=function (onEvent,obj){//对div1实现拖拽,并对碰撞进行检测
   obj=this;
   var ev=onEvent||event;
   var distance={};
   distance.disX=ev.clientX-obj.offsetLeft;//到左边框的距离
   distance.disY=ev.clientY-obj.offsetTop;//到上边框的距离

   //获取div1的四个值
   oDiv1.div1L=getObjStyle(oDiv1,'left');
   oDiv1.div1R=parseInt(getObjStyle(oDiv1,'left'))+parseInt(getObjStyle(oDiv1,'width'))+'px';
   oDiv1.div1T=getObjStyle(oDiv1,'top');
   oDiv1.div1B=parseInt(getObjStyle(oDiv1,'top'))+parseInt(getObjStyle(oDiv1,'height'))+'px';




   if(obj.setCapture)
    obj.setCapture();

   document.οnmοusemοve=function (onEvent){
    var ev=onEvent||event;
    obj.style.left=ev.clientX-distance.disX+'px';
    obj.style.top=ev.clientY-distance.disY+'px';

    //获取div2的四个值
    oDiv2.div2L=getObjStyle(oDiv2,'left');
    oDiv2.div2R=parseInt(getObjStyle(oDiv2,'left'))+parseInt(getObjStyle(oDiv2,'width'))+'px';
    oDiv2.div2T=getObjStyle(oDiv2,'top');
    oDiv2.div2B=parseInt(getObjStyle(oDiv2,'top'))+parseInt(getObjStyle(oDiv2,'height'))+'px';

    /*console.log('oDiv2.div2L:'+oDiv2.div2L+' oDiv2.div2R:'+oDiv2.div2R+' oDiv2.div2T:'+oDiv2.div2T+' oDiv2.div2B:'+oDiv2.div2B);*/

    //碰撞检测
    if(oDiv2.div2R<oDiv1.div1L || oDiv2.div2L>oDiv1.div1R || oDiv2.div2B<oDiv1.div1T || oDiv2.div2T>oDiv1.div1B){
     //未发送碰撞
    }else{
     //发生碰撞
     alert('发生碰撞');
    }

   }

   document.οnmοuseup=function (){
    document.οnmοuseup=document.οnmοusemοve=null;
    if(obj.setCapture)
     obj.releaseCapture();
   }
   return false;
  }
 }
 </script>
</head>
<body>
 <div id="div2">div2</div>
 <div id="div1">div1</div>
</body>
</html>

以上为本文的全部内容,希望对读者的学习有所帮助,也欢迎大家继续支持本站。

作者最新文章