因为你的div包含容器的孩子,你“鼠标移开”一旦你“鼠标悬停”孩子们,这是由设计。因为它在它自己的可见空间之外,并且在它的儿童的可见空间内。由于孩子也在父母身边,因此它“继承”了该事件,因为它被视为一个单独的卷,但仍在父母的空间内。这就是为什么当你对孩子进行“鼠标悬停”时触发事件。这被称为“冒泡”的事件气泡元素的家庭树。
由于马希指出的那样,如果你用“鼠标离开”一旦离开附加元件的面积也只会触发。
的MDN文档解释这里的区别: https://developer.mozilla.org/en-US/docs/Web/Events/mouseleave
但权威答案在W3C DOM规范最佳效果:
它必须被分派时从一个元素的指针设备移动到它的一个后代元素的界限。
因此,它明确指出,当您移动到其中一个子元素时,必须触发事件mouseout。因此,对于为什么发生这种情况的原因是由设计,通过规范:
https://www.w3.org/TR/DOM-Level-3-Events/#event-type-mouseout
我添加了一个样本,以示区别
x = 0;
$(document).ready(function(){
$("div.over").mouseout(function(e){
$(".over span").text(x += 1);
console.log(e.target);
});
$("div.over > h3").mouseover(function(){
$(".over > h3").css("color", "red");
}).mouseout(function(){
$(".over > h3").css("color","black");
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="over" style="background-color:lightgray;padding:20px;width:250px;float:left">
<h3 style="background-color:white;">Mouseout event triggered: <span></span></h3>
</div>
x = 0;
$(document).ready(function(){
$("div.over").mouseleave(function(){
$(".over span").text(x += 1);
});
$("div.over > h3").mouseover(function(){
$(".over > h3").css("color", "red");
}).mouseout(function(){
$(".over > h3").css("color","black");
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="over" style="background-color:lightgray;padding:20px;width:250px;float:left">
<h3 style="background-color:white;">Mouseout event triggered: <span></span></h3>
</div>
现在,如果你在“Z空间”向下移动的子元素,它不再影响mouseout事件:
x = 0;
$(document).ready(function(){
$("div.over").mouseout(function(){
$(".over").css("background","red");
});
$("div.over").mouseover(function(){
$(".over").css("background","#444");
});
$("div.over > h3").css("display", "block");
$("div.over > h3").css("position", "relative");
$("div.over > h3").css("z-index", -1000);
$("div.over > h3").mouseover(function(){
$(".over > h3").css("color", "red");
}).mouseout(function(){
$(".over > h3").css("color","black");
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="over" style="background-color:lightgray;padding:20px;width:250px;float:left">
<h3 style="background-color:white;">Mouseout event triggered: <span></span></h3>
</div>
因为鼠标指针从当前元素失控。改用mouseleave。它会在指针离开相关元素边界框时触发。 –
@TolgahanAlbayrak没有鼠标不会从当前元素中跳出。 'h3'在'div.outer'里面。 – user31782
@ user31782 :)想象一下,你的脑袋上只有一个盘子。一些家蝇落在你的肩上。当它降落时,你说你的身体上有一只家蝇。假设家蝇跳上那个盘子。你无法看到。那么,你说什么家蝇?它仍然在你身上? –