#javascript #css #css3 #z_index
Возможно ли определить перекрытие элемента другим элементом, при условии что не известен элемент который будет перекрывать? var e = document.getElementById('e'); var eR = e.getBoundingClientRect(); var all = document.getElementsByTagName('*'); for (var i=0, max=all.length; i < max; i++) { var cR = all[i].getBoundingClientRect(); if(all[i] != e) { if (((cR.top <= eR.top) && (eR.top <= cR.bottom)) && ((cR.top <= eR.bottom) && (eR.bottom <= cR.bottom)) && ((cR.left <= eR.left) && (eR.left <= cR.right)) && ((cR.left <= eR.right) && (eR.right <= cR.right))) { //var inside = true; var style = window.getComputedStyle ? getComputedStyle(all[i]) : all[i].currentStyle; if(style.zIndex >= 1) { var overlap = true; console.log(style.zIndex); } } } } .wrap { width:700px; overflow:hidden; height:600px; background-color:yellow; z-index:9999; } .behind { position: absolute; left:8px; top:0px; width:468px; height:160px; background-color:rgba(255, 0, 0, 0.71); z-index: 999; } .container { background-color:black; left:20px; top:50px; width:468px; height:60px; color:#fff; }Пример на JSFiddle UPD Вот что получилось, проблема в том, что если у родителя (.wrap) стоит z-index >0 он не перекрывает потомка (.container), а скрипт проверяет это условие и получается ложное перекрытие. Я правильно понимаю что родитель может перекрыть потомка только если у потомка отрицательный z-index?ad
Ответы
Ответ 1
Как вариант, можно получить х,у координаты нашего "container" элемента и его х,у + его размер. Далее, пройтись циклом по всему DOM (по всем элементам, исключая наш "container") и проверять их координаты учитывая размеры и параметр z-index, который должен быть меньше чем у "container" в случае если есть совпадения координат. Это все можно или на Javascript сделать, или с JQuery. Например, с JQuery: http://www.sitepoint.com/jquery-coordinates-element/ var ctrxCoord = $(".container").offset().left; var ctryCoord = $(".container").offset().top; var ctrwidthCoord = ctrxCoord + $(".container").width(); var ctrheightCoord = ctryCoord + $(".container").height(); Нужно проверить, возможно, для добавления, нужно делать с parseInt(ctryCoord) ... Больше информации (англ.): https://stackoverflow.com/a/21274679/873481 и http://www.dyn-web.com/javascript/element-location/ Думаю, комментарий cyadvert может также быть верным. Еще вариант - document.elementFromPoint https://stackoverflow.com/a/3942852/873481Ответ 2
Можно получить точки для прямоугольника через offset и длину/ширину элемента и по ним определить пересечение. $(document).ready(function(){ function getPositionRect(jObject){ return { x0 : jObject.offset().top, y0 : jObject.offset().left, x1 : jObject.offset().top + jObject.width(), y1 : jObject.offset().left + jObject.height() }; } function intersects(a, b){ return ( a.y0 < b.y1 || a.y1 > b.y0 || a.x1 < b.x0 || a.x0 > b.x1 ); } var overlap = $($('.overlap').eq(0)), container = $($('.container').eq(0)); console.log( intersects(getPositionRect(overlap),getPositionRect(container)) ); });Ответ 3
Можно заюзать такой метод: https://developer.mozilla.org/ru/docs/Web/API/Element/getBoundingClientRect вернёт координаты прямоугольников. А там уже легко проверить пересечение.
Комментариев нет:
Отправить комментарий