Lớp phủ nhiều phương thức


185

Tôi cần lớp phủ hiển thị phía trên phương thức đầu tiên, không phải ở phía sau.

Lớp phủ phía sau

Tôi cố gắng để thay đổi z-indexcủa .modal-backdrop, nhưng nó trở thành một mớ hỗn độn.

Trong một số trường hợp, tôi có nhiều hơn hai phương thức trên cùng một trang.

Câu trả lời:


427

Sau khi thấy nhiều bản sửa lỗi cho điều này, và không ai trong số chúng là chính xác những gì tôi cần, tôi đã đưa ra một giải pháp thậm chí ngắn hơn lấy cảm hứng từ @YermoLamers & @Ketwaroo.

Khắc phục chỉ số z phía sau
Giải pháp này sử dụng setTimeout.modal-backdropkhông được tạo khi sự kiện show.bs.modalđược kích hoạt.

$(document).on('show.bs.modal', '.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);
});
  • Điều này hoạt động cho mọi .modalđược tạo trên trang (ngay cả phương thức động)
  • Phông nền ngay lập tức phủ lên phương thức trước đó

Ví dụ jsfiddle

Nếu bạn không thích chỉ mục z được mã hóa cứng vì bất kỳ lý do gì, bạn có thể tính chỉ số z cao nhất trên trang như thế này:

var zIndex = Math.max.apply(null, Array.prototype.map.call(document.querySelectorAll('*'), function(el) {
  return +el.style.zIndex;
})) + 10;

Sửa chữa thanh cuộn
Nếu bạn có một phương thức trên trang của bạn vượt quá chiều cao trình duyệt, thì bạn không thể cuộn trong đó khi đóng một phương thức thứ hai. Để sửa lỗi này, hãy thêm:

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

Các phiên bản
Giải pháp này được thử nghiệm với bootstrap 3.1.0 - 3.3.5


1
@ A1rPun không hoạt động với tôi .. khi tôi đóng chế độ thứ hai .. cơ thể có thể cuộn được .. tôi đã sử dụng tất cả mã của bạn .. :(
Vishal

Không làm việc trong môi trường của tôi với bs mới nhất. Tôi đã phải làm: $ ('. Modal-backdrop'). Last (). Not ('. Modal-stack'). Css ('z-index', zIndex - 1) .addClass ('modal-stack') ;
metamagikum

2
Tôi đã phải thực hiện một thay đổi nhỏ (được thêm vào .not(this)dòng thứ hai) để làm cho nó hoạt động với công var zIndex = 1040 + (10 * $('.modal:visible').not(this).length);
cụ hẹn hò

Nếu hai phương thức tồn tại, thì cái thứ nhất bị loại bỏ và cái thứ ba được thêm vào, cái thứ ba sẽ có cùng chỉ số z như cái thứ hai vì cả hai đều sử dụng độ dài 2. Tôi cần phải tính đến chỉ số z được sử dụng cuối cùng trên phương thức.
Murphybro2

3
Hoạt động tốt với BS4 mới nhất
wobsoriano

85

Tôi nhận ra một câu trả lời đã được chấp nhận, nhưng tôi thực sự khuyên bạn không nên hack bootstrap để sửa lỗi này.

Bạn có thể dễ dàng đạt được hiệu ứng tương tự bằng cách nối các trình xử lý sự kiện display.bs.modal và hidden.bs.modal và điều chỉnh chỉ số z ở đó.

Đây là một ví dụ hoạt động

Một chút thông tin có sẵn ở đây.

Giải pháp này hoạt động tự động với các phương thức ngăn xếp sâu tùy ý.

Mã nguồn tập lệnh:

$(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'); 

    });        
});

3
Thật tuyệt, tuy nhiên khi một phương thức được đóng lại, sẽ xuất hiện hai thanh cuộn - một cho phương thức, thứ hai cho toàn bộ trang. Có thể giải quyết điều này?
Somnium

Bạn đang sử dụng bootstrap mới nhất?
Yermo Lamers

