【问题标题】:How to make a CSS onhover menu vanish when clicking in mobile在移动设备中单击时如何使悬停菜单上的 CSS 消失
【发布时间】:2017-05-29 03:43:48
【问题描述】:

所以我在我的免费照片网站顶部使用了一个悬停菜单。

在桌面上,当您将鼠标悬停在其上时,它会正常工作,会出现菜单。 当你将鼠标悬停在它上面时,它就会消失。

但是,移动设备没有悬停行为,因此当您在移动设备上单击菜单使其出现时,您无法摆脱它。

如果您单击菜单(但不是子链接)或页面上的任何其他位置,我需要它消失。

这是我正在使用的 HTML 代码:

<div class="menu-wrap">
  <nav class="menu">
    <ul class="clearfix">       
      <li>

        <a href="#">Good Free Photos Menu<span class="arrow">&#9660;</span></a>

        <ul class="sub-menu">
          <li><a href="https://www.goodfreephotos.com/Free-Stock-Photos/">Free Stock Photos</a></li>
          <li><a href="https://www.goodfreephotos.com/public-domain-images/">Public Domain Images</a></li>
          <li><a href="https://www.goodfreephotos.com/tags/featured">Featured</a></li>
          <li><a href="https://www.goodfreephotos.com/pages/last-100-images">Last 100 images</a></li>
          <li><a href="https://www.goodfreephotos.com/news">News</a></li>
          <li><a href="https://www.goodfreephotos.com/category/tutorials/">Tutorials</a></li>
        </ul>
      </li>
    </ul>
  </nav> 
</div>

和css:

 .clearfix:after {
    display:block;
    clear:both;
}

/*----- Menu Outline -----*/
.menu-wrap {
    width:100%;
    box-shadow:0px 1px 3px rgba(0,0,0,0.2);
    background:#3e3436;
}

.menu {
    width:1000px;
    margin:0px auto;
}

.menu li {
    margin:0px;
    list-style:none;
    font-family:'Ek Mukta';
}

.menu a {
    transition:all linear 0.15s;
    color:#919191;
}

.menu li:hover > a, .menu .current-item > a {
    text-decoration:none;
    color:#be5b70;
}

.menu .arrow {
    font-size:11px;
    line-height:0%;
}

/*----- Top Level -----*/
.menu > ul > li {
    float:left;
    display:inline-block;
    position:relative;
    font-size:19px;
}

.menu > ul > li > a {
    padding:10px 40px;
    display:inline-block;
    text-shadow:0px 1px 0px rgba(0,0,0,0.4);
}

.menu > ul > li:hover > a, .menu > ul > .current-item > a {
    background:#2e2728;
}

/*----- Bottom Level -----*/
.menu li:hover .sub-menu {
    z-index:1;
    opacity:1;
}

.sub-menu {
    width:160%;
    padding:5px 0px;
    position:absolute;
    top:100%;
    left:0px;
    z-index:-1;
    opacity:0;
    transition:opacity linear 0.15s;
    box-shadow:0px 2px 3px rgba(0,0,0,0.2);
    background:#2e2728;
}

.sub-menu li {
    display:block;
    font-size:16px;
}

.sub-menu li a {
    padding:10px 30px;
    display:block;
}

.sub-menu li a:hover, .sub-menu .current-item a {
    background:#3e3436;
}

我知道这可能需要一些 JavaScript,但我不知道是什么代码。

【问题讨论】:

  • 这是一个实时站点吗?我想对它进行检查,以便为您提供准确的答案
  • 请注意,触摸屏不仅限于移动设备——我的笔记本电脑有一个触摸屏,我经常与鼠标一起使用。
  • 是的,它在我的网站goodfreephotos.com 上运行。使用鼠标时效果很好,但在我的手机上效果不佳。

标签: javascript css menu hover accessibility


【解决方案1】:

您应该阅读以下帖子: CSS :hover behaviour on touchscreen devices

您当前设计的问题在于它依赖:hover 状态才能工作,这并不总是有效(用于键盘导航,并导致触摸屏出现问题)。

下拉菜单的许多可访问实现是well documented

您当前的代码可能在您当前的配置中工作,您所要做的就是将焦点设置在菜单之外,例如:

<a href="#">close menu</a>
<div class="menu-wrap">
   <nav class="menu">

但这将无法访问您的菜单,并且不会使其在:hover 状态未被识别为:focus 的浏览器中工作

【讨论】:

  • 这个答案不是很清楚,至少给个代码例子吧。
  • @JacobBelanger 我在回答中包含了一个链接,该链接指向由 WAI 编写的弹出菜单的完整实现。 Stackoverflow 的答案并非旨在提供完整的工作代码,而是提供线索和解决方案,即使这些解决方案仍需要一些工作。
【解决方案2】:

我会这样做:
我将首先将悬停状态从 css 悬停转移到类名,如 .dropdown-open
使用 jquery:
如果该网站是在计算机上查看的,请在 mouseover 和 mousout 上控制此类。
否则,在元素的mousedown 上切换类。

jQuery 看起来像这样:

$(document).ready(function(){

  function checkWidthForMenu(){
    if($(window).width() > 760) {
      $('.sub-menu').mouseover(function(){
        $(this).addClass('dropdown-open');
      });
      $('.sub-menu').mouseout(function(){
        $(this).removeClass('dropdown-open');
      });


    } else {
      $(document).mousedown(function(){
        $('.sub-menu.dropdown-open').removeClass('dropdown-open');
      });
      $('.sub-menu').mousedown(function(){
        $(this).toggleClass('dropdown-open');
      });

    }
  }
  checkWidthForMenu();
  $(window).resize(checkWidthForMenu());

});


编辑:
亚当有一个很好的可访问性。所以在你的 CSS 中,将打开的菜单的样式添加到 .sub-menu.dropdown-open, .sub-menu:focus {...} 这将使它在悬停和焦点上打开(使用 tab 键作为导航)

【讨论】:

  • 这如何解决我的电脑,这是触摸屏,我经常同时使用鼠标和触摸?
  • 如果是大屏幕,它会在悬停时工作,如果是小屏幕,它会在点击时切换
  • 如果您有时间,我鼓励您观看 Patrick Lauke 的演示文稿“Getting Touchy”:youtube.com/watch?v=jSL-RluQhMs 或者直接进入幻灯片:patrickhlauke.github.io/getting-touchy-presentation
  • 我的代码现在,它会在点击时切换,当您在移动设备上点击文档上的任何其他位置时,我需要它来切换。
  • 妈的,760px以上的触摸屏是不是被禁止了?
猜你喜欢
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 2013-06-21
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多