【问题标题】:How to prevent scrolling on body content and enable scrolling on off-canvas navigation when open?如何防止滚动正文内容并在打开时启用画布外导航滚动?
【发布时间】:2014-05-14 20:45:00
【问题描述】:

我已经实现了一个非常基本的画布外导航(http://blog.tomri.ch/super-simple-off-canvas-menu-navigation/)。我遇到的唯一问题是您无法滚动菜单,这在移动横向模式下尤其成问题,菜单延伸到可视屏幕区域下方。

我想知道是否有办法在导航菜单打开时阻止page-wrapper div 中的内容滚动并在画布外导航中启用滚动,并且如果可能的话,不显示大导航上丑陋的滚动条。

HTML:

<nav id="menu">
    <a href="#menu" class="menu-link"></a>
    <ul>
       <span><a href="#">Title</a></span>
       <li><a href="#">Home</a></li>
       <li><a href="#">About</a></li>
       <li><a href="#">Contact</a></li>
       <li><a href="#">Blog</a></li>
    </ul>
</nav>

<div class="page-wrapper">
    Body Content Here
</div>

CSS:

#menu {
    position: fixed;
    top: 0;
    bottom: 0;
    width: 13.755em;
    right: -13.755em;
    height: 100%;
    -webkit-transform: translate(0px, 0px);
    -moz-transform: translate(0px, 0px);
    -o-transform: translate(0px, 0px);
    -ms-transform: translate(0px, 0px);
    transform: translate(0px, 0px);
    -webkit-transition: 0.15s ease;
    -moz-transition: 0.15s ease;
    -o-transition: 0.15s ease;
    transition: 0.15s ease;
}
    #menu.active {
        -webkit-transform: translate(-13.755em, 0px);
        -moz-transform: translate(-13.755em, 0px);
        -o-transform: translate(-13.755em, 0px);
        -ms-transform: translate(-13.755em, 0px);
        transform: translate(-13.755em, 0px);
    }
.page-wrapper {
       -webkit-transform: translate(0px, 0px);
       -moz-transform: translate(0px, 0px);
       -o-transform: translate(0px, 0px);
       -ms-transform: translate(0px, 0px);
       transform: translate(0px, 0px);
       -webkit-transition: 0.15s ease;
       -moz-transition: 0.15s ease;
       -o-transition: 0.15s ease;
       transition: 0.15s ease;  
}
    .page-wrapper.active {
           -webkit-transform: translate(-13.725em, 0px);
           -moz-transform: translate(-13.725em, 0px);
           -o-transform: translate(-13.725em, 0px);
           -ms-transform: translate(-13.725em, 0px);
           transform: translate(-13.725em, 0px);
    }

.menu-link {
    position: absolute;
    top: 15px;
    left: -50px;
}

Javascript:

$(".menu-link").click(function(){
    $("#menu").toggleClass("active");
    $(".page-wrapper").toggleClass("active");
});

【问题讨论】:

  • 什么是画布外导航?
  • 导航是绝对定位的,所以它一直在可视区域之外,直到被触发。
  • 在 body 或 html 标签中存储状态要容易得多。 $("html").toggleClass("menu-active"); 带有 css 选择器 .menu-active .page-wrapper.menu-active #menu。这样它们都保持同步,并且单个类会修改两组 css 属性。

标签: javascript jquery html css navigation


【解决方案1】:

要使任何块级元素滚动,您可以给它overflow:auto; & 取决于您的站点/应用程序height:100%;。要禁用主要内容的滚动,您可以做一些事情,但您必须尝试它们。您可以将导航扩展到页面的 100% 宽度,并且您看到内容的区域仅被不可见元素覆盖,以阻止滚动或仅继续滚动导航。您也可以在单击时禁用/启用正文滚动,注意在html,body 上应用overflow:hidden; 以获得最佳效果,它解决了一些跨浏览器/ios 问题。

希望这能给你一些见解!

【讨论】:

  • 这是一个好的开始,并且与我的想法一致。谢谢,现在开始实验!
  • 有了这些类似应用程序的功能,您必须在解决问题方面有所不同。并且不要害怕使用 webkit 前缀的东西,比如 ios 的 -webkit-overflow-scrolling:touch;,以及 css 过渡缓动 (cubic-bezier.com) 的cubic-bezier……它让世界变得与众不同
  • 其中一个跨浏览器问题是 ios 上的 Firefox,它将继续滚动,除非像 Shan 说的那样,您也将溢出隐藏到 html 中。这里的问题是您将无法保持滚动位置,停用菜单后它将位于顶部。有什么方法可以在不使用 javascript 的情况下防止这种情况发生?保持滚动位置在哪里?即使它的浏览器支持较少。
  • @AlexandreRosário 你找到解决方法了吗?我需要能够保住位置。我暂时停用了主体的滚动,同时覆盖在视图中。覆盖层关闭后,用户应保持在打开覆盖层之前的滚动位置。
【解决方案2】:

你可以在打开菜单时将这个属性添加到你的 div 容器中

.container.active{
 position:fixed;
 width:100%;
}

.container.active{
    height:100%;
    overflow:hidden;
}

正如@Shan Robertson 解释的那样

或者只是添加一个具有这些属性的类,这会在侧导航打开时阻止主要内容滚动。

【讨论】:

    【解决方案3】:

    您不必编写外部代码,只需在“afterOpen”设置中编写即可 'afterOpen': function() { $( "body" ).css( "overflow-y", "hidden" );

    【讨论】:

    • 您能否更清楚地说明您在 Featherlight 中设置回调函数,而不是 jQuery 或其他什么?我也看不出这段代码在 OP 中的哪个位置完全适合,但 OP 可能没有发布他们所有的代码。
    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多