3
Để đối phó với thanh scoll thêm khi đóng, bạn cần thêm lớp "modal-open" vào phần thân trong trình lắng nghe hidden.bs.modal.
Lee

5
Một vấn đề tôi gặp phải là khi phương thức đầu tiên hiển thị và cần một thanh cuộn, nếu tôi hiển thị một phương thức thứ hai, nó sẽ loại bỏ thanh cuộn của phương thức thứ nhất và tôi bị kẹt với một phương thức bị cắt. Để giải quyết vấn đề này, tôi chỉ cần thêm nó vào CSS của tôi, .modal {overflow-y: auto; }
ScubaSteve

2
Tôi cảm thấy như thế này nên là câu trả lời được chấp nhận. Hoạt động hoàn hảo cho tôi.
Matthew Goheen

24

Một phiên bản ngắn hơn dựa trên đề xuất của Yermo Lamers, điều này dường như hoạt động tốt. Ngay cả với các hình ảnh động cơ bản như mờ dần trong / ngoài và thậm chí cả tờ báo batman điên rồ xoay. 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');
});

7
Một vấn đề còn tồn tại ở đây là nếu bạn đóng chế độ thứ hai và trang của bạn có đủ văn bản để vượt quá kích thước trình duyệt, bạn sẽ có hành vi thanh cuộn kỳ lạ. Bạn cũng phải khôi phục modal-openlớp trên thành phần cơ thể: jsfiddle.net/vkyjocyn
StriplingWar

22

Kết hợp câu trả lời của A1rPun với gợi ý của StriplingWar Warrior, tôi đã nghĩ ra điều này:

