mouseenter、mouseleave和mouseout、mouseover的区别

首先查看定义(引用《javascript高级程序设计》)

mouseenter:在鼠标光标从元素外部首次移动到元素范围之内时触发。这个事件不冒泡,而且
在光标移动到后代元素上不会触发。DOM2 级事件并没有定义这个事件,但DOM3 级事件将它
纳入了规范。IE、Firefox 9+和Opera 支持这个事件。

mouseleave:在位于元素上方的鼠标光标移动到元素范围之外时触发。这个事件不冒泡,而且
在光标移动到后代元素上不会触发。DOM2 级事件并没有定义这个事件,但DOM3 级事件将它
纳入了规范。IE、Firefox 9+和Opera 支持这个事件。

mouseout:在鼠标指针位于一个元素上方,然后用户将其移入另一个元素时触发。又移入的另
一个元素可能位于前一个元素的外部,也可能是这个元素的子元素。不能通过键盘触发这个事件。

mouseover:在鼠标指针位于一个元素外部,然后用户将其首次移入另一个元素边界之内时触
发。不能通过键盘触发这个事件。

从定义上看,mouseenter、mouseleave这两个事件都不会冒泡,并且鼠标从父元素移入子元素时不会触发

mouseout、mouseover这两个事件则会冒泡,鼠标从父元素移入子元素时会触发

demo代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        label{display: inline-block;width:200px;height:40px;border:1px solid #ccc;}
        .ob{width:200px;background:#ccc;padding:10px;}
        .child{width:100px;height:100px;background:red;}
    </style>
</head>
<body>
    <div class="ob">
        A
       <div class="child">
        B
        </div>
    </div>
    <script>

        var ob = document.querySelector(".ob");
        var child = ob.querySelector(".child");
        console.log(ob.clientHeight);

        ob.onmouseenter = function(){
            console.log("onmouseenter触发元素移入事件");

        }

        ob.onmouseleave = function(){
            console.log("onmouseleave触发元素移出事件");

        }


    </script>
</body>
</html>

当鼠标在外部div移入移出时会触发相应的事件,但是当鼠标从父元素移入子元素的时候并不会触发相应的事件,如图所示:
这里写图片描述

demo02代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        label{display: inline-block;width:200px;height:40px;border:1px solid #ccc;}
        .ob{width:200px;background:#ccc;padding:10px;}
        .child{width:100px;height:100px;background:red;}
    </style>
</head>
<body>
    <div class="ob">
        A
       <div class="child">
        B
        </div>
    </div>
    <script>

        var ob = document.querySelector(".ob");
        var child = ob.querySelector(".child");




        ob.onmouseover = function(){
            console.log("onmouseover触发元素移入事件")

        }

        ob.onmouseout = function(){
            console.log("onmouseout触发元素移出事件");
            console.log("------");
        }
    </script>
</body>
</html>

这里写图片描述

结果分析,
上图结果你会发现,当鼠标从外部body移入到外部元素A的时候会先触发A元素绑定的鼠标移入onmouseover 事件,接着当鼠标从A移入子元素B的时候又会发现触发了A元素的鼠标移出事件onmouseout。

为什么呢?从上面的定义看,onmouseover 和 onmouseout两个事件都从父元素移入子元素的时候都会触发,所以鼠标从A移入子元素B那也就说明A元素已经移出了,就触发了A元素的onmouseout事件,你可能会很奇怪,为什么A移入B也会触发A元素的onmouseover 事件,原因同理,鼠标从A移入子元素B不但触发了A元素的onmouseout事件同时也会触发A的onmouseover事件(从定义上看) ,所以就得到了上述结果。

如果鼠标从B元素移出来,到A元素,则会产生以下结果,
首先会触发A元素的onmouseout移出事件,因为子元素B移出了会触发A元素的onmouseout移出事件,然后再触发A事件的onmouseover 移入事件。
结果如下图所示:
这里写图片描述

结果是不是和你想的一样?

总结一个最简单的区别:
mouseenter、mouseleave不会冒泡,鼠标移入子元素不会触发相应的额事件;
mouseout、mouseover会冒泡,鼠标移入子元素时会触发相应的事件。

一般在项目中mouseout、mouseover可能会比较少用,因为如果子元素或者父元素也绑定了相应的mouseout、mouseover事件,鼠标移入移出子元素或者父元素的时候,由于冒泡、和多次触发等原因,可能使得结果比较复杂。

引用\[1\]:在HTML中,mouseentermouseleavemouseovermouseout是鼠标事件的几种类型。它们之间的区别在于子元素的触发方式。mouseenter事件不支持事件冒泡,因此当鼠标进入或离开一个元素的子元素时,不会触发mouseentermouseleave事件,而是触发mouseovermouseout事件。\[1\]引用\[2\]:要模拟mouseenter事件,可以使用mouseover事件来代替。因为mouseover事件在鼠标进入元素时会触发,而且不会受到子元素的影响。\[2\]引用\[3\]:在Vue.js中,可以使用@mouseenter、@mouseleave、@mouseover和@mouseout来绑定相应的事件处理函数。@mouseenter事件在鼠标进入元素时触发,@mouseleave事件在鼠标离开元素时触发,@mouseover事件在鼠标在元素上方移动时触发,@mouseout事件在鼠标离开元素时触发。\[3\] 所以,如果你想模拟mouseenter事件,可以使用@mouseover来代替。同样地,如果你想模拟mouseleave事件,可以使用@mouseout来代替。而@mouseover事件和@mouseout事件则可以直接使用。 #### 引用[.reference_title] - *1* *2* [js中鼠标事件mouseovermouseentermouseleavemouseout的区别](https://blog.csdn.net/JackieDYH/article/details/117234168)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Vue实现鼠标悬浮隐藏与显示图片效果 @mouseenter 和 @mouseleave事件](https://blog.csdn.net/Life_s/article/details/126770960)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值