自举模式问题-禁用滚动

我有一个模式,在该模式中,有一个下拉列表,显示大型隐藏内容,这是工作。

Now when you open the next modal, stacked on top of the first modal and dismiss it, the scrolling on modal underneath becomes disabled.

我已经创建了一个完整的例子,包括复制我所面临的问题的步骤。你可以看到它 给你

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet">
<title></title>
<style>


</style>
</head>
<body>




<input type="button" data-toggle="modal" data-target="#modal_1" class="btn btn-lg btn-primary" value="Open Modal 1" >


<div class="modal fade" id="modal_1">
<div class="modal-dialog modal-sm">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
<h4 class="modal-title">First Modal</h4>
</div>
<div class="modal-body">






<form class="form">


<div class="form-group">
<label>1) Open This First: </label>
<input type="button" data-toggle="modal" data-target="#modal_2" class="btn btn-primary" value="Open Modal 2" >
</div>


<div class="form-group">
<label>2) Change this once you have opened the modal above.</label>
<select id="change" class="form-control">
<option value="small">Show Small Content</option>
<option value="large">Show Large Content</option>
</select>
</div>


<div id="large" class='content-div'>
<label>Large Textarea Content.. Try and scroll to the bottom..</label>
<textarea rows="30" class="form-control"></textarea>


</div>


<div id="small" class='content-div'>
<label> Example Text Box</label>
<input type="text" class="form-control">
</div>




</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>




<div class="modal fade" id="modal_2">
<div class="modal-dialog modal-sm">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
<h4 class="modal-title">Second Modal</h4>
</div>
<div class="modal-body">


<hp>This is the stacked modal.. Close this modal, then chenge the dropdown menu, you cannot scroll... </h5>


</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>




</body>
<script src="http://code.jquery.com/jquery-1.11.0.min.js" type="text/javascript"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js" type="text/javascript"></script>
<script>


$(document).ready(function() {




$(".content-div").hide();
$("#change").change(function() {
$(".content-div").hide();
$("#" + $(this).val()).show();
});




});


</script>
</html>

这里有一个 Bootply 来展示这种行为:

布特普利

134760 次浏览

我已经为你找到了解决办法。我不知道为什么它不工作,但只有一行代码在您的 CSS 将解决这个问题。关闭第二个模态后,第一个模态以某种方式获得 overflow-y:hidden。即使它设置为 auto实际上。

You need to rewrite this and set your own declaration in CSS:

#modal_1 {
overflow-y:scroll;
}

Here you have a working 演示

编辑 : 错误的链接,对不起。

这也是一个解决方案

.modal {
overflow-y:auto;
}

Http://www.bootply.com/lzbqdq2jl5

自动工程罚款:)这实际上将修复任何模态运行高于您的屏幕大小。

