因爲你的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 :)想象一下,你的腦袋上只有一個盤子。一些家蠅落在你的肩上。當它降落時,你說你的身體上有一隻家蠅。假設家蠅跳上那個盤子。你無法看到。那麼,你說什麼家蠅?它仍然在你身上? –