48

如果我通过 Twitter Bootstrap 打开一个模态对话框,我注意到它会将页面的所有 html 内容(即,在 中container)向左推一点,然后在关闭后将其恢复正常。但是,这仅在浏览器宽度足够大以至于不在“移动”(即最小)媒体查询上时才会发生。最新版本的 FF 和 Chrome 会出现这种情况(尚未测试其他浏览器)。

你可以在这里看到问题:http: //jsfiddle.net/jxX6A/2/

注意:您必须增加“结果”窗口的宽度,以便它切换到“med”或“large”媒体查询 css。

我已经根据 Bootstrap 网站上显示的示例设置了页面的 HTML:

<div class='container'>
    <div class='page-header'>
        <h4>My Heading</h4>
    </div>
    <div id='content'>
        This is some content.
    </div>
    <div class='footer'>
        <p>&copy; 2013, me</p>
    </div>
</div>

我猜这不应该发生,但我不确定我做错了什么。

编辑:这是一个已知错误,有关更多(和最新)信息,请参阅:https ://github.com/twbs/bootstrap/issues/9855

4

30 回答 30

44

对于引导程序 3.xx

我找到了一个解决方案,它适用于100% CSS 而没有 JavaScript

诀窍是在 html 内容的滚动条上显示模态滚动条。

CSS:

html {
  overflow: hidden;
  height: 100%;
}
body {
  overflow: auto;
  height: 100%;
}

/* unset bs3 setting */
.modal-open {
 overflow: auto; 
}

这是一个在线示例:http: //jsbin.com/oHiPIJi/43/

我在 Windows 7 上对其进行了测试:

  • 火狐 27.0
  • 铬 32.0.1700.107 m
  • IE 11 浏览器模式 8、9、10、Edge(桌面)
  • 浏览器模式下的 IE 11 8、9、10、Edge(Windows 手机)

我在 IE 中发现的一个新小问题:

IE 具有使用鼠标滚轮滚动的背景(=body),如果在前景中没有更多可滚动的内容。

保重position:fixed

由于此解决方法的性质,您需要特别注意固定元素。例如,“navbar fixed”的填充需要设置为html而不是body(如何在 bootstrap doc中描述)。

/* only for fixed navbar: 
* extra padding setting not on "body" (like it is described in docs), 
* but on "html" element
* the value used depends on the height of your navbar
*/
html {
  padding-top: 50px;
  padding-bottom: 50px;
}

带包装的替代品

如果您不喜欢设置overflow:hiddenhtml有些人不喜欢这个,但它有效,有效且 100% 符合标准),您可以将 的内容包装body在一个额外的 div 中。您可以通过使用这种方法像以前一样使用它。

body, html {
  height: 100%;
}
.bodywrapper {
  overflow: auto;
  height: 100%;
}

/* unset bs3 setting */
.modal-open {
 overflow: auto; 
}

/* extra stetting for fixed navbar, see bs3 doc
*/
body {
  padding-top: 50px;
  padding-bottom: 50px;
}

这是一个例子:http: //jsbin.com/oHiPIJi/47/

更新:

Bootstrap 中的问题:

更新 2:仅供参考

在 Bootstrap 3.2.0 中,他们添加了一个解决方法modal.js,尝试为每次调用 和 处理 Javascriptmodal.prototype.show()Modal.prototype.hide()问题Modal.prototype.resize()。他们为此添加了 7 个(!)新方法。现在大约 20% 的代码modal.js试图处理这个问题。

于 2014-02-09T23:34:43.930 回答
41

试试这个:

body.modal-open {
    overflow: auto;
}
body.modal-open[style] {
    padding-right: 0px !important;
}

.modal::-webkit-scrollbar {
    width: 0 !important; /*removes the scrollbar but still scrollable*/
    /* reference: http://stackoverflow.com/a/26500272/2259400 */
}
于 2015-02-22T08:56:37.710 回答
14

它实际上是由 bootstrap.css 中的以下规则引起的:

body.modal-open,
.modal-open .navbar-fixed-top,
.modal-open .navbar-fixed-bottom {
  margin-right: 15px;
}

我不确定它为什么会这样(也许以某种方式考虑滚动条),但你可以用这个来改变行为:

body.modal-open {margin-right: 0px}

编辑:实际上,这是引导程序中报告的问题:https ://github.com/twbs/bootstrap/issues/9855

于 2013-10-12T18:08:30.940 回答
6

