如何在不点击任何内容的情况下查看一个元素是否在JavaScript中触及另一个元素

问题描述 投票:0回答:1

好的,所以我从一个不同的问题尝试了一件事,但是它有效,但不是我想要的方式。它没有按照我想要的方式工作!当两个物体碰到时,你真的不得不点击它,它会提醒你,如果有人能找到一种方法来检测两个元素是否触摸而不必点击那将是一个救生员!所以我希望你读过这个请求的人如果你知道如何请回复。这是下面的代码。所以一个物体正在移动,我希望它在物体撞击玩家时停止(我正在制作游戏)运动是通过px ....我想让它继续测试一个物体是否击中了玩家,如果我希望它能阻止一切。

var boxes = document.querySelectorAll('.box');

boxes.forEach(function (el) {
  if (el.addEventListener) {
      el.addEventListener('click', clickHandler);
  } else {
      el.attachEvent('onclick', clickHandler);
  }
})

var detectOverlap = (function () {
    function getPositions(elem) {
        var pos = elem.getBoundingClientRect();
        return [[pos.left, pos.right], [pos.top, pos.bottom]];
    }

    function comparePositions(p1, p2) {
        var r1, r2;
        if (p1[0] < p2[0]) {
          r1 = p1;
          r2 = p2;
        } else {
          r1 = p2;
          r2 = p1;
        }
        return r1[1] > r2[0] || r1[0] === r2[0];
    }

    return function (a, b) {
        var pos1 = getPositions(a),
            pos2 = getPositions(b);
        return comparePositions(pos1[0], pos2[0]) && comparePositions(pos1[1], pos2[1]);
    };
})();
function clickHandler(e) {

    var elem     = e.target,
        elems    = document.querySelectorAll('.box'),
        elemList = Array.prototype.slice.call(elems),
        within   = elemList.indexOf(elem),
        touching = [];
    if (within !== -1) {
        elemList.splice(within, 1);
    }
    for (var i = 0; i < elemList.length; i++) {
        if (detectOverlap(elem, elemList[i])) {
            touching.push(elemList[i].id);
        }
    }
    if (touching.length) {
        console.log(elem.id + ' touches ' + touching.join(' and ') + '.');
        alert(elem.id + ' touches ' + touching.join(' and ') + '.');
    } else {
        console.log(elem.id + ' touches nothing.');
        alert(elem.id + ' touches nothing.');
    }

}

这是我现在的视频游戏(请不要复制)

<!DOCTYPE html>
/
<html>
  <form id="player" class="box">
  </form>
  <button type="button" class="up" onclick="moveup()">^</button>
  <button type="button" class="down" onclick="movedown()">v
  </button>
<style src="style.css">
    #player {
width: 300px;
height: 100px;
background-color: blue;
 display: inline-block;
position: relative;
bottom: -250px;
left: 200px;


}
 .up {
 position: relative; 
 bottom: -400px;
  




 }
 .down {
 position: relative; 
 bottom: -420px;
 



 }
 body {
 background-color: black;



 }
 #car {
 width: 300px;
height: 100px;
background-color: red;
 display: inline-block;
position: relative;
bottom: -250px;
left: 600px;


 }
  </style>
  <form id="car" class="box"></form>
  <script>
  imgObj = document.getElementById('player');
imgObj.style.position= 'relative'; 
imgObj.style.bottom = '-250px'; 


function moveup() {
  imgObj.style.position= 'relative'; 
imgObj.style.bottom = '-250px'; 
  imgObj.style.bottom = parseInt(imgObj.style.bottom) + 70 + 'px';




}
function movedown() {
  imgObj.style.position= 'relative'; 
imgObj.style.bottom = '-250px'; 

 imgObj.style.bottom = parseInt(imgObj.style.bottom) + -120 + 'px';



}
myMove();
function myMove() {
  var elem = document.getElementById("car");   
  var pos = 0;
  var id = setInterval(frame, 5);
  function frame() {
    if (pos == 1000) {
      clearInterval(id);
      myMove();
    } else {
      pos++; 
      elem.style.left = pos + "px"; 
      elem.style.left = pos + "px"; 
  }
  }
  }
/* please do not copy; this is it so far i want the red box when it hits the player(blue box) to stop everything that is happening */
/* made by Jsscripter; car game */
  
 </script>
   </html>
javascript html
1个回答
0
投票

交叉口观察员。 API主要是由于新闻提要和无限滚动而开发的。目标是解决什么时候进入视图,加载内容。也非常适合游戏。

Intersection Observer API允许代码注册一个回调函数,该函数在他们希望监视的元素进入或退出另一个元素(或视口)时执行,或者当两者相交的数量按请求的数量变化时执行。这样,站点不再需要在主线程上执行任何操作来观察这种元素交集,并且浏览器可以自由地优化交叉点的管理。

https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API

除safari之外的所有主要浏览器都支持API。为了向后兼容,Safari支持可以使用W3C发现的here的polyfill。看看MDN的这个例子:

var callback = function(entries, observer) { 
  entries.forEach(entry => {
    // Each entry describes an intersection change for one observed
    // target element:
    //   entry.boundingClientRect
    //   entry.intersectionRatio
    //   entry.intersectionRect
    //   entry.isIntersecting
    //   entry.rootBounds
    //   entry.target
    //   entry.time
  });
};

var options = {
  root: document.querySelector('#scrollArea'),
  rootMargin: '0px',
  threshold: 1.0
}

var observer = new IntersectionObserver(callback, options);

var target = document.querySelector('#listItem');

observer.observe(target);

在这里看到这个:https://codepen.io/anon/pen/OqpeMV

© www.soinside.com 2019 - 2024. All rights reserved.