$(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');

Hoạt động ngay cả đối với các phương thức động được thêm vào sau khi thực tế và loại bỏ sự cố thanh cuộn thứ hai. Điều đáng chú ý nhất mà tôi thấy hữu ích này là tích hợp các biểu mẫu bên trong các chế độ với phản hồi xác thực từ các cảnh báo Bootbox, vì chúng sử dụng các phương thức động và do đó yêu cầu bạn liên kết sự kiện với tài liệu thay vì .modal, vì điều đó chỉ gắn nó với hiện tại phương thức.

Fiddle ở đây.


2
Tôi có thể đề nghị sử dụng chỉ số z tối đa của các phương thức mở để xác định chỉ số z cơ sở thay vì giá trị mã hóa 1040 không? stackoverflow.com/a/5680815/2569159
harco gijsbers

12

Tôi đã tạo một plugin Bootstrap kết hợp rất nhiều ý tưởng được đăng ở đây.

Bản trình diễn trên Bootply: http://www.bootply.com/cObcYInvpq

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

Nó cũng giải quyết vấn đề với các phương thức liên tiếp làm cho phông nền trở nên tối hơn và tối hơn. Điều này đảm bảo rằng chỉ có một phông nền có thể nhìn thấy tại bất kỳ thời điểm nào:

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

Chỉ số z của phông nền hiển thị được cập nhật trên cả show.bs.modalhidden.bs.modalsự kiện:

$('.modal-backdrop:first').css('z-index', MultiModal.BASE_ZINDEX + (modalIndex * 20));

Giải pháp tốt đẹp. Tôi hy vọng phông nền sẽ tối hơn khi bạn có nhiều phương thức nhưng tôi có thể thấy lý do tại sao bạn không muốn nó. @AndyBurton Bạn có thể vui lòng cho tôi biết giải pháp của tôi còn thiếu gì không?
A1rPun 17/2/2016

@ A1rPun khi mở và đóng phương thức thứ 2, các thanh cuộn cho phép cuộn trong phương thức 1 đã bị xóa. IIRC điều này có vẻ là do lớp trên cơ thể đã bị loại bỏ khi phương thức thứ 2 được đóng lại.
Andy Burton

@AndyBurton Tôi cũng xử lý giải pháp cho vấn đề đó.
A1rPun

10

Khi giải các chế độ Xếp chồng cuộn trang chính khi đóng, tôi thấy rằng các phiên bản Bootstrap mới hơn (ít nhất là từ phiên bản 3.0.3) không yêu cầu bất kỳ mã bổ sung nào để xếp chồng các chế độ.

Bạn có thể thêm nhiều phương thức (tất nhiên là có ID khác) vào trang của bạn. Vấn đề duy nhất được tìm thấy khi mở nhiều hơn một phương thức sẽ là việc đóng một loại bỏ modal-openlớp cho bộ chọn cơ thể.

Bạn có thể sử dụng mã Javascript sau để thêm lại modal-open:

$('.modal').on('hidden.bs.modal', function (e) {
    if($('.modal').hasClass('in')) {
    $('body').addClass('modal-open');
    }    
});

Trong trường hợp không cần hiệu ứng nền cho phương thức xếp chồng bạn có thể đặt data-backdrop="false".

Phiên bản 3.1.1. Đã sửa lỗi Phông nền phương thức phủ lên thanh cuộn của phương thức , nhưng giải pháp trên dường như cũng hoạt động với các phiên bản trước.


8

Cuối cùng cũng được giải quyết. Tôi đã thử nghiệm nó theo nhiều cách và hoạt động tốt.

Đây là giải pháp cho bất kỳ ai gặp vấn đề tương tự: Thay đổi hàm Modal.prototype.show (tại bootstrap.js hoặc modal.js)

TỪ:

if (transition) {
   that.$element[0].offsetWidth // force reflow
}   

that.$element
   .addClass('in')
   .attr('aria-hidden', false)

that.enforceFocus()

ĐẾN:

if (transition) {
    that.$element[0].offsetWidth // force reflow
}

that.$backdrop
   .css("z-index", (1030 + (10 * $(".modal.fade.in").length)))

that.$element
   .css("z-index", (1040 + (10 * $(".modal.fade.in").length)))
   .addClass('in')
   .attr('aria-hidden', false)

that.enforceFocus()

Đó là cách tốt nhất mà tôi tìm thấy: kiểm tra xem có bao nhiêu phương thức được mở và thay đổi chỉ số z của phương thức và phông nền thành giá trị cao hơn.


5

Nếu bạn đang tìm kiếm giải pháp Bootstrap 4, có một cách dễ dàng bằng CSS thuần túy:

.modal.fade {
    background: rgba(0,0,0,0.5);
}

Điều này có vẻ hoạt động tốt ... bạn nghĩ đây sẽ là Bootstrap tiêu chuẩn?
Ben ở CA

3

Hãy thử thêm các mục sau vào JS của bạn trên bootply

$('#myModal2').on('show.bs.modal', function () {  
$('#myModal').css('z-index', 1030); })

$('#myModal2').on('hidden.bs.modal', function () {  
$('#myModal').css('z-index', 1040); })

Giải trình:

Sau khi chơi xung quanh với các thuộc tính (sử dụng công cụ phát triển của Chrome), tôi đã nhận ra rằng bất kỳ z-indexgiá trị nào bên dưới 1031sẽ đặt mọi thứ phía sau phông nền.

Vì vậy, bằng cách sử dụng tay cầm kiện modal bootstrap của tôi đặt z-indexvào 1030. Nếu #myModal2được hiển thị và đặt z-indextrở lại 1040nếu #myModal2được ẩn.

Bản giới thiệu


2

Mỗi khi bạn chạy chỉ mục z tăng chỉ số sys.showModal và đặt nó thành phương thức mới của bạn.

function system() {

    this.modalIndex = 2000;

    this.showModal = function (selector) {
        this.modalIndex++;

        $(selector).modal({
            backdrop: 'static',
            keyboard: true
        });
        $(selector).modal('show');
        $(selector).css('z-index', this.modalIndex );       
    }

}

var sys = new system();

sys.showModal('#myModal1');
sys.showModal('#myModal2');

2

Giải pháp cho vấn đề này đối với tôi là KHÔNG sử dụng lớp "fade" trên các div phương thức của tôi.


2

Không có giải pháp tập lệnh, chỉ sử dụng css khi bạn có hai lớp phương thức, đặt phương thức thứ 2 thành chỉ mục z cao hơn

.second-modal { z-index: 1070 }

div.modal-backdrop + div.modal-backdrop {
   z-index: 1060; 
}

2

Nếu bạn muốn một phương thức cụ thể xuất hiện trên đầu của một phương thức mở khác, hãy thử thêm HTML của phương thức trên cùng sau phương thức khác div.

Điều này làm việc cho tôi:

<div id="modal-under" class="modal fade" ... />

<!--
This modal-upper should appear on top of #modal-under when both are open.
Place its HTML after #modal-under. -->
<div id="modal-upper" class="modal fade" ... />

2

Giải pháp của tôi cho bootstrap 4, làm việc với độ sâu không giới hạn của phương thức và phương thức động.

$('.modal').on('show.bs.modal', function () {
    var $modal = $(this);
    var baseZIndex = 1050;
    var modalZIndex = baseZIndex + ($('.modal.show').length * 20);
    var backdropZIndex = modalZIndex - 10;
    $modal.css('z-index', modalZIndex).css('overflow', 'auto');
    $('.modal-backdrop.show:last').css('z-index', backdropZIndex);
});
$('.modal').on('shown.bs.modal', function () {
    var baseBackdropZIndex = 1040;
    $('.modal-backdrop.show').each(function (i) {
        $(this).css('z-index', baseBackdropZIndex + (i * 20));
    });
});
$('.modal').on('hide.bs.modal', function () {
    var $modal = $(this);
    $modal.css('z-index', '');
});

Làm việc hoàn hảo với tôi
Thuyền trưởng Squirrel

1

Mỗi phương thức nên được cung cấp một id khác nhau và mỗi liên kết nên được nhắm mục tiêu đến một id phương thức khác nhau. Vì vậy, nó phải là một cái gì đó như thế:

<a href="#myModal" data-toggle="modal">
...
<div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"></div>
...
<a href="#myModal2" data-toggle="modal">
...
<div id="myModal2" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"></div>
...

1

EDIT: Bootstrap 3.3.4 đã giải quyết vấn đề này (và các vấn đề phương thức khác) vì vậy nếu bạn có thể cập nhật CSS và JS bootstrap của mình thì đó sẽ là giải pháp tốt nhất. Nếu bạn không thể cập nhật giải pháp bên dưới vẫn sẽ hoạt động và về cơ bản sẽ thực hiện tương tự như bootstrap 3.3.4 (tính toán lại và áp dụng phần đệm).

Như Bass Jobsen đã chỉ ra, các phiên bản mới hơn của Bootstrap đã giải quyết được chỉ số z. Lớp mở modal và padding-right vẫn là vấn đề đối với tôi nhưng kịch bản này lấy cảm hứng từ giải pháp Yermo Lamers đã giải quyết nó. Chỉ cần thả nó vào tệp JS của bạn và tận hưởng.

$(document).on('hide.bs.modal', '.modal', function (event) {
    var padding_right = 0;
    $.each($('.modal'), function(){
        if($(this).hasClass('in') && $(this).modal().data('bs.modal').scrollbarWidth > padding_right) {
            padding_right = $(this).modal().data('bs.modal').scrollbarWidth
        }
    });
    $('body').data('padding_right', padding_right + 'px');
});

$(document).on('hidden.bs.modal', '.modal', function (event) {
    $('body').data('open_modals', $('body').data('open_modals') - 1);
    if($('body').data('open_modals') > 0) {
        $('body').addClass('modal-open');
        $('body').css('padding-right', $('body').data('padding_right'));
    }
});

$(document).on('shown.bs.modal', '.modal', function (event) {
    if (typeof($('body').data('open_modals')) == 'undefined') {
        $('body').data('open_modals', 0);
    }
    $('body').data('open_modals', $('body').data('open_modals') + 1);
    $('body').css('padding-right', (parseInt($('body').css('padding-right')) / $('body').data('open_modals') + 'px'));
});

1

Kiểm tra này! Giải pháp này đã giải quyết vấn đề cho tôi, một vài dòng CSS đơn giản:

.modal:nth-of-type(even) {
z-index: 1042 !important;
}
.modal-backdrop.in:nth-of-type(even) {
    z-index: 1041 !important;
}

Đây là một liên kết đến nơi tôi tìm thấy nó: Bootply Chỉ cần đảm bảo rằng .modual cần xuất hiện trên Top là thứ hai trong mã HTML, vì vậy CSS có thể tìm thấy nó là "chẵn".


1

làm việc cho nhiều chế độ mở / đóng

jQuery(function()
{
    jQuery(document).on('show.bs.modal', '.modal', function()
    {
        var maxZ = parseInt(jQuery('.modal-backdrop').css('z-index')) || 1040;

        jQuery('.modal:visible').each(function()
        {
            maxZ = Math.max(parseInt(jQuery(this).css('z-index')), maxZ);
        });

        jQuery('.modal-backdrop').css('z-index', maxZ);
        jQuery(this).css("z-index", maxZ + 1);
        jQuery('.modal-dialog', this).css("z-index", maxZ + 2);
    });

    jQuery(document).on('hidden.bs.modal', '.modal', function () 
    {
        if (jQuery('.modal:visible').length)
        {
            jQuery(document.body).addClass('modal-open');

           var maxZ = 1040;

           jQuery('.modal:visible').each(function()
           {
               maxZ = Math.max(parseInt(jQuery(this).css('z-index')), maxZ);
           });

           jQuery('.modal-backdrop').css('z-index', maxZ-1);
       }
    });
});

Bản giới thiệu

https://www.bootply.com/cObcYInvpq#


0

Đây là một số CSS sử dụng các nth-of-typebộ chọn dường như hoạt động:

.modal:nth-of-type(even) {
    z-index: 1042 !important;
}
.modal-backdrop.in:nth-of-type(even) {
    z-index: 1041 !important;
}

Bootply: http://bootply.com/86973


1
Ok, thật tuyệt, nhưng tôi đã đặt một phương thức thứ ba và nó không hoạt động. Tôi có một số tập lệnh tạo ra nó (như cảnh báo, hộp tìm kiếm, v.v.) và tôi có thể có 3 phương thức mở cùng một lúc (cho đến khi tôi biết). Tôi không tốt với css, xin lỗi nếu tôi mất một cái gì đó. Có mã: bootply.com/86975
Willian Bonho Daiprai

0

Tôi đã có một kịch bản tương tự, và sau một chút R & D tôi đã tìm thấy một giải pháp. Mặc dù tôi không giỏi về JS nhưng tôi vẫn có thể viết ra một truy vấn nhỏ.

http://jsfiddle.net/Sherbrow/ThLYb/

<div class="ingredient-item" data-toggle="modal" data-target="#myModal">test1 <p>trerefefef</p></div>
<div class="ingredient-item" data-toggle="modal" data-target="#myModal">tst2 <p>Lorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem Ipsum</p></div>
<div class="ingredient-item" data-toggle="modal" data-target="#myModal">test3 <p>afsasfafafsa</p></div>

<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>





$('.ingredient-item').on('click', function(e){

   e.preventDefault();

    var content = $(this).find('p').text();

    $('.modal-body').html(content);

});

0

Thêm biến toàn cục trong modal.js

var modalBGIndex = 1040; // modal backdrop background
var modalConIndex = 1042; // modal container data 

// hiển thị hàm bên trong thêm biến - Modal.prototype.backdrop

var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })

