Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Определить, перекрыт ли блок. (https://javascript.ru/forum/events/50989-opredelit-perekryt-li-blok.html)

zhurchik 20.10.2014 10:57

Определить, перекрыт ли блок.
 
Приветствую.
Возможно ли средствами JS определить, перекрывается блок А блоком B?
К примеру, я использую позиционирование и у меня имеется 10 блоков, блоки перекрывают друг друга не полностью.
Так вот, можно ли при наведении мыши на тот или иной блок определить перекрыть он другим или нет?

BETEPAH 20.10.2014 11:24

Блоки прямоугольные?
Если хотя бы одна из вершин находится внутри другого блока, значит перекрывают.

zhurchik 20.10.2014 11:32

BETEPAH,
Да, прямоугольные.
А как определить, что одна из вершин находится внутри другого блока?

BETEPAH 20.10.2014 12:05

zhurchik,
по координатам, вестимо.
Если у нас есть прямоугольник с вершинами TopLeft, TopRight, BottomLeft, BottomRight, проверяем входит ли в него точка Point:
(Point.x > TopLeft.x && Point.x < TopRight.x && Point.y > TopLeft.y && Point.y < BottomLeft.y)

danik.js 20.10.2014 12:52

<meta charset="UTF-8" />
<style>
    #a, #b{
        position: absolute;
        width: 100px;
        height: 100px;
    }
    #a{
        top: 120px;
        left: 120px;
        background: rgba(255, 0, 0, 0.5);
        cursor: move;
        z-index: 1;
    }
    #b{
        top: 10px;
        left: 10px;
        background: rgba(0, 255, 0, 0.5);
        z-index: 0;
    }
</style>
<div id="a"></div>
<div id="b"></div>
<div id="info"></div>
<script>
    var offsetX;
    var offsetY;
    function drag(e) {
        a.style.top = e.pageY - offsetY + 'px';
        a.style.left = e.pageX - offsetX + 'px';
    }
    a.addEventListener('mousedown', function(e) {
        offsetX = e.layerX;
        offsetY = e.layerY;
        document.addEventListener('mousemove', drag);
        e.preventDefault();
    });
    document.addEventListener('mouseup', function() {
        document.removeEventListener('mousemove', drag);
    });
    document.addEventListener('mousemove', function(e) {
        var point = {x: e.pageX, y: e.pageY};
        if (isPointInRect(point, a.getBoundingClientRect()) && isPointInRect(point, b.getBoundingClientRect())) {
            info.textContent = 'Пересекает';
        } else {
            info.textContent = 'Не пересекает';
        }
    })

    function isPointInRect(point, rect) {
        return (
            point.x >= rect.left && point.x <= rect.left + rect.width
            && point.y >= rect.top && point.y <= rect.top + rect.height
        );
    }
</script>


Часовой пояс GMT +3, время: 13:58.