javascript - 如何通过另一个元素检测鼠标悬停?

标签 javascript html css hover

我有一个区域 map ,如果某个区域悬停(JavaScript),我会在其中显示箭头。
正如您在片段中看到的那样,有“Kinderland”和“Spacecenter”。
我想要做的是,如果您将鼠标悬停在“Kinderland”上,并且“Spacecenter”箭头位于它前面(代码段 3),则会出现“Kinderland”箭头。

enter image description here

这是一个 JSFiddle:
https://jsfiddle.net/rjq9pu6L/17/

<!doctype html>
<html class="no-js" lang="de">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <title>Untitled Document</title>

<style>
.none {
display: none;
}

#mapMainWrap {
width: 360px;
height: 150px;
background-image:url(https://i.postimg.cc/rpskZ4GZ/map.png);
}

.map {
z-index:50;
}

.maptrans {
z-index:30;
}

.mapMainArrow {
z-index:10;
}

#mapMainArrows {
width:201px;
height:22px;
position:absolute;
top:0;
left:0;
}

#mapMainArrows.mapMainArea1Arrow {
top:70px;
left:60px;
}

#mapMainArrows.mapMainArea2Arrow {
top:70px;
left:190px;
}
</style>
</head>

<body>

<div id="mapMainWrap">

  <div id="mapMainArrows">
    <img id="mapMainArea1Arrow" class="none mapMainArrow" src="https://i.postimg.cc/wMyQj9KQ/area1-ar.png" width="201" height="22" alt="Area 1">
    <img id="mapMainArea2Arrow" class="none mapMainArrow" src="https://i.postimg.cc/Qdb4PxjF/area2-ar.png" width="201" height="22" alt="Area 2">
  </div>

  <img src="https://i.postimg.cc/ZqNmpdrG/maptrans.png" class="maptrans" width="360" height="150" alt="Map" usemap="#mapmain">
  <map name="mapmain" class="map">
      <area id="mapMainArea1" alt="Area 1" href="javascript:void(0)" coords="60,3,8,46,3,135,23,146,86,148,91,105,133,94,137,7" shape="poly">
      <area id="mapMainArea2" alt="Area 2" href="javascript:void(0)" coords="167,26,163,30,170,37,169,68,151,107,185,123,219,51,196,37" shape="poly">
  </map>

</div>

<script>
const mapMainArrows = document.getElementById('mapMainArrows');
const mapMainArrow = document.getElementsByClassName('mapMainArrow');
var imapMainArrow;
function hideMapMainArrow () {
  for (imapMainArrow = 0; imapMainArrow < mapMainArrow.length; imapMainArrow++) {
    mapMainArrow[imapMainArrow].classList.add("none");
  }
}

// Area 1
const mapMainArea1 = document.getElementById('mapMainArea1');
const mapMainArea1Arrow = document.getElementById('mapMainArea1Arrow');
mapMainArea1.addEventListener('mouseover', function() {
  hideMapMainArrow();
  mapMainArrows.className = "";
  mapMainArrows.classList.add("mapMainArea1Arrow");
  mapMainArea1Arrow.classList.remove("none");
}, false);

// Area 2
const mapMainArea2 = document.getElementById('mapMainArea2');
const mapMainArea2Arrow = document.getElementById('mapMainArea2Arrow');
mapMainArea2.addEventListener('mouseover', function() {
  hideMapMainArrow();
  mapMainArrows.className = "";
  mapMainArrows.classList.add("mapMainArea2Arrow");
  mapMainArea2Arrow.classList.remove("none");
}, false);
</script>
</body>
</html>

最佳答案

假设您不需要能够点击箭头内的任何内容:

您使用 CSS rule pointer-events: none; 在箭头上,这将防止箭头捕获事件并允许它传递到下方的 map (并触发您的 mouseover 事件听众)

我从你的代码片段中唯一改变的是 #mapMainArrows

的 CSS

const mapMainArrows = document.getElementById('mapMainArrows');
const mapMainArrow = document.getElementsByClassName('mapMainArrow');
var imapMainArrow;

function hideMapMainArrow() {
  for (imapMainArrow = 0; imapMainArrow < mapMainArrow.length; imapMainArrow++) {
    mapMainArrow[imapMainArrow].classList.add("none");
  }
}

// Area 1
const mapMainArea1 = document.getElementById('mapMainArea1');
const mapMainArea1Arrow = document.getElementById('mapMainArea1Arrow');
mapMainArea1.addEventListener('mouseover', function() {
  hideMapMainArrow();
  mapMainArrows.className = "";
  mapMainArrows.classList.add("mapMainArea1Arrow");
  mapMainArea1Arrow.classList.remove("none");
}, false);

// Area 2
const mapMainArea2 = document.getElementById('mapMainArea2');
const mapMainArea2Arrow = document.getElementById('mapMainArea2Arrow');
mapMainArea2.addEventListener('mouseover', function() {
  hideMapMainArrow();
  mapMainArrows.className = "";
  mapMainArrows.classList.add("mapMainArea2Arrow");
  mapMainArea2Arrow.classList.remove("none");
}, false);
.none {
  display: none;
}

#mapMainWrap {
  width: 360px;
  height: 150px;
  background-image: url(https://i.postimg.cc/rpskZ4GZ/map.png);
}

.map {
  z-index: 50;
}

.maptrans {
  z-index: 30;
}

.mapMainArrow {
  z-index: 10;
}

#mapMainArrows {
  width: 201px;
  height: 22px;
  position: absolute;
  top: 0;
  left: 0;
  pointer-events: none;
}

#mapMainArrows.mapMainArea1Arrow {
  top: 70px;
  left: 60px;
}

#mapMainArrows.mapMainArea2Arrow {
  top: 70px;
  left: 190px;
}
<div id="mapMainWrap">

  <div id="mapMainArrows">
    <img id="mapMainArea1Arrow" class="none mapMainArrow" src="https://i.postimg.cc/wMyQj9KQ/area1-ar.png" width="201" height="22" alt="Area 1">
    <img id="mapMainArea2Arrow" class="none mapMainArrow" src="https://i.postimg.cc/Qdb4PxjF/area2-ar.png" width="201" height="22" alt="Area 2">
  </div>

  <img src="https://i.postimg.cc/ZqNmpdrG/maptrans.png" class="maptrans" width="360" height="150" alt="Map" usemap="#mapmain">
  <map name="mapmain" class="map">
      <area id="mapMainArea1" alt="Area 1" href="javascript:void(0)" coords="60,3,8,46,3,135,23,146,86,148,91,105,133,94,137,7" shape="poly">
      <area id="mapMainArea2" alt="Area 2" href="javascript:void(0)" coords="167,26,163,30,170,37,169,68,151,107,185,123,219,51,196,37" shape="poly">
  </map>

</div>

关于javascript - 如何通过另一个元素检测鼠标悬停?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58412421/

相关文章:

javascript - 如何设置列和容器的最大高度以便图像适合 bootstrap 4 中的整个页面?

javascript - 使用 Alloy UI 显示 JSON 数据

javascript - Promise 响应参数丢失

jquery - 我如何强制 Internet Explorer 遮蔽输入字段的占位符

php - 3 列 CSS 中的 Foreach 查询

html - Chrome 在设置了边框半径的高大对象左侧使用了错误的边框颜色

javascript - IE 中使用 ES6 箭头函数的语法错误

javascript - Navbar Menu如何实现平滑的下滑效果

html - HTML5 Polyfill 和 Fallback 有什么不同?

html - swf导致溢出