我正在尝试在使用灯箱时禁用父级的 html/body 滚动条。这里的主要词是disable。我也没有想隐藏它overflow: hidden;
。
这样做的原因是overflow: hidden
使站点跳跃并占据滚动所在的区域。
我想知道是否可以在仍然显示滚动条的同时禁用它。
我正在尝试在使用灯箱时禁用父级的 html/body 滚动条。这里的主要词是disable。我也没有想隐藏它overflow: hidden;
。
这样做的原因是overflow: hidden
使站点跳跃并占据滚动所在的区域。
我想知道是否可以在仍然显示滚动条的同时禁用它。
如果覆盖层下的页面可以“固定”在顶部,则在打开覆盖层时可以设置
body { position: fixed; overflow-y:scroll }
您仍然应该看到正确的滚动条,但内容不可滚动。当您关闭叠加层时,只需使用以下命令还原这些属性
body { position: static; overflow-y:auto }
我只是提出这种方式只是因为您不需要更改任何滚动事件
更新
您还可以做一点改进:如果您document.documentElement.scrollTop
在图层打开之前通过 javascript获取该属性,您可以将该值动态分配为top
body 元素的属性:使用这种方法,页面将保持原位,无论您是否“重新在顶部或者如果您已经滚动。
css
.noscroll { position: fixed; overflow-y:scroll }
JS
$('body').css('top', -(document.documentElement.scrollTop) + 'px')
.addClass('noscroll');
已接受的解决方案的四个小补充:
似乎适用于大多数浏览器的完整解决方案:
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解决双滚动条
$.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();
我是 OP
在 fcalderan 的回答的帮助下,我能够形成一个解决方案。我把我的解决方案留在这里,因为它让我清楚如何使用它,并添加了一个非常关键的细节,width: 100%;
我添加这个类
body.noscroll
{
position: fixed;
overflow-y: scroll;
width: 100%;
}
这对我有用,我正在使用 Fancyapp。
这对我来说非常有效......
// 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);
});