我猜是因为 Bootstrap 里的窃听器。它似乎删除了 modal-open类从身体,即使两个模态是开放的。您可以插入对 jQuery 的 removeClass函数的测试,如果有一个模态仍然打开,则绕过它(基本函数的功劳归功于这个答案: https://stackoverflow.com/a/1950199/854246)。

(function(){
var originalRemoveClassMethod = jQuery.fn.removeClass;


jQuery.fn.removeClass = function(){
if (arguments[0] === 'modal-open' && jQuery('.modal.in').length > 1) {
return this;
}
var result = originalRemoveClassMethod.apply( this, arguments );
return result;
}
})();
$(document).ready(function () {


$('.modal').on("hidden.bs.modal", function (e) { //fire on closing modal box
if ($('.modal:visible').length) { // check whether parent modal is opend after child modal close
$('body').addClass('modal-open'); // if open mean length is 1 then add a bootstrap css class to body of the page
}
});
});
//this code segment will activate parent modal dialog
//after child modal box close then scroll problem will automatically fixed

这是因为当您关闭一个模态时,它会从 <body>标记中删除 modal-open。Bootstrap 不支持同一页上的多个模态(至少在 BS3之前)。

使其工作的一种方法是,在关闭模态时使用 BS 触发的 hidden.bs.modal事件,然后检查是否有其他模态打开,以便强制主体上的 modal-open类。

// Hack to enable multiple modals by making sure the .modal-open class
// is set to the <body> when there is at least one modal open left
$('body').on('hidden.bs.modal', function () {
if($('.modal.in').length > 0)
{
$('body').addClass('modal-open');
}
});

Follow https://github.com/nakupanda/bootstrap3-dialog/issues/70 add

.modal { overflow: auto !important; }

交给你的 CSS

首先,Bootstrap 不支持多个开放模态

不支持多个开放模式。 确保不要在另一个模式仍然可见时打开该模式。一次显示多个模态需要自定义代码。

但是,如果你必须这样做,你可以在你的自定义样式表中添加这部分 CSS,只要它包含 < em > 在 之后主引导样式表:

.modal {
overflow-y:auto;
}

通过 JQuery 向主体添加类“ mode-open”。

作为对前面回复的一个注释: 将溢出属性添加到模态(通过 CSS)会有所帮助,但是之后您将在页面中拥有两个滚动条。

我通过移除 data-dismiss="modal"解决了这个问题 然后加上

setTimeout(function(){ $('#myModal2').modal('show') }, 500);
$('#myModal1').modal('hide');

Hope it helps

This is also a solution

.modal.fade .modal-dialog{
-webkit-transform: inherit;
}

我已经找到解决办法了。如果使用 $('#myModal').hide();隐藏模型,实际上需要为页面正文启用滚动。只要在 $('#myModal').hide();后面写下一行:

$('body').attr("style", "overflow:auto")

这将重新启用滚动。

对于引导程序4,我必须添加! 重要的

.modal {
overflow-y: auto !important;
}

如果不这样做,它就不起作用,也不会被应用。

screenshot

这个代码解决了我的问题,当第二个弹出窗口关闭时,我的第一个弹出窗口不能再滚动了。

$('body').on('hidden.bs.modal', '#SecondModal', function (e) {
if ($('#FirstModal').is(':visible')) { // check if first modal open
$('body').addClass('modal-open'); // re-add class 'modal-open' to the body because it was removed when we close the second modal
$('#FirstModal').focus(); // Focus first modal to activate scrollbar
}
});

如果您使用 bootstrap3或4,请确保在 html 主体中有一个 mode-open 类。 我不知道这是否是强制性的,但也许可以确保您的模态背景的 z 索引是清除。

    $('.your-second-modal').on('hidden.bs.modal', function (e) {
$('.your-second-modal').css('z-index', "");
$('.modal-backdrop').css('z-index', 1040);
$('body').addClass("modal-open");
});

有点像黑客,但我喜欢关闭并重新打开模态关闭来消除任何奇怪/不想要的行为。如果你已经淡出关闭,那么你不能注意到它关闭和重新开放:

var $ModalThatWasOnTop= $('#ModalThatWasOnTop')


$ModalThatWasOnTop.on('hidden.bs.modal', function(e) {
console.log('closing  modal that was on top of the other modal')
$('#ModalThatWasCovered').modal('hide');
$('#ModalThatWasCovered').modal('show');


});

将此添加到 js 代码下面

    $(document).on("click",".modal",function () {
if(!$("body").hasClass('modal-open'))
$("body").addClass('modal-open');
});

Bootstrap 不支持同时使用多个模态。这是一个自举错误。只需添加下面的 BS4脚本。

$('body').on('hidden.bs.modal', function () {
if($('.modal.show').length > 0)
{
$('body').addClass('modal-open');
}
});
$('.modal').css('overflow-y', 'auto');

如果使用 bootstrap 模式,那么删除 tabindex = “-1”很简单 而不是这个

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

添加这个 CSS 代码它的工作为我。

.modal.fade.in {
transform: translateZ(0);
-webkit-transform: translateZ(0);
}

确保您正在使用 de mode-body 容器,这就是我遇到的问题

<div class="modal-body">
...
</div>

引导模式

把这个内部的组件代码,你试图打开在模态是为我工作。看看。

 host: {
'[style.display]': '"flex"',
'[style.flex-direction]': '"column"',
'[style.overflow]': '"auto"'
}

对于 style.scss 中的 Angular + 2环境,使用下面的类就像变魔术一样

  .cdk-overlay-container .cdk-global-overlay-wrapper {
pointer-events: auto !important;
top: 0;
left: 0;
height: 100%;
width: 100%;  }

很简单

.modal { overflow-y: auto !important; }

This happens, because after closing second modal, first modal 遗失的 css 属性: overflowY:auto

您需要恢复它,它将工作。例如,在您的代码示例中,简单地添加:

$(document).on('hidden.bs.modal', '#modal_2',function () {
$('#modal_1').css('overflowY','auto')
});

在引导程序5中偶然发现了这个问题。由于引导程序5正在远离 jQuery,因此当您打开多个模态并禁用 body 元素滚动时,这里有一个解决方案。事件可以在这里找到 https://getbootstrap.com/docs/5.0/components/modal/#events;

 document.querySelector('body').addEventListener('hidden.bs.modal', (event) => {
// remove the overflow: hidden and padding-right: 15px
document.querySelector('body').removeAttribute('style');
});

如果你从一个 Modal 中打开另一个 Modal,你可以使用以下方法:

$('#myModal').on('hidden.bs.modal', function () {
// Load up a new modal...
$('#myModalNew').modal('show')
})