模型打开时,主体右侧有 17px 的内边距。下面的代码应该可以解决这个问题。

body {
padding-right: 0px !important;
}
于 2016-12-08T02:32:56.780 回答
4

这是用户 yshing提出的修复,它在使用 Bootstrap和 Google Chrome时真正为我修复了它。该修复来自关于此问题的 GitHub问题线程:v3.1.135.0.1916.114m

.modal
{
    overflow-y: auto;
}

.modal-open
{
   overflow:auto;
   overflow-x:hidden;
}

正如 mdo 所描述的那样,该修复程序将仅在 Bootstrap 3.2中登陆。

于 2014-05-25T04:01:55.600 回答
3

为了防止页面在类似的情况下发生移动——例如越过页面底部的手风琴开口——我在 CSS 中添加了这个:

body {
    overflow-y: scroll;
    height: 100%;
}

强制滚动条overflow-y: scroll始终呈现。老实说,我不记得我为什么放在height:100%那里......但你似乎不需要它来解决这个问题。

演示:http: //jsfiddle.net/jxX6A/8/

还是有一点动静。但这似乎出现在 Bootstrap 自己的示例页面上:http: //getbootstrap.com/javascript/#modals

所以我猜你会坚持下去......但它仍然比你最初看到的要好得多。

编辑:我可能担心添加这些样式会干扰其他 Bootstrap 的东西,因为我自己没有使用过它,所以你可能想仔细检查一下。

于 2013-10-12T17:58:27.433 回答
3

您只需编辑 .modal-open 类表单 bootstrap.min.css 文件,我认为它会好的 .modal-open{overflow:auto}

over-flow:hidden 设置在那里,您只需设置 over-flow:auto 。

于 2014-01-07T07:10:44.663 回答
3

我遇到了同样的问题和以下解决方案

.modal-open {
    overflow: visible;
}

.modal-open, .modal-open .navbar-fixed-top, .modal-open .navbar-fixed-bottom {
    padding-right:0px!important;
}
于 2015-08-30T04:56:27.890 回答
2

我有同样的问题,我得到了适合我的解决方案....

body .modal-open {
  padding-right: 0% !important;
  overflow-y: auto;
}

将此代码放在style.css文件顶部

于 2015-07-30T13:27:25.653 回答
2

自 bootstrap 3.3.6 以来发生了很多变化,因此上述解决方案可能还不够。

要解决这个问题,请查看 bootstrap.js(或 bootstrap-min.js)中的 setScrollbar 函数,您会立即注意到 bootstrap 正在向 body 元素添加 padding-right ,将其值设置为滚动条宽度加身体上现有的 padding-right (如果没有,则为 0)。

如果您将以下内容注释掉

//this.$body.css('padding-right', bodyPad + this.scrollbarWidth)

在您的 css 覆盖引导模式打开类中,使用以下内容

.modal-open{
  overflow:inherit;
 }

人们提出overflow-y: scroll;问题在于,如果滚动条一开始不存在,您的内容就会发生变化。

注意根据http://getbootstrap.com/javascript/#modals,请始终尝试将模态的 HTML 代码放在文档的顶级位置

于 2016-02-07T09:31:21.260 回答
1

在 TB 问题中找到了这个答案

只需在css下面添加这个,小动作就会被修复

body, .navbar-fixed-top, .navbar-fixed-bottom {
  margin-right: 0 !important;
}

归功于https://github.com/tvararu

于 2014-01-30T11:29:32.493 回答
1

我使用 Bootstrap v3.3.4 并看到了这个问题,我理解 Bootstrap modal 向 body 添加 17px 填充,所以只需使用以下代码:

body {
    padding-right: 0 !important;
}
于 2015-04-13T20:29:24.167 回答
1

这里没有解决方案解决了我的问题。但是遵循我从 Github 获得的 Css 对我有用。

body.modal-open {
padding-right: 0px !important;
overflow-y: auto;
}
于 2015-04-16T10:26:44.757 回答
1

只需简单地执行此操作即可

.modal-open {
padding-right: 0 !important;
}

为我工作。简短并且可以完成工作。

于 2017-03-14T17:15:30.400 回答
0

这是一个报告的引导问题:https ://github.com/twbs/bootstrap/issues/9855

这是我的临时快速修复,它使用固定顶部导航栏工作,仅使用 javascript。将此脚本与您的页面一起加载。

