与移动设备的悬停下拉菜单链接

Posted

技术标签:

【中文标题】与移动设备的悬停下拉菜单链接【英文标题】: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 将是理想的

【问题讨论】:

【参考方案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。

以上是关于与移动设备的悬停下拉菜单链接的主要内容,如果未能解决你的问题,请参考以下文章

css / jquery中的移动(触摸)设备友好下拉菜单

移动设备上的 Sharepoint 2010 下拉菜单

悬停和焦点不适用于移动下拉菜单选项

导航悬停在桌面,点击移动

我的 Bootstrap 菜单链接正在移动设备上运行

Bootstrap 3 下拉菜单:悬停和点击