javascript - 如何在屏幕上的任意位置单击关闭由 jQuery toggle() 函数控制的移动菜单?

标签 javascript jquery css

我的移动菜单是通过 jQuery toggle() 函数打开/关闭的。除了能够通过再次单击用于打开它的相同汉堡包图标来关闭它之外,我还希望能够在它打开时通过单击屏幕上的任意位置来关闭它。然而,这种点击屏幕上的任何地方都会以下列方式“干扰”toggle() 功能:一旦菜单打开,如果我通过点击屏幕上的任何地方关闭它,然后再次点击移动菜单图标以打开它,它只在我第二次单击它时起作用(因为 toggle() 函数没有“知道”我通过单击屏幕关闭了菜单)。

如何解决这个问题?

JS:

$( '.header__menu_icon' ).toggle( function() {
  $( '.wrap' ).removeClass( 'mobile_menu_opening mobile_menu_closing' );
  $( '.wrap' ).addClass( 'mobile_menu_opening' ); 
}, function() {
  $( '.wrap' ).removeClass( 'mobile_menu_opening mobile_menu_closing' );
  $( '.wrap' ).addClass( 'mobile_menu_closing' ); 
});
$( document ).click(function() {
  $( '.wrap' ).removeClass( 'mobile_menu_opening mobile_menu_closing' );
  $( '.wrap' ).addClass( 'mobile_menu_closing' ); 
});
$( '.mobile_menu' ).click(function(event) {
  event.stopPropagation();
});

HTML:

<body>
<div class='wrap'>
  <div class='header'>
    <div class='mobile_menu'>
      ...
    </div>
  </div>
</div>
</body>

CSS:

@keyframes mobile_menu_opening {
  0% { transform: translateX(0px); }
  100% { transform: translateX(-280px); }
}
@keyframes mobile_menu_closing {
  0% { transform: translateX(-280px); }
  100% { transform: translateX(0px); }
}
.mobile_menu_opening {
  animation-name: mobile_menu_opening;
  animation-duration: 2s;
}
.mobile_menu_closing {
  animation-name: mobile_menu_closing;
  animation-duration: 1s;
}
.wrap {
  position: relative;
}

最佳答案

我会通过简单地避免切换功能来实现这一点。此外,您的代码可以通过以下方式优化:

function menuToggle() {
  var openClass = 'mobile_menu_opening';
  var closedClass = 'mobile_menu_closing';
  var $wrap = $('.wrap');
  if ($wrap.hasClass(openClass)) {
    $wrap.removeClass(openClass);
    $wrap.addClass(closedClass);
  } else {
    $wrap.removeClass(closedClass);
    $wrap.addClass(openClass);
  }
}

$('.header__menu_icon').on('click', function() {
  menuToggle();
});

$(document).on('click', function() {
  menuToggle();
});

$('.mobile_menu').on('click', function(event) {
  event.stopPropagation();
});

关于javascript - 如何在屏幕上的任意位置单击关闭由 jQuery toggle() 函数控制的移动菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38210038/

相关文章:

Javascript dialog() 函数在我的 MVC 代码中不起作用

CSS 水平子菜单

javascript - 如何使用 jquery 为 heapbox 应用 onChange 事件?

文本溢出 CSS 截断

javascript - 强制可折叠布局中的分布式 json 加载

javascript - 如何删除reactJs中对象数组中的重复项?

javascript - 如何将字符串值转换为 Json

jQuery -- blockUI 不是一个函数

javascript - 使用异步 waterfall 时模型的响应未定义

javascript - 在 d3.js 中将标签放置在节点的中心