modalConIndex = modalConIndex + 2; // add this line inside "Modal.prototype.show"

that.$element
    .show()
    .scrollTop(0)
that.$element.css('z-index',modalConIndex) // add this line after show modal 

if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate

      modalBGIndex = modalBGIndex + 2; // add this line increase modal background index 2+

this.$backdrop.addClass('in')
this.$backdrop.css('z-index',modalBGIndex) // add this line after backdrop addclass

0

Các giải pháp khác không làm việc cho tôi ra khỏi hộp. Tôi nghĩ có lẽ bởi vì tôi đang sử dụng một phiên bản Bootstrap mới hơn (3.3.2) .... lớp phủ đã xuất hiện trên đầu hộp thoại phương thức.

Tôi đã cấu trúc lại mã một chút và nhận xét phần đang điều chỉnh bối cảnh phương thức. Điều này đã khắc phục vấn đề.

    var $body = $('body');
    var OPEN_MODALS_COUNT = 'fv_open_modals';
    var Z_ADJUSTED = 'fv-modal-stack';
    var defaultBootstrapModalZindex = 1040;

    // keep track of the number of open modals                   
    if ($body.data(OPEN_MODALS_COUNT) === undefined) {
        $body.data(OPEN_MODALS_COUNT, 0);
    }

    $body.on('show.bs.modal', '.modal', function (event)
    {
        if (!$(this).hasClass(Z_ADJUSTED))  // only if z-index not already set
        {
            // Increment count & mark as being adjusted
            $body.data(OPEN_MODALS_COUNT, $body.data(OPEN_MODALS_COUNT) + 1);
            $(this).addClass(Z_ADJUSTED);

            // Set Z-Index
            $(this).css('z-index', defaultBootstrapModalZindex + (1 * $body.data(OPEN_MODALS_COUNT)));

            //// BackDrop z-index   (Doesn't seem to be necessary with Bootstrap 3.3.2 ...)
            //$('.modal-backdrop').not( '.' + Z_ADJUSTED )
            //        .css('z-index', 1039 + (10 * $body.data(OPEN_MODALS_COUNT)))
            //        .addClass(Z_ADJUSTED);
        }
    });
    $body.on('hidden.bs.modal', '.modal', function (event)
    {
        // Decrement count & remove adjusted class
        $body.data(OPEN_MODALS_COUNT, $body.data(OPEN_MODALS_COUNT) - 1);
        $(this).removeClass(Z_ADJUSTED);
        // Fix issue with scrollbar being shown when any modal is hidden
        if($body.data(OPEN_MODALS_COUNT) > 0)
            $body.addClass('modal-open');
    });

