onmouseover和onmouseout事件小结

前言

onmouseover和onmouseout事件是在pc端上使用非常广泛的鼠标划入划出事件.顾名思义,onmouseover是进入到dom元素中时触发的事件,而onmouseout是移出dom元素时触发的事件.它们即使在ie低版本也有良好的兼容性.

           

说明

  • 我们对最外面的红色框分别绑定onmouseover和onmouseout事件,鼠标进入dom元素时打印"进入",离开dom元素时打印"离开"
  • 鼠标进入红色框的子元素灰色框时会先触发红色框绑定的onmouseout事件,再触发红色框绑定的onmouseover事件
  • 鼠标离开子元素灰色框时也会先触发红色框绑定的onmouseout事件,再触发红色框绑定的onmouseover事件
  • 综上所述,父元素绑定事件,鼠标进入或者离开子元素都会先触发父元素的onmouseout事件,再触发onmouseover事件

 

实际应用

  • 实际开发场景中,鼠标移入菜单栏出现下拉列表功能非常常见.如果下拉列表和产品分类之间紧贴着没有间隙实现很简单
  • 将产品分类这个按钮设置为相对定位,下拉列表放入到产品分类标签里面作为子元素并设置为绝对定位
  • 最后只需要对产品分类按钮绑定onmouseover事件触发时显示下拉列表,绑定onmouseout事件触发时隐藏下拉列表

 

间隙情况

  • 如果设计图要求下拉列表不和产品分类按钮紧挨着而是中间留一小段间隙再用上述的方法就不适用了
  • 为什么会造成这种情况?当鼠标移出产品分类按钮时,就会触发onmouseout事件隐藏下拉列表
  • 这样就会造成用户鼠标移入产品分类按钮想点击下拉列表某项时一移动到间隙处下拉列表就消失了

 

应对方法

  1. 此时再对产品分类按钮做事件绑定很难处理有间隙的情况,我们可以转而对最外面的红框绑定事件,因为间隙也在红框内
  2. onmouseover的触发函数可以获取event对象,event.target为当前鼠标移入的dom元素

  3. 通过对最外层的红框绑定onmouseover事件,在其触发函数中判断如果鼠标进入的是产品分类这个按钮时才显示下拉列表

  4. 再对红框绑定onmouseout事件,它的event.target是最后即将移出红框时(进入或离开子元素时也会触发)鼠标所在的dom元素

  5. 那就可以在onmouseout的触发函数里判断排除从产品分类按钮里面离开的情况,其他情况都直接隐藏下拉框
     

完整代码

<!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>
    <!--jquery的cnd地址,如果失效请自行引入jquery-->
    <script src="http://code.jquery.com/jquery-1.12.4.js"
    integrity="sha256-Qw82+bXyGq6MydymqBxNPYTaUXXq7c8v3CwiYwLLNXU="
    crossorigin="anonymous"></script>
    <style>
       *{
         margin:0;
         padding:0;
         list-style: none;
       }
       .container{
        width:960px;
        margin:0px auto;
        height:100px;
        border:1px solid red;
       }
       .item{
        width: 126px;
        height: 30px;
        line-height: 30px;
        background-color: #eee;
        margin-top: 32px;
        margin-left: 40px;
        text-align: center;
        position:relative;
       }
       .drop-down{
        width: 100px;
        height: 184px;
        background: #999;
        position: absolute;
        left: 12px;
        top: 40px;
        display: none;
       }
    </style>
  </head>
  <body>
     <div class="container" id="main">
       
      <div class="item">
        产品分类
        <div class="drop-down" id="drop">
          <ul>
             <li>服务器</li>
             <li>CPU</li>
             <li>机箱</li>
             <li>硬盘</li>
             <li>SSD</li>
             <li>显卡</li>
          </ul>  
        </div> 
      </div>

     </div>
  </body>
  <script>
     
     $("#main").on("mouseover",(e)=>{
       var target = e.target;
       if($(target).hasClass("item") || $(target).parents(".item").length>0){
         $("#drop").show();
       }
     })

     $("#main").on("mouseout",(e)=>{
      var target = e.target;
      if(!$(target).hasClass("item")){
        $("#drop").hide();
      }
     })
  
  </script>
</html>

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值