如何禁用滚动而不隐藏它?

IT技术 javascript jquery html css
2021-01-31 07:58:09

我正在尝试在使用灯箱时禁用父级的 html/body 滚动条。这里的主要词是disable我也没有想隐藏它overflow: hidden;

这样做的原因是overflow: hidden使站点跳跃并占据滚动所在的区域。

我想知道是否可以在仍然显示滚动条的同时禁用它。

6个回答

如果覆盖层下的页面可以“固定”在顶部,则在打开覆盖层时可以设置

body { position: fixed; overflow-y:scroll }

您仍然应该看到正确的滚动条,但内容不可滚动。当您关闭叠加层时,只需使用以下命令还原这些属性

body { position: static; overflow-y:auto }

我只是提出这种方式只是因为您不需要更改任何滚动事件

更新

您还可以做一点改进:如果您document.documentElement.scrollTop在图层打开之前通过 javascript获取该属性,您可以将该值动态分配为topbody 元素的属性:使用这种方法,页面将保持原位,无论您是否“重新在顶部或者如果您已经滚动。

css

.noscroll { position: fixed; overflow-y:scroll }

JS

$('body').css('top', -(document.documentElement.scrollTop) + 'px')
         .addClass('noscroll');
稍加修改,这是可行的。我添加了一个宽度:100%;我去用解决方案更新我的问题,但你可以用宽度修改你的:100%;?谢谢你的建议
2021-03-26 07:58:09
我不知道为什么,但这对我更有效: $('body').css('top', -($('body').scrollTop()) + 'px').addClass('noscroll');
2021-03-31 07:58:09
对于那些阅读解决方案评论的人来说,最后一个小提琴提供了一种在两种情况下禁用和重新启用滚动条同时保留滚动条位置的解决方案。谢谢!
2021-03-31 07:58:09
@whitesiroi,你是对的。我已经更新了小提琴:jsfiddle.net/evpozdniakov/2m8km9wg谢谢!
2021-04-05 07:58:09
它弄乱了我的布局,但经过一些修改,它可能会起作用。我喜欢这个我会尝试更多
2021-04-12 07:58:09

接受的解决方案的四个小补充

  1. 将 'noscroll' 应用于html 而不是 body以防止 IE 中的双滚动条
  2. 检查是否确实有一个滚动条增加了“noscroll”课前。否则网站也会被新的非滚动滚动条跳转推送。
  3. 保留任何可能的scrollTop以便整个页面不会回到顶部(如 Fabrizio 的更新,但您需要在添加 'noscroll' 类之前获取该值)
  4. 并非所有浏览器都以http://help.dottoro.com/ljnvjiow.php 中记录的相同方式处理 scrollTop

似乎适用于大多数浏览器的完整解决方案:

CSS

html.noscroll {
    position: fixed; 
    overflow-y: scroll;
    width: 100%;
}

禁用滚动

if ($(document).height() > $(window).height()) {
     var scrollTop = ($('html').scrollTop()) ? $('html').scrollTop() : $('body').scrollTop(); // Works for Chrome, Firefox, IE...
     $('html').addClass('noscroll').css('top',-scrollTop);         
}

启用滚动

var scrollTop = parseInt($('html').css('top'));
$('html').removeClass('noscroll');
$('html,body').scrollTop(-scrollTop);

感谢 Fabrizio 和 Dejan 让我走上正轨,感谢 Brodingo解决双滚动条

这与的fancybox工作完全在iPad上用灯箱图像的禁用滚动afterLoad()afterClose回调。可能对搜索此问题的其他人有用。
2021-03-16 07:58:09
jQuery 对原生 DOM 进行了标准化scrollTop,因此“禁用滚动”代码的第 2 行可以表示为$( window ).scrollTop().
2021-03-23 07:58:09
我认为还需要添加另一件事。在 OSX 中的 Chrome 上,浏览器可能会“过度滚动”,从而使滚动具有弹性。如果您位于页面上方或下方的灰色区域并且将鼠标悬停在禁用滚动的位置上,则使用此代码。它将粘在浏览器窗口上方/下方的位置。出于这个原因,您需要添加一个负滚动值的检查:if (scrollTop < 0) { scrollTop = 0; }这是禁用gist.github.com/jayd3e/2eefbbc571cd1668544b的完整代码
2021-03-29 07:58:09
这在桌面上测试得很好,但在 iPhone 上它创建了一个空白的白色屏幕,直到读者尝试滚动页面。一旦读者尝试与页面交互,预期的屏幕就会在滚动锁定的情况下变得可见。
2021-03-31 07:58:09
在“启用滚动”部分,您可能希望在调用“禁用滚动”后删除放置在 html 元素上的样式属性;不是吗?
2021-04-09 07:58:09

包含 jQuery:


禁用

$.fn.disableScroll = function() {
    window.oldScrollPos = $(window).scrollTop();

    $(window).on('scroll.scrolldisabler',function ( event ) {
       $(window).scrollTop( window.oldScrollPos );
       event.preventDefault();
    });
};

使能够

$.fn.enableScroll = function() {
    $(window).off('scroll.scrolldisabler');
};

用法

//disable
$("#selector").disableScroll();
//enable
$("#selector").enableScroll();
这对我来说非常有效,谢谢!非常适合在覆盖菜单也位于页面底部的网站上使用!
2021-03-16 07:58:09
这对我来说是完美的,上一个答案使我的页面反弹,这个没有
2021-03-18 07:58:09
嗯,这几乎对我有用。它在 Windows(Firefox、Chrome)和 Firefox 中的 MacOS 上产生了奇迹……但后来我去了 Windows IE 和 Edge,以及 Chrome 和 Safari 中的 MacOS。问题不再是页面左右跳转,而是滚动条从顶部跳转到当前位置或页面顶部闪烁。男人,这是如此如此接近。也许我们仍然可以让它发挥作用。
2021-03-30 07:58:09
很高兴我能提供帮助,您可能也需要检查“touchmove”,对于移动设备,干杯
2021-04-06 07:58:09

我是 OP

在 fcalderan 的回答的帮助下,我能够形成一个解决方案。我把我的解决方案留在这里,因为它让我清楚如何使用它,并添加了一个非常关键的细节,width: 100%;

我添加这个类

body.noscroll
{
    position: fixed; 
    overflow-y: scroll;
    width: 100%;
}

这对我有用,我正在使用 Fancyapp。

它跳到页面顶部
2021-03-15 07:58:09
它对我有用,你的解决方案在这里似乎最干净,
2021-03-25 07:58:09

这对我来说非常有效......

// disable scrolling
$('body').bind('mousewheel touchmove', lockScroll);

// enable scrolling
$('body').unbind('mousewheel touchmove', lockScroll);


// lock window scrolling
function lockScroll(e) {
    e.preventDefault();
}

只需用决定何时锁定滚动的任何内容包装这两行代码即可。

例如

$('button').on('click', function() {
     $('body').bind('mousewheel touchmove', lockScroll);
});
这会导致错误的铬87: [Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. See https://www.chromestatus.com/features/6662647093133312REF
2021-03-15 07:58:09
您还可以使用箭头键滚动、向上/向下翻页等。您可以禁用所有箭头键的使用,但这会给我的用例带来其他问题。
2021-03-15 07:58:09