Là một lưu ý phụ, nếu bạn muốn sử dụng điều này trong AngularJs, chỉ cần đặt mã bên trong phương thức .run () của mô-đun.


0

Thật không may, tôi không có tiếng tăm để bình luận, nhưng cần lưu ý rằng giải pháp được chấp nhận với đường cơ sở được mã hóa cứng của chỉ số 1040 z dường như vượt trội hơn so với tính toán z Index cố gắng tìm ra chỉ số z Index tối đa được hiển thị trên trang.

Dường như các tiện ích mở rộng / plugin nhất định dựa trên nội dung DOM cấp cao nhất khiến cho phép tính .Max trở thành một con số quá lớn, đến mức nó không thể tăng thêm z Index nữa. Điều này dẫn đến một phương thức trong đó lớp phủ xuất hiện trên phương thức không chính xác (nếu bạn sử dụng các công cụ Firebird / Google Inspector, bạn sẽ thấy một z Index theo thứ tự 2 ^ n - 1)

Tôi chưa thể tách biệt lý do cụ thể của các dạng Math.Max ​​cho z-Index dẫn đến kịch bản này là gì, nhưng nó có thể xảy ra và nó sẽ xuất hiện duy nhất cho một số người dùng. (Các thử nghiệm chung của tôi trên browserstack đã có mã này hoạt động hoàn hảo).

