多模态叠加

IT技术 javascript jquery twitter-bootstrap twitter-bootstrap-3 modal-dialog
2021-01-28 23:18:30

我需要叠加显示在第一个模态上方,而不是在后面。

后面的模态叠加

我试图改变z-index.modal-backdrop,但它成了一个烂摊子。

在某些情况下,我在同一页面上有两个以上的模态。

6个回答

受@YermoLamers 和@Ketwaroo 的回答启发的解决方案。

背景 z-index 修复
此解决方案使用 a,setTimeout因为在触发.modal-backdrop事件时未创建show.bs.modal

$(document).on('show.bs.modal', '.modal', function() {
  const zIndex = 1040 + 10 * $('.modal:visible').length;
  $(this).css('z-index', zIndex);
  setTimeout(() => $('.modal-backdrop').not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack'));
});
  • 这适用于.modal页面上创建的每个(甚至动态模态)
  • 背景立即覆盖了之前的模态

示例 jsfiddle

z-index
如果您出于任何原因不喜欢硬编码的 z-index,您可以像这样计算页面上的最高 z-index:

const zIndex = 10 +
  Math.max(...Array.from(document.querySelectorAll('*')).map((el) => +el.style.zIndex));

滚动条修复
如果页面上的模态超过浏览器高度,则在关闭第二个模态时将无法在其中滚动。要解决此问题,请添加:

$(document).on('hidden.bs.modal', '.modal',
  () => $('.modal:visible').length && $(document.body).addClass('modal-open'));

版本
此解决方案已使用 bootstrap 3.1.0 - 3.3.5 进行测试

我必须做一个小改动(添加.not(this)到第二行)才能让它与bootstrap datepicker一起工作 var zIndex = 1040 + (10 * $('.modal:visible').not(this).length);
2021-03-13 23:18:30
你是个天才,这太不可思议了;如果我能给你买啤酒,我会的;干杯。
2021-03-21 23:18:30
@A1rPun 对我不起作用.. 当我关闭第二个模式时.. 身体变得可滚动.. 我用了你所有的代码.. :(
2021-03-22 23:18:30
在我的环境中没有使用最新的 bs。我不得不这样做: $('.modal-backdrop').last().not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack') ;
2021-04-05 23:18:30
适用于最新的 BS4
2021-04-08 23:18:30

我意识到一个答案已被接受,但我强烈建议不要破解引导程序来解决这个问题。

你可以很容易地通过挂钩showed.bs.modal 和hidden.bs.modal 事件处理程序并在那里调整z-index 来实现相同的效果。

这是一个工作示例

此处提供更多信息

此解决方案可自动与任意深度堆叠的模态一起使用。

脚本源代码:

$(document).ready(function() {

    $('.modal').on('hidden.bs.modal', function(event) {
        $(this).removeClass( 'fv-modal-stack' );
        $('body').data( 'fv_open_modals', $('body').data( 'fv_open_modals' ) - 1 );
    });

    $('.modal').on('shown.bs.modal', function (event) {
        // keep track of the number of open modals
        if ( typeof( $('body').data( 'fv_open_modals' ) ) == 'undefined' ) {
            $('body').data( 'fv_open_modals', 0 );
        }

        // if the z-index of this modal has been set, ignore.
        if ($(this).hasClass('fv-modal-stack')) {
            return;
        }

        $(this).addClass('fv-modal-stack');
        $('body').data('fv_open_modals', $('body').data('fv_open_modals' ) + 1 );
        $(this).css('z-index', 1040 + (10 * $('body').data('fv_open_modals' )));
        $('.modal-backdrop').not('.fv-modal-stack').css('z-index', 1039 + (10 * $('body').data('fv_open_modals')));
        $('.modal-backdrop').not('fv-modal-stack').addClass('fv-modal-stack'); 

    });        
});
很酷,但是当一个模式关闭时,会出现两个滚动条 - 一个用于模式,第二个用于整个页面。这能解决吗?
2021-03-14 23:18:30
我觉得这应该是公认的答案。对我来说完美无缺。
2021-03-17 23:18:30
我遇到的一个问题是,当第一个模态显示并需要滚动条时,如果我显示第二个模态,它会删除第一个模态的滚动条,而我被一个剪切的模态卡住了。为了解决这个问题,我只是将它添加到我的 CSS 中, .modal { overflow-y: auto; }
2021-03-20 23:18:30
您使用的是最新的引导程序吗?
2021-03-27 23:18:30
要在关闭时处理额外的 scoll 栏,您需要在 hidden.bs.modal 侦听器中向主体添加类“modal-open”。
2021-04-10 23:18:30

结合 A1rPun 的回答和 StriplingWarrior 的建议,我想出了这个:

$(document).on({
    'show.bs.modal': function () {
        var zIndex = 1040 + (10 * $('.modal:visible').length);
        $(this).css('z-index', zIndex);
        setTimeout(function() {
            $('.modal-backdrop').not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack');
        }, 0);
    },
    'hidden.bs.modal': function() {
        if ($('.modal:visible').length > 0) {
            // restore the modal-open class to the body element, so that scrolling works
            // properly after de-stacking a modal.
            setTimeout(function() {
                $(document.body).addClass('modal-open');
            }, 0);
        }
    }
}, '.modal');

甚至适用于事后添加的动态模态,并消除了第二个滚动条问题。我发现这很有用的最值得注意的事情是将模态内的表单与来自 Bootbox 警报的验证反馈进行集成,因为它们使用动态模态,因此需要您将事件绑定到文档而不是 .modal,因为这只会将它附加到现有的模态。

在这里摆弄。

使用 BS5 为我提供的 Besto 解决方案。
2021-03-19 23:18:30
我可以建议使用开放模式的最大 z 索引来确定基本 z 索引而不是 1040 的硬编码值吗? stackoverflow.com/a/5680815/2569159
2021-03-20 23:18:30

根据 Yermo Lamers 的建议缩短了一些版本,这似乎没问题。即使是基本的动画,如淡入/淡出,甚至疯狂的蝙蝠侠报纸旋转。http://jsfiddle.net/ketwaroo/mXy3E/

$('.modal').on('show.bs.modal', function(event) {
    var idx = $('.modal:visible').length;
    $(this).css('z-index', 1040 + (10 * idx));
});
$('.modal').on('shown.bs.modal', function(event) {
    var idx = ($('.modal:visible').length) -1; // raise backdrop after animation.
    $('.modal-backdrop').not('.stacked').css('z-index', 1039 + (10 * idx));
    $('.modal-backdrop').not('.stacked').addClass('stacked');
});
这里仍然存在的一个问题是,如果您关闭第二个模式并且您的页面有足够的文本超过浏览器大小,您最终会出现奇怪的滚动条行为。您还必须恢复modal-openbody 元素上的类:jsfiddle.net/vkyjocyn
2021-03-11 23:18:30

我创建了一个 Bootstrap 插件,其中包含了这里发布的许多想法。

Bootply 上的演示:http : //www.bootply.com/cObcYInvpq

Github:https : //github.com/jhaygt/bootstrap-multimodal

它还解决了连续模态导致背景变得越来越暗的问题。这确保在任何给定时间只有一个背景可见:

if(modalIndex > 0)
    $('.modal-backdrop').not(':first').addClass('hidden');

可见背景的 z-index 在show.bs.modalhidden.bs.modal事件上更新

$('.modal-backdrop:first').css('z-index', MultiModal.BASE_ZINDEX + (modalIndex * 20));
@AndyBurton 我也处理该问题的解决方案。
2021-03-17 23:18:30
@A1rPun 在打开和关闭第二个模式时,允许在第一个模式中滚动的滚动条被删除。IIRC 这看起来是因为当第二个模态关闭时身体上的类被删除了。
2021-03-25 23:18:30
不错的解决方案。我希望当你有多个模态时背景会变暗,但我明白你为什么不想要它。@AndyBurton 你能告诉我我的解决方案缺少什么吗?
2021-04-10 23:18:30