元素碰撞
视频教程
文字教程
视频里有两种, 我觉得视频中第二种判断的局限性有点大就不记录了
实现的原理是通过四边来做判断, 一共有四种情况(左上右下)
提示
橙色的是 domA
绿色的是 domB
左测的情况
这里如果没有碰上
那也就是说 domA
的 右上角 要小于 domB
的 左上角
也就是说: domA.offsetLeft + domA.offsetWidth < domB.offsetLeft
上测的情况
和左侧一样
也就是说 domA
的 左下角 要小于 domB
的 左上角
也就是说: domA.offsetTop + domA.offsetHeight < domB.offsetTop
右测的情况
和左侧一样
也就是说 domA
的 左上角 要大于 domB
的 右上角
也就是说: domA.offsetLeft > domB.offsetLeft + domB.offsetWidth
下测的情况
和左侧一样
也就是说 domA
的 左上角 要大于 domB
的 左下角
也就是说: domA.offsetTop > domB.offsetTop + domB.offsetHeight
总结
所有情况合起来就可以封装成一个方法:
const checkCollision = (domA, domB) =>
!(
// 左侧
(
domA.offsetLeft + domA.offsetWidth < domB.offsetLeft ||
// 上侧
domA.offsetTop + domA.offsetHeight < domB.offsetTop ||
// 右侧
domA.offsetLeft > domB.offsetLeft + domB.offsetWidth ||
// 下侧
domA.offsetTop > domB.offsetTop + domB.offsetHeight
)
)