Çoklu modüler kaplama


185

Yer paylaşımının arkada değil, ilk modalın üzerinde gösterilmesine ihtiyacım var.

Arkasında kalıcı kaplama

Ben değiştirmeye çalıştı z-indexarasında .modal-backdrop, ama bir karışıklık olur.

Bazı durumlarda aynı sayfada ikiden fazla modelim var.

Yanıtlar:


430

Bunun için birçok düzeltme gördükten ve hiçbiri tam olarak ihtiyacım olan şey değildi. @YermoLamers & @ Ketwaroo'dan esinlenen daha kısa bir çözüm buldum.

Arka plan Z-endeksi düzeltmek
Bu çözüm bir kullanır setTimeoutçünkü .modal-backdropolay sırasında oluşturulmaz show.bs.modaltetiklenir.

$(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);
});
  • Bu .modal, sayfada oluşturulan her şey için geçerlidir (dinamik modüller bile)
  • Zemin anında önceki modun üzerini kaplar

Örnek jsfiddle

Herhangi bir nedenle sabit kodlu z-dizinini beğenmediyseniz, sayfadaki en yüksek z-dizinini şu şekilde hesaplayabilirsiniz :

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

Kaydırma çubuğu düzeltmesi
Sayfanızda tarayıcı yüksekliğini aşan bir yöntem varsa, ikinci bir yöntemi kapatırken içeri giremezsiniz. Bu eklentiyi düzeltmek için:

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

Sürümler
Bu çözüm bootstrap 3.1.0 - 3.3.5 ile test edilmiştir


