В общем, правильный вариант сложный, требует учитывать много деталей (подробнее по ссылкам из вопроса).
Для двух элементов можно воспользоваться функцией
document.elementFromPoint.
Как то так:
function isElementOver(el1: HTMLElement, el2: HTMLElement) {
const rect1 = el1.getBoundingClientRect();
const rect2 = el2.getBoundingClientRect();
const left = Math.max(rect1.left, rect2.left);
const top = Math.min(rect2.top, rect1.top);
const right = Math.min(rect2.right, rect1.right);
const bottom = Math.max(rect2.bottom, rect1.bottom);
const width = right - left;
const height = bottom - top;
if (width < 0 || height < 0) {
return false;
}
const el = document.elementFromPoint(left + width / 2, top + height / 2) as HTMLElement;
if (el === el1) {
return true;
} else if (el === el2) {
return false;
} else {
return null;
}
}