如何在移动菜单打开时禁用后台滚动?

时间:2014-12-01 14:49:07

标签: jquery css

我正在构建一个具有导航菜单的移动响应网站。 当我到达菜单底部时 - 如果我到达菜单底部继续滚动 - 它会在后台滚动页面。 我该如何禁用它?

到目前为止,这是我的jQuery代码:

// When the document is loaded...
$(document).ready(function() {

    $('#mob-menu-btn').click(function(){
        $('.sports').slideToggle("slow");
    })

    $('#sub-menu').click(function(){
        $('.sports2').slideToggle("slow");
    })

});

这是我的CSS:

    .list{
        width: 100%;
        overflow: hidden;
        overflow-y: auto;
        top: -10%;
        overflow: hidden;
        overflow-y: auto;
}


    .sports li{
        list-style-image:none;
        list-style-type: none;
        border-bottom: 2px solid #eeeeee;
        margin-bottom: 0px; 
        margin-left: 0px; 
        padding-top: 15px;
        padding-bottom: 15px;
        padding-left: 10px;
        width:100%;
        font-family: arial;
        text-decoration: none;
        overflow: hidden;
    }

9 个答案:

答案 0 :(得分:13)

当菜单打开时,将位置固定在主体上。关闭它时,删除该属性。更好地使用添加/删除类。

 if($('#mob-menu').is(':visible'))
 {
    $('body').addClass("fixedPosition");
 }
 else
 {
    $('body').removeClass("fixedPosition");
 }

 .fixedPosition
 {
    position: fixed;
 }

答案 1 :(得分:13)

您可以使用position: fixed,而不是使用overflow: hidden(这会导致您在打开菜单时跳回到顶部)。如果您在页面中的某个位置并打开菜单,则不会跳回到顶部。 (也许跳跃是我编写代码的一个问题,但它对我有帮助。)

答案 2 :(得分:5)

这个问题的解决方法也略有不同。您可以将 onclick 事件添加到按钮中。然后在你的身体上添加/删除课程(类似于之前的答案,但考虑到它之前的那个)。那是什么对我有用,但是按了按钮我有复选框,检查切换我的手机菜单。

将其添加到 head 部分:

<script>
      function lockScroll() {
            if ($('body').hasClass('lock-scroll')) {
                $('body').removeClass('lock-scroll');
            }
            else {
                $('body').addClass('lock-scroll');
            }
      }
</script>

然后在CSS文件/部分中指定一个类:

.lock-scroll {
    overflow: hidden;
}

这就是你的按钮:

<button type="button" id="#mob-menu-btn" onclick="lockScroll();">Click me!</button>

答案 3 :(得分:2)

这些解决方案都不适合我 - 但我找到了一个。

我在尝试其中一些答案时遇到的问题是我在 overflow-y: scroll 元素上设置了 html - 这阻止了此代码的工作。

height: 100% 也没有达到我的目的 - 但 100vh 做到了。

以下对我有用:

html {
  overflow: auto;
}

body.js-mobile-menu-open {
  overflow: hidden;
  height: 100vh;
}

另一种解决方案是从 overflow-y: scroll 中删除 html 并应用这些 body 样式。

答案 4 :(得分:1)

我只会对@roko的答案做些小改动,因为我永远无法触发else语句。

    expo diagnostics output:

      Expo CLI 3.18.6 environment info:
        System:
          OS: Windows 10 10.0.18363
        Binaries:
          Node: 12.16.2
          Yarn: 1.22.0
          npm: 6.14.4
        npmPackages:
          expo: ~37.0.3 => 37.0.8
          react: ~16.9.0 => 16.9.0
          react-native: ~0.61.5 => 0.61.5
          react-navigation: ^4.3.9 => 4.3.9


然后样式:

$("body").toggleClass("fixedPosition");

答案 5 :(得分:1)

要为“滚动移动菜单”问题提供替代解决方案,而不是控制overflow属性,您可能希望尝试在菜单上设置以下内容:

touch-action: none;

假定菜单完全覆盖了主要内容,无论用户是打开还是关闭地址栏,都可以防止触摸滚动。

您会发现它得到了很好的支持:https://caniuse.com/?search=touch-action。根据您的用例,这可能会更整洁。

答案 6 :(得分:0)

尝试固定身体高度

body.js-mobile-menu-open {
    overflow: hidden;
    height:100%;
}

答案 7 :(得分:0)

我尝试过lockScroll(),但是它起作用了,但是我发现,如果不使用汉堡包菜单而意外关闭菜单,则主体仍具有lockscroll类,您将无法再滚动,更糟糕的是,如果再次单击汉堡菜单按钮,它将删除该类,然后您可以在菜单打开的情况下滚动并在菜单关闭的情况下无法滚动

答案 8 :(得分:0)

在 React/Nextjs 中,您可以通过传统的 javascript 方法定位主体 - 只需添加

NagelkerkeR2()

像这样处理Click函数:

psfmi

这个类看起来像这样:

rsq_nagel()

当然还要给body添加id

const body = document.getElementById("body")
body.classList.toggle("fixed_body")