1
@ A1rPun benim için çalışmıyor .. ben ikinci modal kapatıldığında .. vücut kaydırılabilir hale .. tüm kodunu kullandım .. :(
Vishal

En son bs ile çevremde çalışmadı. Yapmam gerekiyordu: $ ('. Modal-backdrop'). Last (). Not ('. Modal-stack'). Css ('z-endeksi', zIndex - 1) .addClass ('modal-yığını') ;
metamagikum

2
Bootstrap datepicker.not(this) ile çalışmak için (ikinci satıra eklenen) küçük bir değişiklik yapmak zorunda kaldım var zIndex = 1040 + (10 * $('.modal:visible').not(this).length);
benrwb

İki moda varsa, o zaman birincisi çıkarılır ve bir üçüncü eklenir, üçüncüsü ikisinin uzunluğu 2 ile aynı z-endeksine sahip olacaktır. modals.
Murphybro2

3
BS4 ile iyi çalışıyor
wobsoriano

85

Bir cevabın kabul edildiğinin farkındayım, ancak bunu düzeltmek için bootstrap'i hacklememeyi şiddetle tavsiye ediyorum.

Gösterilen etkiyi.bs.modal ve hidden.bs.modal olay işleyicilerini bağlayıp orada z-dizinini ayarlayarak kolayca aynı etkiyi elde edebilirsiniz.

İşte çalışan bir örnek

Biraz daha fazla bilgiye buradan ulaşabilirsiniz.

Bu çözüm, modları keyfi olarak derin istifler ile otomatik olarak çalışır.

Komut dosyası kaynak kodu:

$(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
Harika, ancak bir mod kapalıyken, mod için bir, tüm sayfa için ikinci olmak üzere iki kaydırma çubuğu görünür. Bu çözülebilir mi?
Somnium

En son bootstrap'i mi kullanıyorsunuz?
Yermo Lamers

3
Ekstra scoll bar ile başa çıkmak için, hidden.bs.modal dinleyicide vücuda "modal-open" sınıfı eklemeniz gerekir.
Lee

5
Karşılaştığım bir sorun, ilk modalın gösterilmesi ve kaydırma çubuğuna ihtiyaç duymasıydı, ikinci bir modal gösterirsem, ilk modalın kaydırma çubuğunu kaldıracak ve kırpılmış bir modal ile sıkışmıştım. Bunu çözmek için, bunu CSS, .modal {overflow-y: auto; }
ScubaSteve

2
Bunun kabul edilen cevap olması gerektiğini hissediyorum. Benim için kusursuz çalışıyor.
Matthew Goheen

24

Yermo Lamers'ın önerisine dayanan daha kısa bir şey, bu iyi çalışıyor gibi görünüyor. Solmaya giriş / çıkış gibi temel animasyonlar ve hatta çılgın batman gazetesi bile dönüyor. 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
Burada kalan bir sorun, ikinci modal'ı kapatırsanız ve sayfanızın tarayıcı boyutunu aşacak kadar metin varsa, tuhaf kaydırma çubuğu davranışı ile sonuçlanır. Ayrıca modal-open, vücut elemanında sınıfı geri yüklemeniz gerekir : jsfiddle.net/vkyjocyn
StriplingWarrior

22

A1rPun'un cevabını StriplingWarrior'ın önerisiyle birleştirdiğimde bununla geldim:

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

Hatta sonradan eklenen dinamik kipler için bile çalışır ve ikinci kaydırma çubuğu sorununu kaldırır. Bunu yararlı bulduğum en önemli şey, formları Bootbox uyarılarından doğrulama geri bildirimi ile entegre etmekti, çünkü bunlar dinamik modals kullanıyorlar ve bu nedenle olayı .modal yerine belgeye bağlamanızı gerektiriyorlar, çünkü bu sadece mevcut olanlara ekleniyor modals.

Burada keman çal.


2
1040 sabit kodlu değeri yerine temel z-endeksi belirlemek için açık modals max z endeksi kullanarak önerebilir miyim? stackoverflow.com/a/5680815/2569159
harco gijsbers

12

Burada yayınlanan birçok fikri içeren bir Bootstrap eklentisi oluşturdum.

Bootply ile ilgili demo: http://www.bootply.com/cObcYInvpq

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

Ayrıca arka planın daha koyu ve daha koyu hale gelmesine neden olan ardışık modlarla ilgili sorunu giderir. Bu, herhangi bir zamanda yalnızca bir arka planın görünür olmasını sağlar:

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

Görünür arka planın z dizini hem show.bs.modalve hidden.bs.modalolaylarda güncellenir :

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

Güzel çözüm. Birden fazla modaya sahipken fonun daha karanlık olmasını bekliyorum ama neden istemediğini anlayabiliyorum. @AndyBurton Çözümümün eksik olduğunu bana bildirir misiniz?
A1rPun

@ A1rPun, 2. kipin açılıp kapanması üzerine 1. kipte kaydırmaya izin veren kaydırma çubukları kaldırıldı. IIRC, 2. modal kapatıldığında vücuttaki sınıfın kaldırılmış olması gibi görünüyordu.
Andy Burton

@AndyBurton Bu sorunun çözümünü de ele alıyorum.
A1rPun

11

İstifleme modlarını çözerken , biri kapatıldığında ana sayfayı kaydırır, Bootstrap'ın daha yeni sürümlerinin (en azından sürüm 3.0.3'ten beri) modal'ları yığınlamak için ek kod gerektirmediğini fark ettim.

Sayfanıza birden fazla mod (elbette farklı bir kimliğe sahip) ekleyebilirsiniz. Birden fazla mod açarken karşılaşılan tek sorun modal-open, vücut seçicisinin sınıfın kaldırılmasıdır .

Aşağıdaki Javascript kodunu yeniden eklemek için kullanabilirsiniz modal-open:

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

Yığılmış mod için zemin efektine ihtiyaç duymamanız durumunda ayarlayabilirsiniz data-backdrop="false".

Sürüm 3.1.1. modun kaydırma çubuğunu kaplayan sabit zemini düzelt , ancak yukarıdaki çözüm daha önceki sürümlerle de çalışıyor gibi görünüyor.


8

Sonunda çözüldü. Birçok yönden test ettim ve iyi çalışıyor.

Aynı sorunu yaşayan herkes için çözüm: Modal.prototype.show işlevini değiştirin (bootstrap.js veya modal.js adresinde)

DAN:

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

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

that.enforceFocus()

TO:

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()

Bulduğum en iyi yol: kaç modelin açıldığını kontrol edin ve modalın ve zeminin z-endeksini daha yüksek bir değere değiştirin.


6

Bootstrap 4 çözümü arıyorsanız, saf CSS kullanan kolay bir çözüm var:

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

Bu iyi çalışıyor gibi görünüyor ... bunun standart Bootstrap olacağını düşünür müsünüz?
CA'da

3

Bootply'da JS'nize aşağıdakileri eklemeyi deneyin

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

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

Açıklama:

Özelliklerle (Chrome'un geliştirici aracını kullanarak) oynadıktan sonra, z-indexaşağıdaki herhangi bir değerin 1031arka planın arkasına koyacağını fark ettim .

Öyleyse bootstrap'ın modal olay tutamaçlarını z-indexkullanarak 1030. Eğer #myModal2gösterilen ve ayarlanırsa z-indexiçin geri 1040eğer #myModal2gizlidir.

gösteri


2

Sys.showModal fonksiyonunu her çalıştırdığınızda z-endeksini arttırır ve yeni modalınıza ayarlar.

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

Benim için çözüm "kalıcı" sınıf benim modal div kullanmak DEĞİL oldu.


2

Komut dosyası çözümü yok, sadece css kullanarak iki modl katmanınız varsa, 2. modalı daha yüksek bir z dizinine ayarlayın

.second-modal { z-index: 1070 }

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

2

Belirli bir modalın başka bir açık modalın üstünde görünmesini istiyorsanız , diğer modaldan sonra en üst modalın HTML'sini eklemeyi deneyin div.

Bu benim için çalıştı:

<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

Bootstrap 4 için çözümüm, sınırsız model derinliği ve dinamik mod ile çalışıyor.

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

Benim için mükemmel çalıştı
Kaptan Sincap

1

Her mod için farklı bir kimlik verilmeli ve her bağlantıya farklı bir mod kimliği hedeflenmelidir. Yani böyle bir şey olmalı:

<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

DÜZENLEME: Bootstrap 3.3.4 bu sorunu (ve diğer kalıcı sorunları) çözdü, böylece bootstrap CSS ve JS'nizi güncelleyebiliyorsanız, bu en iyi çözüm olacaktır. Aşağıdaki çözümü güncelleyemiyorsanız yine de çalışır ve aslında bootstrap 3.3.4 ile aynı şeyi yapar (yeniden hesaplayın ve dolgu uygulayın).

Bass Jobsen'in belirttiği gibi, Bootstrap'ın daha yeni sürümleri z-endeksini çözdü. Kalıcı-açık sınıf ve dolgu hakkı benim için hala problemdi, ancak Yermo Lamers çözümünden esinlenen bu senaryolar onu çözüyor. Sadece JS dosyanıza bırakın ve keyfini çıkarın.

$(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

Şuna bir bak! Bu çözüm benim için sorunu çözdü, birkaç basit CSS satırı:

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

İşte onu buldum bir bağlantı: Bootply Sadece Üstte görünmesi gereken .modual HTML kodu ikinci olduğundan emin olun, böylece CSS "çift" olarak bulabilirsiniz.


1

açık / kapalı çoklu modüller için çalışmak

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);
       }
    });
});

