如何检测元素是否被另一个元素覆盖/重叠?

时间:2015-09-22 09:25:52

标签: javascript jquery

我有一个问题,我想检测一个元素是否被一个页面中的另一个元素覆盖。

例如:

DOM elements
<div class="ele ele1"><p>A</p></div>
<div class="ele ele2"><p>B</p></div>
<div class="ele ele3"><p>C</p></div>
<div class="cover"><p>D</p></div>


CSS style
.ele{
   display: inline-block;
   width: 100px;
   height: 100px;
   position: relative;
}
p{   
  width: 100%;
  text-align: center;
}
.ele1{
  background-color: red;
}
.ele2{
  background-color: blue;
}
.ele3{
  background-color: green;
}
.cover{
   position: absolute;
   width: 100px;
   height: 100px;
   left: 300px;
   top: 10px;
   background: grey;
}

http://jsfiddle.net/veraWei/6v89b1fy/

如何检测元素A没有被覆盖,但元素C被ele D覆盖? 还有一件事:&#34; D&#34;不确定。也许页面上有E / F / G ...... 我感谢所有的想法或现有的例子/ jQuery插件/ CSS /等。

谢谢你们所有人&#39;详细的答案。但是我需要更多简短的解释可能是一个属性,表明A没有被任何元素覆盖,C被渲染覆盖。是否存在任何插件或属性?

4 个答案:

答案 0 :(得分:8)

为什么不尝试以下方法:

1)找到相对于视口的元素位置:

rect=elt.getBoundingClientRect();
x=rect.left;
y=rect.top;

(或者可以考虑中点坐标)

2)找到位置x,y的顶部元素:

topElt=document.elementFromPoint(x,y);

3)检查顶部元素是否与原始元素相同:

if(elt.isSameNode(topElt)) console.log('no overlapping');

答案 1 :(得分:3)

你在找这样的东西吗?

http://jsfiddle.net/6v89b1fy/4/

var coverElem = $(".cover");
var elemArray = [];
elemArray.push($(".ele1"), $(".ele2"), $(".ele3"));

for(i=0; i< elemArray.length; i++)
{
    var currElemOffset = elemArray[i].offset();
    var currElemWidth = elemArray[i].width();

    var currElemStPoint = currElemOffset.left ;
    var currElemEndPoint = currElemStPoint + currElemWidth;


    if(currElemStPoint <= coverElem.offset().left &&  coverElem.offset().left <=  currElemEndPoint)
    {
        elemArray[i].append("<span>Covered</span>");
    }
    else
    {
        elemArray[i].append("<span>Not covered</span>");
    }
}

答案 2 :(得分:2)

以下是您可以如何进行此操作的简单示例。这将检查两者垂直和水平重叠。这是一种通用的,而且不那么通用,因为这是基于您的问题中的HTML。调整.cover的左/右值,使其适用于所有可能的情况。

var $cover = $(".cover"),
  cWidth = $cover.width(),
  cHeight = $cover.height(),
  cLeft = $cover.offset().left,
  cRight = $(window).width() - (cLeft + cWidth),
  cTop = $cover.offset().top,
  cBtm = $(window).height() - (cTop + cHeight);

$("div:not(.cover)").each(function() {

  var $this = $(this),
    eleWidth = $this.width(),
    eleHeight = $this.height(),
    eleLeft = $this.offset().left,
    eleTop = $this.offset().top,
    eleRight = $(window).width() - (eleLeft + eleWidth),
    eleBtm = $(window).height() - (eleTop + eleHeight);

  if (
    cLeft < (eleLeft + eleWidth) &&
    cRight < (eleRight + eleWidth) &&
    cTop < (eleTop + eleHeight) &&
    cBtm < (eleBtm + eleHeight)
  ) {
    alert($this.text() + " is covered by " + $cover.text());
  }
});
.ele {
  display: inline-block;
  width: 100px;
  height: 100px;
  position: relative;
  margin-top: 40px;
}
p {
  width: 100%;
  text-align: center;
}
.ele1 {
  background-color: red;
}
.ele2 {
  background-color: blue;
}
.ele3 {
  background-color: green;
}
.cover {
  position: absolute;
  width: 100px;
  height: 100px;
  left: 60px;
  top: 110px;
  background: grey;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="ele ele1">
  <p>A</p>
</div>
<div class="ele ele2">
  <p>B</p>
</div>
<div class="ele ele3">
  <p>C</p>
</div>
<div class="ele ele3">
  <p>D</p>
</div>
<div class="ele ele3">
  <p>E</p>
</div>
<div class="ele ele3">
  <p>F</p>
</div>
<div class="ele ele3">
  <p>G</p>
</div>
<div class="cover">
  <p>COVER</p>
</div>

答案 3 :(得分:0)

行。我已经完成 所有重叠 的情况,并让创建了此fiddle 。我已使用MySQL PostgreSQL ----- ---------- view_01 <- table_01 并使用它来获取两个getBoundintClientRect()的{​​{1}},topleftbottom个值要检查哪个重叠,然后我使用各种条件语句和条件来比较偏移量,您将在下面找到它们。在小提琴中,你的所有四个元素都有right,调整它们的divposition: absolute值以使它们相互重叠并检查两个元素是否重叠?传递函数中的两个元素 -

top

这是最后一次。

您将在小提琴中看到长left checkElements(elA, elB); // pass two elements to check 条件,它们仅用于测试所有重叠的可能性。这是用于检查重叠的所有可能条件 -

if

您还将看到B是否重叠A然后它将写入A被覆盖,因为我使用A和B的x和y坐标进行比较。在这种情况下,我认为另外一个将使用条件检查else。我没有为此创造。

检查fiddle,调整不同元素的if((eleB.top >= eleA.top && eleB.top <= eleA.bottom) || (eleB.bottom >= eleA.top && eleB.bottom <= eleA.bottom)) { if((eleB.left >= eleA.left && eleB.left <= eleA.right) || (eleB.right >= eleA.left && eleB.right <= eleA.right)) { el1.innerHTML = '<p>covered</p>'; } else { el1.innerHTML = '<p>not covered</p>'; } } else { el1.innerHTML = '<p>not covered</p>'; } z-index值,然后在函数top中传递两个元素,看看结果是否正确。

您也可以同时进行所有检查 -

left

使用多重检查功能查看此fiddle

编辑:如果问题出现循环,那么您可以将checkElements() checkElements(elA, elB); // check if A is overlapped by B checkElements(elB, elC); // check if B is overlapped by C checkElements(elC, elD); // check if C is overlapped by D 的所有循环合并为一个if else这个 -

if

Updated fiddle