这是迄今为止我得到的最好的解决方案。相信我,我尝试了所有其他方法,这是我想出的最好和最简单的解决方案。它在 Windows 设备上运行良好,从右侧推动页面为系统滚动条和IOS 设备留出空间,而 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 小提琴示例
让我知道这是否有帮助。问候。