代码之家  ›  专栏  ›  技术社区  ›  Alessio

Javascript菜单荧光笔

  •  1
  • Alessio  · 技术社区  · 8 年前

    我已经实现了一个带有JavaScript部分的菜单,它突出显示了您正在查看的当前页面。

    将鼠标移到不同的条目上会使一个小元素移动(跟随鼠标)并在悬停的条目上停止。

    问题是当光标位于荧光灯移动的小区域(红色区域)时。

    red area that causes the bug

    将光标留在那里会导致荧光笔继续从活动条目跳到悬停条目,没有结束。

    bug

    这是代码,也是关于 codepen :

    HTML

    <div class="wrapper">
        <ul>
            <li>
                <a class="active" href="#"><span>Link 1</span></a>
            </li>
            <li>
                <a href="#"><span>Link 2</span></a>
            </li>
            <li>
                <a href="#"><span>Link 3</span></a>
            </li>
            <li>
                <a href="#"><span>Linl 4</span></a>
            </li>
            <li>
                <a href="#"><span>Link 5</span></a>
            </li>
            <li>
                <a href="#"><span>Link 6</span></a>
            </li>
            <li>
                <a href="#"><span>Link 7</span></a>
            </li>
            <li>
                <a href="#"><span>Link 8</span></a>
            </li>
            <li>
                <a href="#"><span>Link 9</span></a>
            </li>
            <li>
                <a href="#"><span>Link 10</span></a>
            </li>
        </ul>
        <span class="js-status-menu status-menu"></span>
    </div>
    

    CSS

    div {
      max-width: 277px;
      height: 100%;
      background: #333;
      text-align: left;
      padding: 0;
      position: relative;
    }
    
    ul {
        margin: 0;
        padding: 0;
        list-style: none;
    }
    
    ul li a {
        display: block;
        text-decoration: none;
        font-size: 12px;
        line-height: 1.25em;
        color: #fff;
        border-bottom: solid 1px #333D4A;
        padding: 14px 25px;
        position: relative;
    }
    
    ul li a:hover {
      color: #fff;
      background: #435162;
    }
    
    .status-menu {
        width: 5px;
        height: 43px;
        background: #4EFFFF;
        position: absolute;
        left: 0;
        top: 0;
    }
    

    JS公司

    $(document).ready(function() {      
        if($('.js-status-menu').length){
    
            var jsMenuHover = $('.js-status-menu');
            var disclMenu = 0;
    
            var style = 'easeOutExpo';
            var default_top = Math.round($('ul li a.active').offset().top - $('ul').offset().top) + disclMenu;
    
            if($('ul li a.active').parents('.submenu').length){
                $('ul li a.active').parents('.submenu').show();
                $('ul li a.active').parents('.submenu').prev('a').addClass('open');
            }
    
            jsMenuHover.css({top: default_top});
    
            $('ul li a').hover(function () {
                var topPos = Math.round($(this).offset().top - $('ul').offset().top);
                $('.js-status-menu').stop(false, true).animate({top: topPos + disclMenu},{duration:500, easing: style});
            });
    
            $('ul').on('mouseleave',function () {
                if ($('ul li a').hasClass('active')){
                    var default_top = Math.round($('ul li a.active').offset().top - $('ul').offset().top) + disclMenu;
                }
                jsMenuHover.stop(false, true).animate({top: default_top},{duration:500, easing: style});
            });
    
        }
    
    });
    

    我也尝试添加一个超时,但没有帮助。有什么想法吗?

    谢谢

    1 回复  |  直到 8 年前
        1
  •  2
  •   P. Frank    8 年前

    您可以使用 e.stopPropagation 在您的 ul li a hover 解决问题的功能。

    $('ul li a').hover(function (e) {
        e.stopPropagation()
        var topPos = Math.round($(this).offset().top - $('ul').offset().top);
        $('.js-status-menu').stop(false, true).animate({top: topPos + disclMenu},{duration:500, easing: style});
    });
    

    更新1

    好的,我已经检测到鼠标何时进入cursor left元素并应用css。我已添加 actual 用于检测鼠标实际位置的变量。

    $('.js-status-menu.status-menu').on("mouseenter",function (e) {
           $("ul li").eq(actual).css({color:"#fff",background:"#435162"})
         })
          $('.js-status-menu.status-menu').on("mouseleave",function (e) {
           $("ul li").eq(actual).css({color:"#fff",background:"#333"})
         })
    

    更新2

    好的,我添加了一个主体 mouseenter 函数并添加一个变量,以便在 ul li 要素

    https://codepen.io/anon/pen/VyVMJj