Hy vọng điều này sẽ giúp được ai đó.


0

Trong trường hợp của tôi, sự cố xảy ra do tiện ích mở rộng trình duyệt bao gồm các tệp bootstrap.js trong đó sự kiện hiển thị được xử lý hai lần và hai modal-backdropdiv được thêm vào, nhưng khi đóng chế độ, chỉ một trong số chúng bị xóa.

Tìm thấy rằng bằng cách thêm một điểm dừng sửa đổi cây con vào phần tử cơ thể trong chrome và theo dõi thêm các modal-backdropdiv.



0

Cập nhật: 22.01.2019, 13.41 Tôi đã tối ưu hóa giải pháp bằng jhay, cũng hỗ trợ đóng và mở các hộp thoại giống nhau hoặc khác nhau khi ví dụ bước từ dữ liệu chi tiết này sang dữ liệu chi tiết khác hoặc ngược lại.

(function ($, window) {
'use strict';

var MultiModal = function (element) {
    this.$element = $(element);
    this.modalIndex = 0;
};

MultiModal.BASE_ZINDEX = 1040;

/* Max index number. When reached just collate the zIndexes */
MultiModal.MAX_INDEX = 5;

MultiModal.prototype.show = function (target) {
    var that = this;
    var $target = $(target);

    // Bootstrap triggers the show event at the beginning of the show function and before
    // the modal backdrop element has been created. The timeout here allows the modal
    // show function to complete, after which the modal backdrop will have been created
    // and appended to the DOM.

    // we only want one backdrop; hide any extras
    setTimeout(function () {
        /* Count the number of triggered modal dialogs */
        that.modalIndex++;

        if (that.modalIndex >= MultiModal.MAX_INDEX) {
            /* Collate the zIndexes of every open modal dialog according to its order */
            that.collateZIndex();
        }

        /* Modify the zIndex */
        $target.css('z-index', MultiModal.BASE_ZINDEX + (that.modalIndex * 20) + 10);

        /* we only want one backdrop; hide any extras */
        if (that.modalIndex > 1) 
            $('.modal-backdrop').not(':first').addClass('hidden');

        that.adjustBackdrop();
    });

};

MultiModal.prototype.hidden = function (target) {
    this.modalIndex--;
    this.adjustBackdrop();

    if ($('.modal.in').length === 1) {

        /* Reset the index to 1 when only one modal dialog is open */
        this.modalIndex = 1;
        $('.modal.in').css('z-index', MultiModal.BASE_ZINDEX + 10);
        var $modalBackdrop = $('.modal-backdrop:first');
        $modalBackdrop.removeClass('hidden');
        $modalBackdrop.css('z-index', MultiModal.BASE_ZINDEX);

    }
};

MultiModal.prototype.adjustBackdrop = function () {        
    $('.modal-backdrop:first').css('z-index', MultiModal.BASE_ZINDEX + (this.modalIndex * 20));
};

MultiModal.prototype.collateZIndex = function () {

    var index = 1;
    var $modals = $('.modal.in').toArray();


    $modals.sort(function(x, y) 
    {
        return (Number(x.style.zIndex) - Number(y.style.zIndex));
    });     

    for (i = 0; i < $modals.length; i++)
    {
        $($modals[i]).css('z-index', MultiModal.BASE_ZINDEX + (index * 20) + 10);
        index++;
    };

    this.modalIndex = index;
    this.adjustBackdrop();

};

function Plugin(method, target) {
    return this.each(function () {
        var $this = $(this);
        var data = $this.data('multi-modal-plugin');

        if (!data)
            $this.data('multi-modal-plugin', (data = new MultiModal(this)));

        if (method)
            data[method](target);
    });
}

$.fn.multiModal = Plugin;
$.fn.multiModal.Constructor = MultiModal;

$(document).on('show.bs.modal', function (e) {
    $(document).multiModal('show', e.target);
});

$(document).on('hidden.bs.modal', function (e) {
    $(document).multiModal('hidden', e.target);
});}(jQuery, window));

0

Đối với tôi, các quy tắc scss đơn giản này hoạt động hoàn hảo:

.modal.show{
  z-index: 1041;
  ~ .modal.show{
    z-index: 1043;
  }
}
.modal-backdrop.show {
  z-index: 1040;
  + .modal-backdrop.show{
    z-index: 1042;
  }
}

Nếu các quy tắc này làm cho phương thức sai được đặt lên hàng đầu trong trường hợp của bạn, hãy thay đổi thứ tự của div phương thức của bạn hoặc thay đổi (lẻ) thành (chẵn) trong scss ở trên.


0

Kiểm tra số lượng phương thức và thêm giá trị vào phông nền dưới dạng chỉ mục z

    var zIndex = 1500 + ($('.modal').length*2) + 1;
    this.popsr.css({'z-index': zIndex});

    this.popsr.on('shown.bs.modal', function () {
        $(this).next('.modal-backdrop').css('z-index', zIndex - 1);
    });

    this.popsr.modal('show');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.