$(document.body)
.on('show.bs.modal', function () {
    if (this.clientHeight <= window.innerHeight) {
        return;
    }
    // Get scrollbar width
    var scrollbarWidth = getScrollBarWidth()
    if (scrollbarWidth) {
        $(document.body).css('padding-right', scrollbarWidth);
        $('.navbar-fixed-top').css('padding-right', scrollbarWidth);    
    }
})
.on('hidden.bs.modal', function () {
    $(document.body).css('padding-right', 0);
    $('.navbar-fixed-top').css('padding-right', 0);
});

function getScrollBarWidth () {
    var inner = document.createElement('p');
    inner.style.width = "100%";
    inner.style.height = "200px";

    var outer = document.createElement('div');
    outer.style.position = "absolute";
    outer.style.top = "0px";
    outer.style.left = "0px";
    outer.style.visibility = "hidden";
    outer.style.width = "200px";
    outer.style.height = "150px";
    outer.style.overflow = "hidden";
    outer.appendChild (inner);

    document.body.appendChild (outer);
    var w1 = inner.offsetWidth;
    outer.style.overflow = 'scroll';
    var w2 = inner.offsetWidth;
    if (w1 == w2) w2 = outer.clientWidth;

    document.body.removeChild (outer);

    return (w1 - w2);
};

这是工作示例:http: //jsbin.com/oHiPIJi/64

于 2014-03-08T09:51:11.427 回答
0

只需添加一个类

.modal-open{ padding-right:0px !important;}

它对我有用

于 2015-06-30T05:58:35.913 回答
0

我遇到了同样的问题,以下解决方案对我有用

.modal-open {
    overflow: visible;
}
.modal-open, .modal-open .navbar-fixed-top, .modal-open .navbar-fixed-bottom {
    padding-right:0px!important;
}
于 2015-08-30T04:59:49.097 回答
0

尝试更改以下所有出现

$body.css('padding-right',XXX)

$body.css('padding-right'0)

在您的 bootstrap.js 文件中。

就这样..

于 2015-11-11T15:41:07.343 回答
0

所以事实证明我实际上得到了 250px 左右的正确边距。我的问题似乎是 .modal-open 被设置为 position: fixed,无论出于何种原因,这都是原因。所以在我的情况下,修复是相似的,但我将位置值设置为默认值,如下所示:

.modal-open{ position: initial !important;}
于 2016-07-16T18:56:15.187 回答
0

我解决了我的问题,我认为它适用于每个人。在 bootstrap.js 中有一行:

if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)

这意味着在某些情况下,Bootstrap 会在打开模式时添加滚动条宽度的 padding-right。所以@pmanOnu 说对了一半,但不要删除整行代码,而只是

bodyPad + this.scrollbarWidth在 bootstrap.js 中替换为0

使 Bootstrap 添加 0px 的 padding-right (与不添加相同)。

然后添加.modal-open {overflow: initial;}到您的自定义 css 以防止 Bootstrap 在打开模式时禁用滚动条。

于 2016-07-17T19:48:22.393 回答
0

如果以上所有解决方案都不起作用,可能是因为定位内容,看看modal的位置

body.modal-open
{
   padding-right: 0 !important; // not important
   position: relative;
}
于 2016-11-10T20:37:30.763 回答
0

对于仍在为此苦苦挣扎的任何人 - 最新版本的 Bootstrap 具有本机修复程序。只需从最新版本更新 bootstrap.min.css 和 bootstrap.min.js 文件。

http://getbootstrap.com/

于 2017-04-21T12:39:01.523 回答
0

我真的不喜欢所提供的任何解决方案,并使用它们的组合(以及我以前对 qTip 模态进行的修复)来提出最适合我使用 Bootstrap v3.3.7 的解决方案。

更新: 解决了 iOS 上固定导航栏定位的问题。

CSS:

/* fix issue with scrollbars and navbar fixed movement issue with bootstrap modals */
html {
    overflow-y: scroll !important;
}

html.noscroll {
    position: fixed;
    width: 100%;
    top:0;
    left: 0;
    height: 100%;
    overflow-y: scroll !important;
}

.modal-open .modal {
    padding-right: 0 !important;
}

.modal-open[style] {
    padding-right: 0px !important;
}

.modal::-webkit-scrollbar {
    width: 0 !important; /*removes the scrollbar but still scrollable*/
}
/* end modal fix */

JavaScript:

/* fix for modal overlay scrollbar issue */
$(document).ready(function() {
    var curScrollTop;
    var prevScrollTop;
    $('.modal').on('show.bs.modal', function() {
        curScrollTop = $(window).scrollTop();
        $('html').addClass('noscroll').css('top', '-' + curScrollTop + 'px');
        $('.navbar-fixed-top').css({'position':'absolute','top':curScrollTop});     
        $(window).on("resize", function() {             
            var bodyH = $("body").height();
            var winH = $(window).height();
            if (winH > bodyH) {
                prevScrollTop = curScrollTop;
                curScrollTop = 0;
                $('.navbar-fixed-top').css({'position':'absolute','top':'0'}); 
            }
            else {
                $('html').removeClass("noscroll");
                if (curScrollTop == 0) window.scrollTo(0, prevScrollTop);
                else window.scrollTo(0, curScrollTop);
                curScrollTop = $(window).scrollTop(); 
                $('.navbar-fixed-top').css({'position':'absolute','top':curScrollTop});  
                $('html').addClass("noscroll");
            }
            $('html').css('top', '-' + curScrollTop + 'px');
        })
    })
    $('.modal').on('hide.bs.modal', function() {
        $('html').removeClass("noscroll");
         $('.navbar-fixed-top').css({'position':'fixed','top':'0'});
        window.scrollTo(0, curScrollTop);
        $(window).off("resize");
    })
})

这允许背景被“固定”,但仍然允许模式是可滚动的,解决了双滚动条的问题和固定导航栏的重新定位。

请注意,当模式关闭时,还有其他代码可以记住“滚动”位置(并返回到该位置)。

希望这可以帮助其他希望实现我所追求的目标的人。

于 2017-06-06T23:58:50.380 回答
-1

我找到了 Agni Pradharma 为我工作的答案;但并不完全在 Chrome 中。

看起来文档滚动条比另一个元素滚动条宽;所以我编辑了 getScrollBarWidth 函数。

它只是首先检查宽度;移除文档滚动条;然后比较差异。它也恰好是更少的代码。

$(document.body)
    .on('show.bs.modal', function () {
    if (this.clientHeight <= window.innerHeight) {
        return;
    }
    // Get scrollbar width
    var scrollbarWidth = getScrollBarWidth()
    if (scrollbarWidth) {
        $(document.body).css('padding-right', scrollbarWidth);
        $('.navbar-fixed-top').css('padding-right', scrollbarWidth);
    }
})
.on('hidden.bs.modal', function () {
    $(document.body).css('padding-right', 0);
    $('.navbar-fixed-top').css('padding-right', 0);
});

function getScrollBarWidth () {
    var fwidth = $(document).width();
    $('html').css('overflow-y', 'hidden');
    var swidth = $(document).width();
    $("html").css("overflow-y", "visible");
    return (swidth - fwidth);
};
于 2014-06-10T12:01:48.240 回答
-1

这是我使用的,只要您不介意强制滚动条,它将在 Bootstrap 3.2.0 中 100% 工作。

.modal-open .modal {
  overflow-x: hidden;
  overflow-y: scroll;
}
于 2014-09-02T17:13:39.823 回答
-1

最好的方法是:添加到BODYoverflow-y: scroll

并从 bootstrap.js 中删除 4 个函数 -

 checkScrollbar
 setScrollbar
 resetScrollbar
 measureScrollbar
于 2014-10-07T15:44:01.100 回答
-1

对我来说,它像这样工作得很好

 .modal-open .modal {
  overflow-x: scroll;
  overflow-y: scroll;
}
于 2014-10-27T23:05:44.257 回答
-1

对我来说,以下似乎可行 - 在 Linux 上的 Firefox 和 Chrome 中进行了测试:

body.modal-open {
    overflow: inherit;
    padding-right: inherit !important;
}
于 2015-03-03T12:21:52.397 回答
-1

这对我有用。覆盖添加到主体右侧的 17px 填充:

body.modal-open {
    padding-right: inherit !important;
}
于 2015-04-02T14:26:45.430 回答
-1

我通过TBAG进一步调整了这个答案

body.modal-open { padding-right: 0px !important; 溢出-y:自动;}

稍作调整,它就可以在桌面上运行,对于移动设备,溢出设置为隐藏

最终代码

body.modal-open { padding-left: 16px!important; overflow-y: auto; }

希望这可以帮助!

于 2015-06-02T13:42:27.793 回答