【问题标题】:Link with hover dropdown menu for Mobile Devices与移动设备的悬停下拉菜单链接
【发布时间】:2012-09-09 12:15:45
【问题描述】:

我发现了一个我似乎无法解决的问题。

我有一个导航,总共 5 个链接。当您将鼠标悬停在其中一个链接上时,它会显示一个下拉菜单,其中会显示另外 3 个链接。

涉及鼠标时很好。但是,当您开始使用触摸设备时,父链接会消耗所有手势和点击,并且查看器会在几分之一秒内显示下拉菜单,然后才会被带到父链接页面。

我想知道是否有一种方法可以使父链接的第一次触摸显示下拉菜单,然后第二次触摸将转到该链接。触摸其他任何东西只会隐藏下拉菜单。

<ul id="main-menu">
    <li><a href="#">Link</a></li>
    <li><a href="#">Link</a></li>
    <li><a href="#">Link</a>
        <ul class="sub-menu">
           <li><a href="#">Sub Link</a></li>
            <li><a href="#">Sub Link</a></li>
            <li><a href="#">Sub Link</a></li>
        </ul>
    </li>
    <li><a href="#">Link</a></li>
    <li><a href="#">Link</a></li>
</ul>

有人有什么想法吗? jQuery 将是理想的

【问题讨论】:

    标签: javascript jquery hover touch hyperlink


    【解决方案1】:

    也许是这样的?您可能想要自定义下拉菜单的行为,但这显示了在菜单未打开时处理点击事件和防止默认行为(即跟随链接)的基本逻辑:

    $(function() {
        $('#main-menu a').click(function(e) {
            var listItem = $(this).closest('li');
            if (!listItem.is('.open')) {
                // Opening drop-down logic here. e.g. adding 'open' class to <li>
                e.preventDefault();
                listItem.addClass('open');
            }
            // Otherwise the default behaviour of the event (clicking the link) will be unaffected
        });
    });
    

    【讨论】:

    • 再一次,一旦点击它就会删除链接,但一旦应用“打开”就不会重新恢复链接......有这样的事情吗?
    • Updated previous fiddle 如果链接没有子菜单,则允许链接首次工作
    • 这是否会从下拉菜单中删除悬停功能?这个问题与触摸设备有关,因为“悬停”是很好的桌面。看看这个link。它可以工作,但一旦你点击它就不会隐藏菜单
    • 我的示例根本没有考虑悬停事件。最好让下拉菜单按您希望的方式工作,只需单击事件即可确定它可以在移动设备上工作,然后您应该担心让它在悬停时也能工作(请参阅Continual Improvement)。
    【解决方案2】:

    我已经为上述问题完成了完整的垃圾箱,也在这里放置了演示链接。

    演示: http://codebins.com/bin/4ldqp72

    HTML

    <ul id="main-menu">
      <li>
        <a href="#">
          Link
        </a>
      </li>
      <li>
        <a href="#">
          Link
        </a>
      </li>
      <li>
        <a href="#">
          Link
        </a>
        <ul class="sub-menu">
          <li>
            <a href="#">
              Sub Link
            </a>
          </li>
          <li>
            <a href="#">
              Sub Link
            </a>
          </li>
          <li>
            <a href="#">
              Sub Link
            </a>
          </li>
        </ul>
      </li>
      <li>
        <a href="#">
          Link
        </a>
      </li>
      <li>
        <a href="#">
          Link
        </a>
      </li>
    </ul>
    

    JQuery

    $(function() {
        $('ul a').click(function(e) {
            $('#main-menu li').removeClass('open');
            e.preventDefault();
            $(this).closest('li').addClass("open");
            var pos = $(this).closest('li.open').offset();
            $(this).closest('li.open').find("ul.sub-menu").css('top', pos.top + 'px');
    
        });
    });
    

    CSS

    #main-menu{
      list-style:none;
      margin:2px;
      padding:2px;
    }
    li{
      border:1px solid #333;
      background:#ebcdff;
      text-align:center;
      width:100px;
    }
    li:hover{
      background:#abcdfd;
    }
    li:hover a{
      color:#ff3322;
    }
    li a{
      text-decoration:none;
      color:#2466ff;
    
    }
    li.open {
      background:#abcdfd;
    
    }
    li.open a{
      text-decoration:none;
      color:#ff3322;
    
    }
    ul.sub-menu{
      list-style:none;
      display:none;
    }
    li.open > ul{
      position:absolute;
      left:70px;
      display:block;
    }
    

    演示: http://codebins.com/bin/4ldqp72

    【讨论】:

    • 这似乎停止了所有导航中的所有链接,添加 > 解决了子问题: $('#main-menu > a').click(function(e) 但是,它没有'完成后不要删除 OPEN。
    猜你喜欢
    • 2012-05-19
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多