gösteri

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


1

Benim için, bu basit scss kuralları mükemmel çalıştı:

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

Bu kurallar sizin durumunuzda yanlış modun en üstte olmasına neden oluyorsa, modsal div'lerinizin sırasını değiştirin veya yukarıdaki scss'de (tek) değerini (çift) olarak değiştirin.


0

İşte nth-of-typeişe yaramış gibi görünen bazı CSS seçicileri:

.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
Tamam, bu harika, ama üçüncü bir modal koydum ve işe yaramıyor. Ben (uyarılar, arama kutuları, vb gibi) oluşturmak bazı komut dosyaları var ve ben bir kerede (ben biliyorum kadar) 3 açık modals olabilir. Css ile iyi değilim, bir şey kaybedersem özür dilerim. Kod var: bootply.com/86975
Willian Bonho Daiprai

0

Benzer bir senaryom vardı ve biraz Ar-Ge'den sonra bir çözüm buldum. JS büyük olmamasına rağmen hala küçük bir sorgu yazmak başardık.

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

Modal.js dosyasına genel değişken ekleyin

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

// add değişkeni içindeki işlevi göster - 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

Diğer çözümler benim için kutudan çıkmadı. Belki de Bootstrap (3.3.2) daha yeni bir sürümünü kullandığım için .... bindirme modal iletişim üstünde görünüyordu .

Kodu biraz yeniden düzenledim ve modal fonu ayarlayan kısmı yorumladım. Bu sorunu düzeltti.

    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');
    });

Yan not olarak, bunu AngularJ'lerde kullanmak istiyorsanız, kodu modülünüzün .run () yönteminin içine koymanız yeterlidir.


0

Ne yazık ki yorum yapmak için bir üne sahip değilim, ancak 1040'lık bir z-endeksinin sabit kodlanmış taban çizgisine sahip kabul edilen çözümün, sayfada görüntülenen maksimum zIndex'i bulmaya çalışan zIndex hesaplamasından daha üstün olduğu belirtilmelidir.

Belirli uzantıların / eklentilerin .Max hesaplamasını bu kadar büyük bir sayı haline getiren üst düzey DOM içeriğine bağlı olduğu ve zIndex'i daha fazla arttıramayacağı anlaşılıyor. Bu, şablonun modun üzerinde yanlış göründüğü bir modla sonuçlanır (Firebug / Google Inspector araçlarını kullanırsanız, 2 ^ n - 1 sırasıyla bir zIndex görürsünüz)

Z-Index için Math.Max'ın çeşitli formlarının bu senaryoya yol açmasının belirli bir nedenini izole edemedim, ancak olabilir ve birkaç kullanıcı için benzersiz görünecektir. (Browserstack üzerindeki genel testlerim bu kodun mükemmel çalışmasını sağladı).

Umarım bu birine yardımcı olur.


0

Benim durumumda sorun, show olayının iki ve iki kez işlendiği bootstrap.js dosyalarını içeren bir tarayıcı uzantısından kaynaklandı modal-backdrop divin eklendiği , ancak modal kapatıldığında bunlardan sadece biri kaldırıldı.

Bunun, kromdaki gövde öğesine bir alt ağaç modifikasyon kesme noktası ekleyerek ve modal-backdropdiv ekleyerek izlendiğini buldu .


0
$(window).scroll(function(){
    if($('.modal.in').length && !$('body').hasClass('modal-open'))
    {
              $('body').addClass('modal-open');
    }

});

Yalnızca kod yanıtları sorunun neden olduğuna işaret etmekte genellikle yararsızdır . Sorunu neden çözdüğüne dair bir açıklama eklemelisiniz. Lütfen İyi bir cevabı nasıl yazarım?
FluffyKitten

0

Güncelleme: 22.01.2019, 13.41 Çözümü jhay ile optimize ettim, bu da örneğin bir detay verisinden diğerine ileri veya geri adım attığında aynı veya farklı diyalogları kapatmayı ve açmayı destekliyor.

(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

Moda sayısını kontrol edin ve z-endeksi olarak zemine değeri ekleyin

    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');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.