我如何检测一个Div是否在另一个Div之外?

时间:2017-11-16 17:21:55

标签: javascript html javascript-events mouseover

我正在制作一个游戏而我正在使用div而不是canvas.rect's我想要一个div总是在另一个div内。当我制作一个看起来像这样的测试脚本时,我遇到了这个问题。

        var mousex, mousey;
          function mousepos(e){
            mousex = e.clientX;
            mousey = e.clientY;
            document.getElementById("xy").innerText = mousex + " , " + mousey;
          }
          function testdiv(){
            document.getElementById("testdiv").style.left = mousex;
            document.getElementById("testdiv").style.top = mousey;
            setTimeout(testdiv, 30);
          }
          #city{
            border: 1px dotted white;
            background-color: lightgreen;
            height: 500;
            width: 500;
            resize: both;
            overflow: hidden;
            max-height: 500px;
            max-width: 500px;
            min-height: 100px;
            min-width: 100px;
          }
          #xy{
            color: white;
          }
          #testdiv{
            background-color: white;
            position: absolute;
            width: 100px;
            height: 100px;
          }
          #body{
            background-color: black;
          }
    <body id="body" onload="testdiv()">
        <center>
          <div id="city" onmousemove="mousepos(event);">
            <div id="testdiv"></div>
          </div>
          <p id="xy"></p>
        </center>
     </body>

当鼠标悬停在大绿色div上时,代码检测到鼠标X和鼠标Y,然后它将鼠标的左角放在鼠标X和鼠标Y上。我的问题是当我的鼠标拖动白色div时向下或向右,我可以将它拖离绿色div。

我有办法解决这个问题吗?

4 个答案:

答案 0 :(得分:0)

由于当前JS中没有受支持的父选择器。

你可以使用Jquery或CSS,我列出了Javascript选项和CSS选项

  1. 选项1:$("a.active").parents('li').css("property", "value");
  2. 选项2:Sibling Combination以匹配任何ParentElementChildElement元素开头的元素。

    // Just change the parent and child elemets below ParentElement ~ ChildElement { property: value; }

答案 1 :(得分:0)

您可以在更改子div位置之前进行检查,如果其新位置超出您想要的位置,您可以跳过它。

类似的东西:

if (mouse.x > parent_div_width){
    return;
}
else {
   child_div_Xpos = mouse.x
}

答案 2 :(得分:0)

您可以尝试以下代码:

  var mousex, mousey;

function mousepos(e) {
    mousex = e.clientX;
    mousey = e.clientY;
    document.getElementById("xy").innerText = mousex + " , " + mousey;
}
var coordCity = document.getElementById("city").getBoundingClientRect();
var elem = document.getElementById("testdiv");
let i = 0

function testdiv() {
    elem.style.left = mousex + 'px';
    elem.style.top = mousey + 'px';
    var coord = elem.getBoundingClientRect();
    if(coord.left < coordCity.left ||
      coord.right > coordCity.right ||
      coord.bottom > coordCity.bottom || 
      coord.top < coordCity.top) {
      console.log('rect is out');
    };
    i++;
    if(i === 100) {
        return;
    }
    setTimeout(testdiv, 50);
}

您需要在css px中添加宽度和高度值:

#city{
            border: 1px dotted white;
            background-color: lightgreen;
            height: 500px;
            width: 500px;
            resize: both;
            overflow: hidden;
            max-height: 500px;
            max-width: 500px;
            min-height: 100px;
            min-width: 100px;
          }

并且总是将节点保存到变量,因为它使代码更快,我使用变量i进行停止测试。您可以使用其他解决方案。 我创建了下一个app: https://codepen.io/piotrazsko/pen/VrrZBq

答案 3 :(得分:0)

我想出了一个简单,更易理解的方法。

我为testdiv的宽度,高度,x,y,x偏移创建了一个变量 鼠标,y偏离鼠标。

var divw = 50;
var divh = 50;

var divofx = 25;
var divofy = 25;

然后我为城市divs宽度做了一个变量。

var cityw = 500;

然后,我使用screen.width / 2来查找屏幕的中心。

var centerx = screen.width / 2;

然后,我通过将下面的代码放入main函数,随时改变了testdiv的大小:

document.getElementById("testdiv").style.width = divw;
document.getElementById("testdiv").style.height = divh;

然后我使用width变量来查找城市div的边缘。

然后,基于边缘,我做了一些简单的碰撞检测if语句。我也不需要改变Y mutch,因为它相当不变。

        if(mousex + divw > centerx + (cityw / 2)){
          mousex = centerx + (cityw / 2) - divw;
        }
        else{
          document.getElementById("testdiv").style.left = mousex;
        }
        if(mousey > (cityw - divh) + 10){
          mousey = (cityw - divh) + 10;
        }
        else{
          document.getElementById("testdiv").style.top = mousey;
        }
        if(mousex < centerx - cityw / 2){
          mousex = centerx - cityw / 2;
        }
        if(mousey < 8){
          mousey = 8;
        }
        setTimeout(testdiv, 1);

现在整个程序看起来像:

<html>

  <head>

    <style>

      #city{
        border: 1px dotted white;
        background-color: lightgreen;
        height: 500;
        width: 500;
        overflow: none;
        max-height: 500px;
        max-width: 500px;
        min-height: 100px;
        min-width: 100px;
      }
      #xy{
        color: white;
      }
      #testdiv{
        background-color: white;
        position: absolute;
        width: 100px;
        height: 100px;
      }
      #body{
        background-color: black;
      }

    </style>
    <script>

    var mousex, mousey;
    var divw = 50;
    var divh = 50;
    var divofx = 25;
    var divofy = 25;
    var cityw = 500;

      function mousepos(e){
        mousex = e.clientX - divofx;
        mousey = e.clientY - divofy;
        document.getElementById("xy").innerText = mousex + " , " + mousey;
      }

      function testdiv(){
        var centerx = screen.width / 2;

        document.getElementById("city").style.width = cityw;
        document.getElementById("testdiv").style.width = divw;
        document.getElementById("testdiv").style.height = divh;

        if(mousex + divw > centerx + (cityw / 2)){
          mousex = centerx + (cityw / 2) - divw;
        }
        else{
          document.getElementById("testdiv").style.left = mousex;
        }
        if(mousey > (cityw - divh) + 10){
          mousey = (cityw - divh) + 10;
        }
        else{
          document.getElementById("testdiv").style.top = mousey;
        }
        if(mousex < centerx - cityw / 2){
          mousex = centerx - cityw / 2;
        }
        if(mousey < 8){
          mousey = 8;
        }
        setTimeout(testdiv, 1);
      }

    </script>

  </head>

  <body id="body" onload="testdiv()" onmousemove="mousepos(event);">

    <center>
      <div id="city" onmousemove="mousepos(event);">
        <div id="testdiv"></div>
      </div>

      <p id="xy"></p>
    </center>

  </body>

</html>