这是迄今为止我得到的最佳解决方案。相信我,我尝试了所有其他方法,这是我想出的最好和最简单的解决方案。它在Windows 设备 上运行良好,从右侧推动页面为系统滚动条和 IOS 设备留出空间,这些设备在浏览器中的滚动条不需要空间.因此,通过使用它,您不需要在右侧添加填充,这样当您使用 css 隐藏 body 或 html 的溢出时页面不会闪烁。
如果您考虑一下,解决方案非常简单。这个想法是在打开弹出窗口的那一刻给 window.scrollTop() 相同的确切位置。当窗口调整大小时也改变那个位置(一旦发生滚动位置就会改变)。
所以我们开始...
首先让我们创建一个变量,让您知道弹出窗口已打开,并将其命名为 stopWindowScroll。如果我们不这样做,您将在您的页面上收到未定义变量的错误并将其设置为 0 - 未激活。
$(document).ready(function(){
stopWindowScroll = 0;
});
现在让打开的弹出函数可以是代码中的任何函数,它可以触发您作为插件或自定义使用的任何弹出窗口。在这种情况下,它将是一个简单的自定义弹出窗口,带有一个简单的文档点击功能。
$(document).on('click','.open-popup', function(){
// Saving the scroll position once opening the popup.
stopWindowScrollPosition = $(window).scrollTop();
// Setting the stopWindowScroll to 1 to know the popup is open.
stopWindowScroll = 1;
// Displaying your popup.
$('.your-popup').fadeIn(300);
});
接下来我们要做的是创建关闭弹出功能,我再次重复一遍,它可以是您已经创建或正在插件中使用的任何功能。重要的是我们需要这 2 个函数将 stopWindowScroll 变量设置为 1 或 0 以了解它何时打开或关闭。
$(document).on('click','.open-popup', function(){
// Setting the stopWindowScroll to 0 to know the popup is closed.
stopWindowScroll = 0;
// Hiding your popup
$('.your-popup').fadeOut(300);
});
然后让我们创建 window.scroll 函数,这样我们就可以在上面提到的 stopWindowScroll 设置为 1 时阻止滚动。
$(window).scroll(function(){
if(stopWindowScroll == 1) {
// Giving the window scrollTop() function the position on which
// the popup was opened, this way it will stay in its place.
$(window).scrollTop(stopWindowScrollPosition);
}
});
就是这样。除了您自己的页面样式外,无需任何 CSS 即可工作。这对我来说就像一个魅力,我希望它可以帮助你和其他人。
这是一个关于 JSFiddle 的工作示例:
JS Fiddle Example
如果这有帮助,请告诉我。问候。