前面的话
前面分别介绍了和,当可视区域内存在多个可拖拽元素,就出现碰撞检测的问题,这也是javascript动画的一个经典问题。本篇将详细介绍碰撞检测
原理介绍
碰撞检测的方法有很多,接下来使用九宫格分析法
假设黄色元素要与红色元素进行碰撞。将红色元素所处的区域分为9部分,自身处于第9部分,周围还存在8个部分。只要黄色元素进入红色元素的第9部分,就算碰撞。否则,都算未碰撞
总共分为以下5种情况:
1、处于上侧未碰撞区域——1、2、3区域
2、处于右侧未碰撞区域——3、4、5区域
3、处于下侧未碰撞区域——5、6、7区域
4、处于左侧未碰撞区域——1、7、8区域
5、处于碰撞区域——9区域
代码实现
我们把上面的原理用代码实现
function bump(obj,objOther,bgColor){ /***被碰元素***/ //被碰元素左侧距离可视区域左侧的距离 var L0 = obj.offsetLeft; //被碰元素上侧距离可视区域上侧的距离 var T0 = obj.offsetTop; //被碰元素右侧距离可视区域右侧的距离 var R0 = obj.offsetLeft + obj.offsetWidth; //被碰元素下侧距离可视区域下侧的距离 var B0 = obj.offsetTop + obj.offsetHeight; /**侵入元素**/ var L = objOther.offsetLeft; var T = objOther.offsetTop; var R = objOther.offsetLeft + objOther.offsetWidth; var B = objOther.offsetTop + objOther.offsetHeight; /*******碰撞检测*******/ //上侧区域if(B < T0) //左侧区域if(R < L0) //右侧区域if(L > R0) //下侧区域if(T > B0) //碰撞区域 if(B >= T0 && R >= L0 && L <= R0 && T <= B0){ obj.style.backgroundColor = 'red'; }else{ obj.style.backgroundColor = bgColor; }}
完整效果
元素一元素二