JavaScript碰撞检测原理及拖拽实现
作者:函数茶馆时间:2026-10-23 16:32:06浏览:637
本文详解JavaScript中碰撞检测的核心原理,通过九宫格模型解析两个绝对定位元素不发生碰撞的边界条件。结合可拖拽div与固定div的模拟场景,提供完整测试代码,帮助开发者理解并实现前端交互中的碰撞逻辑。
JavaScript碰撞检测原理及拖拽实现
本文分享JavaScript实现碰撞检测的具体代码,供读者参考学习。
模拟碰撞场景
1. 模拟碰撞场景
首先进行简单的碰撞过程模拟:使用一个可拖拽的div2去尝试碰撞一个固定的div1,两个元素均采用绝对定位方式布局。
碰撞检测原理分析
2. 碰撞检测原理分析

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

具体而言,只要满足以下任一条件,即可判定未发生碰撞: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>
以上为本文的全部内容,希望对读者的学习有所帮助,也欢迎大家继续支持本站。
作者最新文章
JS大数值转字符串出现科学计数法怎么办
2026-11-05 17:09:21
JS split切割后出现空字符串怎么过滤
2026-11-05 16:00:30
在 React 或 Vue 项目中封装使用 JS 节流防抖
2026-11-05 15:27:29
JavaScript中怎么将带小数的字符串转为整数?
2026-11-05 14:32:38
怎么用JavaScript策略模式重构电商促销计算逻辑?
2026-11-05 14:01:09
