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

时间:2017-06-30 15:24:15

标签: javascript jquery html css

我找到了其他一些解决方案,演示了如何使用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;
    }

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');
}

2 个答案:

答案 0 :(得分:2)

您可以在这里进行快速修复

body.opened-drawer {
    overflow: hidden;
    height: 100%;
    width: 100%;
    position: fixed;
    z-index: 0;
}

请在此处找到修改过的脚本

function menuDrawerButtons (){

    cache.$mobileMenuButton.on('click', function(e) {
         e.preventDefault();
        if ($(this).hasClass('opened')) {
            timber.closeDrawerMenu()
        } else {
            timber.openDrawerMenu();
        }           
    });

    setTimeout(function() {
        cache.$mobileMenu.addClass('animate');
    }, 500);
}

答案 1 :(得分:1)

我遇到的解决方案更多的是黑客而不是解决方案,但无论如何都可以完成工作。我所做的是在菜单打开时修正身体上的位置,并在菜单打开或关闭时计算并设置scrollTop位置。

jQuery的:

    var tempScrollTop = null;

    tempScrollTop = $(window).scrollTop();

    $(window).scrollTop(tempScrollTop);

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