認清鼠標移入移出事件


本文也同步發表在我的公眾號“我的天空

 

鼠標的移入移出事件,是在我們做一些前端效果時使用相當頻繁的事件,但在JS中,鼠標的移入移出事件有兩對,分別是mouseover、mouseout;以及mouseenter、mouseleave,如果沒有對其的區別有清新的認識話,則很容易掉坑里!

 譬如某次有人反映需要做以下這么一個效果:當鼠標移入背景圖片時,將有一個遮罩層升起,當鼠標移出后,遮罩層落下(如圖),該效果還是很常見的:

其采用jquery的animate()結合鼠標的移入移出事件來處理,背景圖片的class設為A,遮罩層的class為B,通過設置其bottom屬性來實現其升起與落下,其代碼如下:

 

$(".A").mouseover(function(){
   $(".B", this).animate({"bottom":"0px"},"slow");
}).mouseout(function(){
   $(".B", this).animate({"bottom":"-210px"},"slow");
});

 但是該代碼運行的效果卻不是預期:

很明顯,遮罩層的升降比預期的次數要多一次。問題就是出現在mouserover與mouerout的選取的不正確。

 我們首先來看下mouseover與mouseout事件的解釋:

mouseover:鼠標指針位於一個元素的外部,然后用戶將其首次移入另一個元素邊界之內是觸發。

mouseout:鼠標指針位於一個元素上方,然后將其移入另一個元素時觸發,這個元素可以位於前一個元素的外部,也可能是這個元素的內部。

我們來分析一下我們實際遇到的情況,當鼠標移入背景圖片時,毫無疑問觸發mouseover事件,遮罩層開始上移,當遮罩層上移至鼠標上方時,雖然我們沒有移動鼠標,但是鼠標卻從背景圖片區域進入遮罩層區域,那么觸發了mouseout事件(遮罩層屬於背景圖片內部的元素),這樣便將遮罩層下移的animate()也加入了事件隊列,當其升起過程結束后,自然又開始下移的過程,導出效果不是我們的預期。

要修正該代碼,實際上應該使用mouseenter與mouseleave事件,這兩個事件在鼠標移入后代元素時不會被觸發:

 

$(".A").mouseenter(function(){
   $(".B", this).animate({"bottom":"0px"},"slow");
}).mouseleave(function(){
   $(".B", this).animate({"bottom":"-210px"},"slow");
});

 mouseover、mouseout與mouseenter、mouseleave別再傻傻分不清楚啦!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM