移动菜单打开时,身体的滚动锁定无效

S. *_*ler 6 html javascript css jquery

我找到了几个其他解决方案,演示了如何使用CSS overflow属性锁定网站的滚动行为.因此,我已经实现了这个解决方案,并overflow: hidden;在菜单打开时添加到body标签.但是,当使用iOS Safari或Chrome时,正文仍然可滚动.

CSS:

    body.opened-drawer {
      overflow: hidden !important;
      height: 100% !important;
      width: 100% !important;
      position: fixed !important;
      z-index: 0 !important;
    }
Run Code Online (Sandbox Code Playgroud)

JS:

timber.openDrawerMenu = function () {
  var $mobileMenu = $('.nav-bar'),
      $mobileMenuButton = $('#menu-opener'),
      $body = $('body');
      $mobileMenuButton.addClass('opened');
      $mobileMenu.addClass('opened');
      $body.addClass('opened-drawer');

  // Make drawer a11y accessible
  timber.cache.$navBar.attr('aria-hidden', 'false');

  // Set focus on drawer
  timber.trapFocus({
     $container: timber.cache.$navBar,
     namespace: 'drawer_focus'
  });

  // Escape key closes menu
  timber.cache.$html.on('keyup.drawerMenu', function(evt) {
    if (evt.keyCode == 27) {
      timber.closeDrawerMenu();
    }
  });
}

timber.closeDrawerMenu = function () {

  var $mobileMenu = $('.nav-bar'),
      $mobileMenuButton = $('#menu-opener'),
      $body = $('body');

  $mobileMenuButton.removeClass('opened');
  $mobileMenu.removeClass('opened');
  $body.removeClass('opened-drawer');

  // Make drawer a11y unaccessible
  timber.cache.$navBar.attr('aria-hidden', 'true');

  // Remove focus on drawer
  timber.removeTrapFocus({
    $container: timber.cache.$navBar,
    namespace: 'drawer_focus'
  });

  timber.cache.$html.off('keyup.drawerMenu');
}
Run Code Online (Sandbox Code Playgroud)

S. *_*ler 1

我找到的解决方案更多的是一种破解,而不是一个解决方案,但无论如何都能完成工作。我所做的是修复菜单打开时主体上的位置,并计算并设置菜单打开或关闭时的滚动顶部位置。

jQuery:

    var tempScrollTop = null;

    tempScrollTop = $(window).scrollTop();

    $(window).scrollTop(tempScrollTop);

    var fixed = document.getElementById('fixed--nav');
       fixed.addEventListener('touchmove', function(e) {
       e.preventDefault();
    }, false);
Run Code Online (Sandbox Code Playgroud)