Setelah melihat banyak perbaikan untuk ini, dan tidak ada satupun yang persis seperti yang saya butuhkan, saya menemukan solusi yang lebih pendek yang terinspirasi oleh @YermoLamers & @Ketwaroo.
Backdrop z-index fix
Solusi ini menggunakan setTimeout
karena .modal-backdrop
tidak dibuat ketika acara show.bs.modal
dipicu.
$(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);
});
- Ini berfungsi untuk setiap yang
.modal
dibuat pada halaman (bahkan dinamis dinamis)
- Latar belakang langsung tumpang tindih dengan modal sebelumnya
Jika Anda tidak menyukai indeks-z hardcoded karena alasan apa pun, Anda dapat menghitung indeks-z tertinggi pada halaman seperti ini:
var zIndex = Math.max.apply(null, Array.prototype.map.call(document.querySelectorAll('*'), function(el) {
return +el.style.zIndex;
})) + 10;
Perbaikan scrollbar
Jika Anda memiliki modal pada halaman Anda yang melebihi tinggi browser, maka Anda tidak dapat menggulirnya saat menutup modal kedua. Untuk memperbaiki ini tambahkan:
$(document).on('hidden.bs.modal', '.modal', function () {
$('.modal:visible').length && $(document.body).addClass('modal-open');
});
Versi
Solusi ini diuji dengan bootstrap 3.1.0 - 3.3.5
.not(this)
ke baris kedua) untuk membuatnya bekerja dengan bootstrap datepickervar zIndex = 1040 + (10 * $('.modal:visible').not(this).length);
Saya menyadari jawaban telah diterima, tetapi saya sangat menyarankan untuk tidak meretas bootstrap untuk memperbaikinya.
Anda dapat dengan mudah mencapai efek yang sama dengan mengaitkan event handler yang ditampilkan.bs.modal dan hidden.bs.modal dan menyesuaikan indeks-z di sana.
Ini contoh yang bagus
Sedikit lebih banyak info tersedia di sini.
Solusi ini bekerja secara otomatis dengan banyak tumpukan modals.
Kode sumber skrip:
sumber
Versi yang lebih pendek berdasarkan saran Yermo Lamers, sepertinya ini berfungsi dengan baik. Bahkan dengan animasi dasar seperti fade in / out dan bahkan memutar koran batman gila. http://jsfiddle.net/ketwaroo/mXy3E/
sumber
modal-open
kelas pada elemen tubuh: jsfiddle.net/vkyjocynMenggabungkan jawaban A1rPun dengan saran dari StriplingWarrior, saya datang dengan ini:
Bekerja bahkan untuk modem dinamis yang ditambahkan setelah fakta, dan menghapus masalah scrollbar kedua. Hal yang paling penting yang saya temukan berguna untuk ini adalah mengintegrasikan formulir di dalam modals dengan umpan balik validasi dari peringatan Bootbox, karena yang menggunakan modem dinamis dan dengan demikian mengharuskan Anda untuk mengikat acara ke dokumen daripada ke .modal, karena itu hanya melekat pada yang sudah ada modals.
Biola di sini.
sumber
Saya membuat plugin Bootstrap yang menggabungkan banyak ide yang diposting di sini.
Demo di Bootply: http://www.bootply.com/cObcYInvpq
Github: https://github.com/jhaygt/bootstrap-multimodal
Ini juga membahas masalah dengan modalnya berturut-turut yang menyebabkan latar belakang menjadi lebih gelap dan lebih gelap. Ini memastikan bahwa hanya satu latar belakang yang terlihat pada waktu tertentu:
Indeks-z dari latar belakang yang terlihat diperbarui pada acara
show.bs.modal
danhidden.bs.modal
:sumber
Ketika menyelesaikan Stacking modals, gulir halaman utama ketika salah satu ditutup saya menemukan bahwa versi Bootstrap yang lebih baru (setidaknya sejak versi 3.0.3) tidak memerlukan kode tambahan untuk menumpuk modals.
Anda dapat menambahkan lebih dari satu modal (tentu saja memiliki ID berbeda) ke halaman Anda. Satu-satunya masalah yang ditemukan ketika membuka lebih dari satu modal adalah bahwa penutupan satu menghapus
modal-open
kelas untuk pemilih tubuh.Anda dapat menggunakan kode Javascript berikut untuk menambahkan kembali
modal-open
:Dalam hal ini tidak memerlukan efek latar belakang untuk modal ditumpuk yang dapat Anda atur
data-backdrop="false"
.Versi 3.1.1. memperbaiki Memperbaiki latar belakang modal overlay scrollbar modal , tetapi solusi di atas tampaknya juga bekerja dengan versi sebelumnya.
sumber
Akhirnya terpecahkan. Saya mengujinya dalam banyak cara dan berfungsi dengan baik.
Berikut adalah solusi untuk siapa pun yang memiliki masalah yang sama: Ubah fungsi Modal.prototype.show (di bootstrap.js atau modal.js)
DARI:
UNTUK:
Ini cara terbaik yang saya temukan: periksa berapa banyak modal dibuka dan ubah indeks-z modal dan latar belakang ke nilai yang lebih tinggi.
sumber
Jika Anda mencari solusi Bootstrap 4, ada yang mudah menggunakan CSS murni:
sumber
Coba tambahkan berikut ini ke JS Anda saat bootply
Penjelasan:
Setelah bermain-main dengan atribut (menggunakan alat dev Chrome), saya menyadari bahwa
z-index
nilai apa pun di bawah ini1031
akan meletakkan hal-hal di belakang layar.Jadi dengan menggunakan bootstrap's modal event handle saya atur
z-index
ke1030
. Jika#myModal2
ditampilkan dan aturz-index
kembali ke1040
jika#myModal2
disembunyikan.Demo
sumber
Setiap kali Anda menjalankan fungsi sys.showModal menambah z-index dan mengaturnya ke modal baru Anda.
sumber
Solusi untuk ini bagi saya adalah TIDAK menggunakan kelas "fade" pada modal divs saya.
sumber
Tidak ada solusi skrip, hanya menggunakan css karena Anda memiliki dua lapisan modals, atur modal ke-2 ke indeks z yang lebih tinggi
sumber
Jika Anda ingin modal tertentu muncul di atas modal terbuka lain, coba tambahkan HTML modal teratas setelah modal lainnya
div
.Ini bekerja untuk saya:
sumber
Solusi saya untuk bootstrap 4, bekerja dengan kedalaman modals dan modal dinamis yang tidak terbatas.
sumber
Setiap modal harus diberi id yang berbeda dan setiap tautan harus ditargetkan ke id modal yang berbeda. Jadi harus seperti itu:
sumber
EDIT: Bootstrap 3.3.4 telah menyelesaikan masalah ini (dan masalah modal lainnya) jadi jika Anda dapat memperbarui CSS dan JS bootstrap Anda, itu akan menjadi solusi terbaik. Jika Anda tidak dapat memperbarui solusi di bawah ini masih akan berfungsi dan pada dasarnya melakukan hal yang sama dengan bootstrap 3.3.4 (menghitung ulang dan menerapkan bantalan).
Seperti yang ditunjukkan oleh Bass Jobsen, versi Bootstrap yang lebih baru telah menyelesaikan indeks-z. Kelas modal-terbuka dan padding-right masih menjadi masalah bagi saya tetapi skrip ini terinspirasi oleh solusi Yermo Lamers yang memecahkannya. Cukup taruh di file JS Anda dan nikmati.
sumber
Lihat ini! Solusi ini memecahkan masalah bagi saya, beberapa baris CSS sederhana:
Berikut adalah tautan ke tempat saya menemukannya: Bootply Pastikan bahwa .modual yang perlu muncul di Top adalah yang kedua dalam kode HTML, sehingga CSS dapat menemukannya sebagai "datar".
sumber
bekerja untuk buka / tutup multi modals
Demo
https://www.bootply.com/cObcYInvpq#
sumber
Bagi saya, aturan scss sederhana ini berfungsi dengan sempurna:
Jika aturan ini menyebabkan modal yang salah berada di atas dalam kasus Anda, ubah urutan modal divs Anda, atau ubah (tidak datar) menjadi (datar) di scss di atas.
sumber
Berikut adalah beberapa CSS yang menggunakan
nth-of-type
penyeleksi yang tampaknya berfungsi:Bootply: http://bootply.com/86973
sumber
Saya memiliki skenario yang sama, dan setelah sedikit R&D saya menemukan solusi. Meskipun saya tidak hebat di JS, saya masih bisa menulis pertanyaan kecil.
http://jsfiddle.net/Sherbrow/ThLYb/
sumber
Tambahkan variabel global dalam modal.js
// tampilkan fungsi di dalam add variabel - Modal.prototype.backdrop
sumber
Solusi lain tidak berhasil bagi saya di luar kotak. Saya pikir mungkin karena saya menggunakan versi Bootstrap yang lebih baru (3.3.2) .... overlay muncul di atas dialog modal.
Saya refactored kode sedikit dan berkomentar bagian yang menyesuaikan latar belakang modal. Ini memperbaiki masalah.
Sebagai catatan, jika Anda ingin menggunakannya di AngularJs, cukup masukkan kode di dalam metode .run () modul Anda.
sumber
Sayangnya saya tidak memiliki reputasi untuk berkomentar, tetapi harus dicatat bahwa solusi yang diterima dengan garis dasar hardcod dari indeks 1040 z tampaknya lebih unggul daripada perhitungan zIndex yang mencoba menemukan zIndex maksimum yang diberikan pada halaman.
Tampaknya ekstensi / plugin tertentu mengandalkan konten DOM tingkat atas yang membuat perhitungan .Max sedemikian besar, sehingga tidak dapat menambah zIndex lebih jauh. Ini menghasilkan modal di mana overlay muncul di atas modal secara tidak benar (jika Anda menggunakan alat Firebug / Google Inspector Anda akan melihat zIndex pada urutan 2 ^ n - 1)
Saya belum bisa mengisolasi apa alasan spesifik berbagai bentuk Math.Max untuk z-Index mengarah ke skenario ini, tetapi itu bisa terjadi, dan itu akan tampak unik untuk beberapa pengguna. (Tes umum saya di browserstack memiliki kode ini berfungsi dengan sempurna).
Semoga ini bisa membantu seseorang.
sumber
Dalam kasus saya masalahnya disebabkan oleh ekstensi browser yang menyertakan file bootstrap.js di mana acara acara ditangani dua kali dan dua
modal-backdrop
div ditambahkan, tetapi ketika menutup modal hanya satu yang dihapus.Menemukan itu dengan menambahkan breakpoint modifikasi subtree ke elemen tubuh di chrome, dan melacak menambahkan
modal-backdrop
divs.sumber
sumber
Pembaruan: 22.01.2019, 13.41 Saya mengoptimalkan solusi dengan jhay, yang juga mendukung penutupan dan pembukaan dialog yang sama atau berbeda ketika misalnya melangkah dari satu data detail ke yang lain maju atau mundur.
sumber
Periksa jumlah modals dan tambahkan nilai ke latar belakang sebagai z-index
sumber