我正在使用Bootstrap 3.1.0的网站上工作。
您会注意到,当模式窗口打开时,浏览器滚动条会消失片刻,然后返回。关闭它时,它的作用相同。
我如何才能使其打开和关闭而没有浏览器滚动条交互。我曾在堆栈上看到有人遇到问题的帖子,但找不到针对我的问题的答案,因此,如果有人提出了此请求,并且有人知道此请求并希望将我链接到该请求,我将不胜感激它。发布前,我已经搜索了大约2个小时。
我正在使用Bootstrap 3.1.0的网站上工作。
您会注意到,当模式窗口打开时,浏览器滚动条会消失片刻,然后返回。关闭它时,它的作用相同。
我如何才能使其打开和关闭而没有浏览器滚动条交互。我曾在堆栈上看到有人遇到问题的帖子,但找不到针对我的问题的答案,因此,如果有人提出了此请求,并且有人知道此请求并希望将我链接到该请求,我将不胜感激它。发布前,我已经搜索了大约2个小时。
Answers:
这是我在github上搜索此问题时发现的内容,对我来说效果很好
js:
$(document).ready(function () {
$('.modal').on('show.bs.modal', function () {
if ($(document).height() > $(window).height()) {
// no-scroll
$('body').addClass("modal-open-noscroll");
}
else {
$('body').removeClass("modal-open-noscroll");
}
});
$('.modal').on('hide.bs.modal', function () {
$('body').removeClass("modal-open-noscroll");
});
})
如果您拥有nav-fixed-top和navbar-fixed-bottom,css将使用此css :
body.modal-open-noscroll
{
margin-right: 0!important;
overflow: hidden;
}
.modal-open-noscroll .navbar-fixed-top, .modal-open .navbar-fixed-bottom
{
margin-right: 0!important;
}
或如果您具有navbar-default,请使用此CSS
body.modal-open-noscroll
{
margin-right: 0!important;
overflow: hidden;
}
.modal-open-noscroll .navbar-default, .modal-open .navbar-default
{
margin-right: 0!important;
}
.modal {
overflow-y: auto;
}
.modal-open {
overflow: auto;
}
将摆脱它。添加此选项是为了使模态响应更快,因此如果屏幕太短,您可以向下滚动并查看模态。当模式启动时,它还阻止背景滚动。如果您不需要该功能,则可以使用我发布的CSS。
更多信息:它们在主体上设置.modal-open,以防止在主体上进行所有滚动并隐藏主体滚动条。然后,当模式出现时,它具有占据整个屏幕的深色背景,并且具有y溢出:滚动,这将迫使滚动条返回,因此,如果模式扩展通过了屏幕的底部,您仍然可以滚动黑暗的背景,看看其余的。
.modal-open { overflow: auto; padding-right: 0px !important; }
如@ ben.kaminski所说,这完全摆脱了左移问题。希望会有所帮助。
单独使用CSS即可轻松解决左移问题。
.modal-open[style] {
padding-right: 0px !important;
}
您只是覆盖了代码中存在的内联样式。我在WordPress版本中使用我的浏览器,并且将内联样式应用于主体。看起来像这样:
<body class="home blog logged-in modal-open" style="padding-right: 15px;">
希望这对某人有帮助!
.modal {
overflow-y: auto;
}
.modal-open {
overflow: auto;
}
.modal-open[style] {
padding-right: 0px !important;
}
感谢Ben和CJD。
上面的代码似乎对我有用。
这是引导的报告问题: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
.modal { overflow: auto; } .modal-open { overflow: auto; } .modal-open[style] { padding-right: 0px !important; }
我正试图从另一个模式中触发一种模式,并且转换倍增。感谢您的提示。
$('body').on('show.bs.modal', function () {
if ($("body").innerHeight() > $(window).height()) {
$("body").css("margin-right", "17px");
}
});
$('body').on('hidden.bs.modal', function (e) {
$("body").css("margin-right", "0px");
});
显示模式时,此小技巧模拟了滚动条,为主体添加了一个边距右。
以上所有方法均无效,其他时间也无法进行研究。但是下面的代码只需要一点CSS就可以完美地工作。以上内容不会删除内联样式填充:17px;使用JS或jquery,我可以添加0填充,但是没有效果。
.modal-open {
padding-right: 0px !important;
overflow-y: scroll;
width: 100%;
display: block;
}
.modal {
position: fixed;
top: 0;
left: 0;
z-index: 1050;
display: none;
width: 100%;
height: 100%;
outline: 0;
padding-right: 0 !important;
}
html, body{
padding-right: 0px !important;
position: relative!important;
}
试试这个代码,实际上是可行的
这个解决方案对我有用!!!
.modal {
overflow-y: auto;
}
.modal-open {
overflow: auto;
}
.modal-open[style] {
padding-right: 0px !important;
}
从Bootstrap 3.3.2开始,行为似乎是在显示对话框时删除了滚动条,并且Bootstrap在body元素上添加了一些右填充以补偿以前由滚动条占用的空间。不幸的是,这至少在现代版本的Chrome,IE,Firefox或Safari中并不能防止屏幕移位。此处没有任何修复程序可以完全解决此问题,但是将ben.kaminski的答案与cjd82187的部分答案结合起来,仅使用CSS即可解决该问题:
/* removes inline padding added by Boostrap that makes the screen shift left */
.modal-open[style] {
padding-right: 0px !important;
}
/* keeps Bootstrap from removing the scrollbar if it's there */
.modal-open {
overflow: auto;
}
正如ben.kaminski所提到的,该代码已添加到Twitter Bootstrap中,因此,如果超出屏幕底部,您可以滚动查看该模式。要保留该功能,您可以将CSS解决方案包装在媒体查询中,使其仅适用于大型视口,如下所示:
@media (min-width: 992px) {
.modal-open[style] {
padding-right: 0px !important;
}
.modal-open {
overflow: auto;
}
}
实现了这个简单的解决方案
.modal-open {
padding-right: 0 !important;
}
html {
overflow-y: scroll !important;
}
对于Bootstrap-4.3.x,请使用以下CSS:
.modal-open {
padding-right: 0 !important;
}
/* if you have .navbar in your page then add padding-right for your .navbar (default is 16px) */
.modal-open .navbar {
padding-right: 16px !important;
}
而已。不需要其他任何东西,例如:JavaScript代码,.class
在您的代码中添加一些代码body
,然后添加CSS代码来设置样式。
当引导程序模式打开时,.modal-open类将设置为body标签。在此标记中,设置了overflow:hidden。我们必须改变这一点。在您的CSS中添加以下代码。
<style>
body.modal-open {
overflow: visible !important;
}
</style>
我的页面需要Agni Pradharma代码的修改版本,以防止显示模态时代码发生变化。我有一个固定的导航标题,有些页面带有滚动,有些没有。此处的演示:http : //jsbin.com/gekenakoki/1/
我同时使用了两个CSS:
.modal {
overflow-y: auto;
}
.modal-open {
overflow: auto;
}
和脚本:
$(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-left', scrollbarWidth);
}
})
.on('hidden.bs.modal', function () {
$(document.body).css('padding-left', 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);
};
如果有人碰巧正在使用react-bootstrap
该解决方案,则要复杂一点,因为react-bootstrap
将内联样式应用于body
元素以操纵overflow
和padding
样式。这意味着您必须使用!important
body.modal-open {
// enable below if you want to additionally allow scrolling with the modal displayed
// overflow: auto !important;
// prevent the additional padding from being applied
padding: 0 !important;
}
注意:如果未通过取消注释overflow
样式来启用滚动(即,使滚动条可见),则页面内容将显示为通过滚动条宽度移动(如果以前是可见的,则为滚动条)。
我的Jquery解决方案:
var nb = $('nav.navbar-fixed-top');
$('.modal')
.on('show.bs.modal', function () {
nb.width(nb.width());
})
.on('hidden.bs.modal', function () {
nb.width(nb.width('auto'));
});