打开模态时防止 BODY 滚动

IT技术 javascript jquery css scroll
2021-01-18 06:54:32

我希望我的身体在我网站上的 Modal(来自http://twitter.github.com/bootstrap)打开时使用鼠标滚轮停止滚动

我试图在打开模态时调用下面的一段 javascript 但没有成功

$(window).scroll(function() { return false; });

$(window).live('scroll', function() { return false; });

请注意我们的网站不再支持 IE6,但 IE7+ 需要兼容。

6个回答

Bootstrapmodal会在modal-open显示模态对话框时自动将类添加到正文中,并在对话框隐藏时将其删除。因此,您可以将以下内容添加到您的 CSS:

body.modal-open {
    overflow: hidden;
}

您可能会争辩说上面的代码属于 Bootstrap CSS 代码库,但这是将其添加到您的站点的简单修复。

2013 年 2 月 8 日更新
这在 Twitter Bootstrap v. 2.3.0 中现已停止工作——他们不再将modal-open添加到正文中。

一种解决方法是在模态即将显示时将类添加到正文中,并在模态关闭时将其删除:

$("#myModal").on("show", function () {
  $("body").addClass("modal-open");
}).on("hidden", function () {
  $("body").removeClass("modal-open")
});

2013 年 3 月 11 日更新 看起来modal-open该类将在 Bootstrap 3.0 中返回,明确用于防止滚动:

在身体上重新引入 .modal-open (所以我们可以在那里取消滚动)

请参阅:https : //github.com/twitter/bootstrap/pull/6342 - 查看Modal部分。

这在引导程序 2.2.2 中不再起作用。希望 .modal-open 将来会回来...... github.com/twitter/bootstrap/issues/5719
2021-03-13 06:54:32
@ppetrid 我不希望它回来。基于这篇文章:github.com/twitter/bootstrap/wiki/Upcoming-3.0-changes(看底部)。引用:“不再有内部模态滚动。相反,模态将增长以容纳其内容,而页面将滚动以容纳模态。”
2021-03-21 06:54:32
这样做的问题是为了防止文档在打开模态时滚动到顶部,您需要添加 body.modal-open{overflow:visible}。您的解决方案目前有效,缺点是一旦打开模态,文档就会滚动到顶部
2021-03-23 06:54:32
@Bagata Cool -modal-open将在 Bootstrap 3 中返回,所以当它启动时,删除上面的代码应该是安全的。
2021-03-24 06:54:32
这就是为什么应该继续向下滚动,如果选择的答案不满足您,您很有可能会找到这样的宝石。没想到 97+ 投票的答案在其他不太受欢迎的评论下如此深陷。
2021-03-31 06:54:32

接受的答案不适用于移动设备(iOS 7 w/ Safari 7,至少),并且当 CSS 可以运行时,我不希望 MOAR JavaScript 在我的网站上运行。

此 CSS 将阻止背景页面在模态下滚动:

body.modal-open {
    overflow: hidden;
    position: fixed;
}

但是,它也有轻微的副作用,即基本上滚动到顶部。position:absolute解决了这个问题,但重新引入了在移动设备上滚动的能力。

如果您知道您的视口(我的插件,用于将视口添加到<body>),您只需为position.

body.modal-open {
    // block scroll for mobile;
    // causes underlying page to jump to top;
    // prevents scrolling on all screens
    overflow: hidden;
    position: fixed;
}
body.viewport-lg {
    // block scroll for desktop;
    // will not jump to top;
    // will not prevent scroll on mobile
    position: absolute; 
}

我还添加了这个以防止底层页面在显示/隐藏模式时向左/向右跳转。

body {
    // STOP MOVING AROUND!
    overflow-x: hidden;
    overflow-y: scroll !important;
}

这个答案是一个x-post。

为了固定滚动到顶部,您可以在添加类之前记录位置,然后在类删除后,执行 window.scroll 到记录位置。这就是我为自己修复的方式:pastebin.com/Vpsz07zd
2021-03-12 06:54:32
谢谢!手机(至少 iOS 和 Android 原生浏览器)让我很头疼,没有它就无法工作position: fixed
2021-03-16 06:54:32
这是我如何使用 jquery 保留滚动位置: js const currPageScrollPos = $(window).scrollTop() $("body").removeClass("show_overlay") $(window).delay(5).scrollTop(currPageScrollPos)
2021-03-19 06:54:32
虽然我觉得这只能满足非常基本的需求,但这是一个有用的修复。谢谢。
2021-03-24 06:54:32
感谢您还包含防止页面在显示/隐藏模式时向左/向右跳转的代码。这非常有用,我证实它解决了我在运行 iOS 9.2.1 的 iPhone 5c 上的 Safari 上遇到的问题。
2021-04-07 06:54:32

简单地隐藏身体溢出,它使身体不滚动。当您隐藏模式时,将其恢复为自动。

这是代码:

$('#adminModal').modal().on('shown', function(){
    $('body').css('overflow', 'hidden');
}).on('hidden', function(){
    $('body').css('overflow', 'auto');
})
优秀的!这帮助了我。谢谢。
2021-04-08 06:54:32

您需要超越@charlietfl 的回答并考虑滚动条,否则您可能会看到文档重排。

打开模态:

  1. 记录body宽度
  2. body溢出设置hidden
  3. 将主体宽度显式设置为步骤 1 中的宽度。

    var $body = $(document.body);
    var oldWidth = $body.innerWidth();
    $body.css("overflow", "hidden");
    $body.width(oldWidth);
    

关闭模态:

  1. body溢出设置auto
  2. body宽度设置auto

    var $body = $(document.body);
    $body.css("overflow", "auto");
    $body.width("auto");
    

灵感来源:http : //jdsharp.us/jQuery/minute/calculate-scrollbar-width.php

哦,伙计,多么了不起的想法。@jpap 你帮助我解决了困扰我很长时间的文档回流问题。
2021-03-12 06:54:33
由于缺乏更好的术语,我得到了一个“跳跃”屏幕,对我来说这里的关键是遵循宽度设置。万分感谢。
2021-03-21 06:54:33
有没有针对此的 css 解决方案?它适用于所有浏览器和移动设备吗?
2021-03-22 06:54:33
只是一个错字:它必须$body.css("overflow", "auto");在最后一步:)
2021-03-23 06:54:33
@Hcabnettek 是的:“跳跃”==“文档重排”。很高兴它对你有帮助!:-)
2021-04-01 06:54:33

您可以尝试将 body size 设置为 window size with overflow: hidden when modal is open

如果身体溢出它,它是滚动的窗口。例如滚动条不是文档的一部分。
2021-03-18 06:54:33
您可以将模态设置为“固定”,因此滚动时不会移动
2021-03-21 06:54:33
它不是关于阻止模态滚动,而是关于阻止背景中的主体滚动
2021-03-25 06:54:33
不确定您是否可以滚动条与浏览器相关,并且您不能用它们做太多事情
2021-04-02 06:54:33
这样做会在每次打开模态时移动屏幕,这不方便,我只需要禁用背景滚动
2021-04-09 06:54:33