[英]Preventing Page Scroll - Disabling Drag
// left: 37, up: 38, right: 39, down: 40,
// spacebar: 32, pageup: 33, pagedown: 34, end: 35, home: 36
var keys = [37, 38, 39, 40];
function preventDefault(e) {
e = e || window.event;
if (e.preventDefault)
e.preventDefault();
e.returnValue = false;
}
function keydown(e) {
for (var i = keys.length; i--;) {
if (e.keyCode === keys[i]) {
preventDefault(e);
return;
}
}
}
function wheel(e) {
preventDefault(e);
}
function disable_scroll() {
if (window.addEventListener) {
window.addEventListener('DOMMouseScroll', wheel, false);
}
window.onmousewheel = document.onmousewheel = wheel;
document.onkeydown = keydown;
}
function enable_scroll() {
if (window.removeEventListener) {
window.removeEventListener('DOMMouseScroll', wheel, false);
}
window.onmousewheel = document.onmousewheel = document.onkeydown = null;
}
调用disable_scroll();
禁用页面滚动,而enable_scroll()
再次启用滚动。
与Facebook模式框不同,您仍然可以单击并拖动页面以向下滚动。
链接: http : //jsfiddle.net/2rud0aLm/
这是一个非常基本的修复程序,我将解释为了使它起作用而进行的更改:
position: fixed
top
, left
, bottom
和right
四个偏移都position: fixed
为0
强制其填充屏幕:) <div class="page-wrap">
。 切换模态框时,此元素设置为固定位置,以防止单击拖动滚动。 fromTop
,我们将使用它来跟踪用户的滚动位置。 .page-wrap
以保留垂直位置 .fadeOut()
末尾使用回调以防止抽搐。 完成所有这些操作后,您甚至无需阻止滚动事件触发或再听按键事件。 事不宜迟,这是代码(这是功能演示 ):
var fromTop;
$('.modal_2').click(function(){
// Disable scroll and fade in modal box
disable_scroll();
$('.block_page').fadeIn();
$('.modal_box').fadeIn();
// Fetch current scroll position
fromTop = $(window).scrollTop();
// Hide overflowing vertical content
$('body').css({
'overflow-y': 'hidden'
});
$('.page-wrap').css({
'transform': 'translateY(-'+fromTop+'px)'
});
});
$('.modal_close').click(function(e){
e.preventDefault();
// Enable scroll and fade out modal box
$('.block_page').fadeOut(function() {
// Wait for modal box to fade out before reversing things
// Hide overflowing vertical content
$('body').css({
'overflow-y': 'visible'
});
$('.page-wrap').css({
'transform': 'translateY(0)'
});
$(window).scrollTop(fromTop);
});
$(this).parent().fadeOut();
enable_scroll();
});
概念验证小提琴: http : //jsfiddle.net/teddyrised/mjq8gv29/
更好的是:使用jQuery .block_page
元素和父元素上的.block_page
动画是否已完成。 如果要为两个元素设置可变的动画持续时间,则这特别重要 :
$('.modal_close').click(function(e){
e.preventDefault();
// Enable scroll and fade out modal box
$('.block_page').fadeOut();
$(this).parent().fadeOut();
// Use jQuery promises to check if all fadeOut animation has completed
var p1 = $('.block_page').promise(),
p2 = $(this).parent().promise();
// When all animations have completed, reverse effects
$.when(p1, p2).done(function() {
// Hide overflowing vertical content
$('body').css({
'overflow-y': 'visible'
});
$('.page-wrap').css({
'transform': 'translateY(0)'
});
$(window).scrollTop(fromTop);
});
});
使用jQuery .promise()
延迟对象的高级提琴: http : //jsfiddle.net/teddyrised/2rud0aLm/6/
@Terry的第一句话提供了一个快速的解决方案。 只需将overflow
更改为“隐藏”即可防止滚动。
您还需要跟踪窗口的滚动位置,并在更改overflow
属性后进行设置。
为防止鼠标滚轮拖动,请将scroll
事件附加到窗口,当打开模式对话框时,将scrollTop
设置为窗口的位置:
function disable_scroll() {
var top= $(window).scrollTop();
$('body').css({
overflow: 'hidden'
});
$(window).scrollTop(top);
$(window).on('scroll', function() {
$(window).scrollTop(top);
});
}
function enable_scroll() {
var top= $(window).scrollTop();
$('body').css({
overflow: ''
});
$(window).scrollTop(top);
$(window).off('scroll');
}
由于您代码中的modal_close
和modal_2
具有href="#"
,因此脚本将尝试跳至页面顶部。 您可以使用preventDefault
来防止这种情况:
$('a[href=#]').on('click', function(ev) {
ev.preventDefault();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.