我需要在将鼠标悬停在元素(触发器)上时显示 HTMLElement
并在离开同一元素时隐藏它。
工作示例
此处显示/隐藏元素未悬停在触发元素上。
var div = document.createElement("div");
div.className = "d";
document.body.appendChild(div);
var hov = document.createElement("div");
hov.className = "h";
var hover = false;
var overEvent = "mouseenter";
var overOut = "mouseleave";
div.addEventListener(overEvent, function(e) {
if (hover) return;
document.body.appendChild(hov);
hover = true;
console.log("OVER");
});
div.addEventListener(overOut, function(e) {
if (!hover) return;
document.body.removeChild(hov);
hover = false;
console.log("OUT");
});
.d {
width: 100px;
height: 100px;
background-color: #ff9900;
z-index: 0;
}
.h {
width: 100px;
height: 100px;
top: 150px;
bottom: 150px;
background-color: #000000;
opacity: 0.5;
z-index: 1;
}
div {
position: absolute;
}
不工作
这里,触发器被覆盖,事情变得奇怪:
var div = document.createElement("div");
div.className = "d";
document.body.appendChild(div);
var hov = document.createElement("div");
hov.className = "h";
var hover = false;
var overEvent = "mouseenter";
var overOut = "mouseleave";
div.addEventListener(overEvent, function(e) {
if (hover) return;
document.body.appendChild(hov);
hover = true;
console.log("OVER");
});
div.addEventListener(overOut, function(e) {
if (!hover) return;
document.body.removeChild(hov);
hover = false;
console.log("OUT");
});
.d {
width: 100px;
height: 100px;
background-color: #ff9900;
z-index: 0;
}
.h {
width: 100%;
height: 100%;
background-color: #000000;
opacity: 0.5;
z-index: 1;
}
div {
position: absolute;
}
在这种情况下,我可以看到当将鼠标移动到触发元素顶部时会重复调用监听器,从而导致多次放置和移除叠加层的这种有趣的间歇性不良效果。
当使用 mouseover
和 mouseout
作为事件时也会发生这种情况。
为什么会这样?
最佳答案
正如 Salasar 已经指出的那样,出现此问题是因为第二个 div(悬停在第一个 div 时显示的那个)准确显示鼠标所在的位置,这会触发第一个 div 上的鼠标移开事件。你可以做些什么来解决这个问题,配置你的第二个 div,div.h,使用'pointer-events:none'。 This will make it never to be a target of mouse events.
我已经更新了您的示例以展示此功能。
var div = document.createElement("div");
div.className = "d";
document.body.appendChild(div);
var hov = document.createElement("div");
hov.className = "h";
var hover = false;
var overEvent = "mouseenter";
var overOut = "mouseleave";
div.addEventListener(overEvent, function(e) {
if (hover) return;
document.body.appendChild(hov);
hover = true;
console.log("OVER");
});
div.addEventListener(overOut, function(e) {
if (!hover) return;
document.body.removeChild(hov);
hover = false;
console.log("OUT");
});
.d {
width: 100px;
height: 100px;
background-color: #ff9900;
z-index: 0;
}
.h {
width: 100%;
height: 100%;
background-color: #000000;
opacity: 0.5;
z-index: 1;
pointer-events: none;
}
div {
position: absolute;
}
关于javascript - mouseover 和 mouseout 事件的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40842656/