Potrzebuję, aby nakładka pokazywała się nad pierwszym modułem, a nie z tyłu.
Starałem się zmienić z-index
od .modal-backdrop
, ale staje się bałagan.
W niektórych przypadkach mam więcej niż dwa moduły na tej samej stronie.
źródło
Potrzebuję, aby nakładka pokazywała się nad pierwszym modułem, a nie z tyłu.
Starałem się zmienić z-index
od .modal-backdrop
, ale staje się bałagan.
W niektórych przypadkach mam więcej niż dwa moduły na tej samej stronie.
Po zobaczeniu wielu poprawek do tego, a żadna z nich nie była dokładnie tym, czego potrzebowałem, wpadłem na jeszcze krótsze rozwiązanie, które jest inspirowane przez @YermoLamers & @Ketwaroo.
Tło poprawki z-index
To rozwiązanie wykorzystuje, setTimeout
ponieważ .modal-backdrop
nie jest tworzone, gdy zdarzenie show.bs.modal
jest wyzwalane.
$(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);
});
.modal
utworzonego na stronie (nawet dynamicznego)Jeśli z jakiegoś powodu nie podoba ci się sztywny indeks Z, możesz obliczyć najwyższy indeks Z na stronie w następujący sposób:
var zIndex = Math.max.apply(null, Array.prototype.map.call(document.querySelectorAll('*'), function(el) {
return +el.style.zIndex;
})) + 10;
Poprawka paska przewijania
Jeśli na stronie znajduje się modal, który przekracza wysokość przeglądarki, nie można go przewijać podczas zamykania drugiego modalu. Aby naprawić to dodaj:
$(document).on('hidden.bs.modal', '.modal', function () {
$('.modal:visible').length && $(document.body).addClass('modal-open');
});
Wersje
To rozwiązanie jest testowane z bootstrap 3.1.0 - 3.3.5
.not(this)
do drugiej linii), aby działała zvar zIndex = 1040 + (10 * $('.modal:visible').not(this).length);
Zdaję sobie sprawę, że odpowiedź została zaakceptowana, ale zdecydowanie sugeruję, aby nie hakować bootstrap, aby to naprawić.
Możesz dość łatwo osiągnąć ten sam efekt, przechwytując moduły obsługi zdarzeń pokazanych na zdjęciu.bs.modal i hidden.bs.modal i dostosowując tam indeks Z.
Oto działający przykład
Trochę więcej informacji jest dostępnych tutaj.
To rozwiązanie działa automatycznie z dowolnie głęboko stosami modów.
Kod źródłowy skryptu:
źródło
Coś krótsza wersja oparta na sugestii Yermo Lamersa, wydaje się, że działa dobrze. Nawet z podstawowymi animacjami, takimi jak zanikanie i zanikanie, a nawet szalona gazeta o batmanie się obraca. http://jsfiddle.net/ketwaroo/mXy3E/
źródło
modal-open
klasę na elemencie ciała: jsfiddle.net/vkyjocynŁącząc odpowiedź A1rPun z sugestią StriplingWarrior, wymyśliłem:
Działa nawet w przypadku dynamicznych modów dodanych po fakcie i usuwa problem z drugim paskiem przewijania. Najbardziej godną uwagi rzeczą, dla której uznałem to za przydatne, było integrowanie formularzy w modach ze sprzężeniem zwrotnym sprawdzania poprawności z alertów Bootbox, ponieważ używają one modów dynamicznych, a zatem wymagają powiązania zdarzenia z dokumentem, a nie z .modal, ponieważ to tylko dołącza do istniejącego moduły.
Fiddle tutaj.
źródło
Stworzyłem wtyczkę Bootstrap, która zawiera wiele pomysłów opublikowanych tutaj.
Demo na Bootply: http://www.bootply.com/cObcYInvpq
Github: https://github.com/jhaygt/bootstrap-multimodal
Rozwiązuje również problem z kolejnymi modami powodującymi, że tło staje się ciemniejsze. Dzięki temu w danym momencie widoczne jest tylko jedno tło:
Indeks Z widocznego tła jest aktualizowany zarówno dla zdarzeń, jak
show.bs.modal
ihidden.bs.modal
:źródło
Podczas rozwiązywania Modów układania przewija się strona główna, gdy jest ona zamknięta i zauważyłem, że nowsze wersje Bootstrap (przynajmniej od wersji 3.0.3) nie wymagają dodatkowego kodu do modulacji stosów.
Możesz dodać więcej niż jeden modal (oczywiście posiadający inny identyfikator) do swojej strony. Jedynym problemem stwierdzonym podczas otwierania więcej niż jednego modalu będzie to, że zamknięcie jednego usuwa
modal-open
klasę dla selektora nadwozia.Możesz użyć następującego kodu JavaScript, aby ponownie dodać
modal-open
:W przypadku, gdy nie potrzebujesz efektu tła dla ułożonego modalu, możesz ustawić
data-backdrop="false"
.Wersja 3.1.1. naprawiono Naprawiono modalne tło nakładające się na pasek przewijania modalu , ale powyższe rozwiązanie wydaje się działać również z wcześniejszymi wersjami.
źródło
Wreszcie rozwiązany. Przetestowałem to na wiele sposobów i działa dobrze.
Oto rozwiązanie dla każdego, kto ma ten sam problem: Zmień Modal.prototype.show (w bootstrap.js lub modal.js)
Z:
DO:
To najlepszy sposób, jaki znalazłem: sprawdź, ile modałów jest otwartych i zmień indeks Z modalu i tła na wyższą wartość.
źródło
Jeśli szukasz rozwiązania Bootstrap 4, możesz skorzystać z czystego CSS:
źródło
Spróbuj dodać poniższe do JS podczas bootply
Wyjaśnienie:
Po zapoznaniu się z atrybutami (za pomocą narzędzia deweloperskiego Chrome) zdałem sobie sprawę, że każda
z-index
wartość poniżej1031
umieści rzeczy za tłem.Więc za pomocą modalnych uchwyty zdarzeń Bootstrap za ustawić
z-index
się1030
. Jeśli#myModal2
jest wyświetlany i ustaw zz-index
powrotem na1040
if#myModal2
jest ukryty.Próbny
źródło
Za każdym razem, gdy uruchamiasz funkcję sys.showModal, zwiększ wartość indeksu Z i ustaw go na nowy modal.
źródło
Rozwiązaniem tego było dla mnie NIE używanie klasy „fade” na moich modalnych divach.
źródło
Żadne rozwiązania skryptowe, używając tylko css, pod warunkiem, że masz dwie warstwy modałów, ustaw 2. modal na wyższy indeks z
źródło
Jeśli chcesz, aby określony modal pojawiał się na innym modale otwartym, spróbuj dodać kod HTML najwyższego modalu po drugim modale
div
.To działało dla mnie:
źródło
Moje rozwiązanie dla bootstrap 4, pracującego z nieograniczoną głębokością modali i dynamicznym modalem.
źródło
Każdy modal powinien mieć inny identyfikator, a każdy link powinien być ukierunkowany na inny identyfikator modalu. Powinno to być coś takiego:
źródło
EDYCJA: Bootstrap 3.3.4 rozwiązał ten problem (i inne problemy modalne), więc jeśli możesz zaktualizować bootstrap CSS i JS, byłoby to najlepsze rozwiązanie. Jeśli nie możesz zaktualizować, poniższe rozwiązanie będzie nadal działać i zasadniczo robi to samo, co bootstrap 3.3.4 (ponownie oblicz i zastosuj padding).
Jak zauważył Bass Jobsen, nowsze wersje Bootstrap mają rozwiązany indeks Z. Klasa otwarta modalnie i prawa dopełniania nadal były dla mnie problemami, ale skrypty zainspirowane rozwiązaniem Yermo Lamersa rozwiązują to. Po prostu upuść go w pliku JS i ciesz się.
źródło
Sprawdź to! To rozwiązanie rozwiązało problem dla mnie, kilka prostych linii CSS:
Oto link do tego, gdzie go znalazłem: Bootply Upewnij się, że .modual, który musi pojawić się na górze, jest drugi w kodzie HTML, aby CSS mógł go znaleźć jako „parzysty”.
źródło
praca dla otwierania / zamykania wielu modułów
Próbny
https://www.bootply.com/cObcYInvpq#
źródło
Dla mnie te proste reguły scss działały idealnie:
Jeśli te reguły powodują, że niewłaściwy modal znajduje się w twoim przypadku, zmień kolejność modalnych div lub zmień (nieparzysty) na (parzysty) w powyższym scss.
źródło
Oto kilka CSS wykorzystujących
nth-of-type
selektory, które wydają się działać:Bootply: http://bootply.com/86973
źródło
Miałem podobny scenariusz i po odrobinie prac badawczo-rozwojowych znalazłem rozwiązanie. Chociaż nie jestem świetny w JS, udało mi się napisać małe zapytanie.
http://jsfiddle.net/Sherbrow/ThLYb/
źródło
Dodaj zmienną globalną do modal.js
// pokaż funkcję wewnątrz dodaj zmienną - Modal.prototype.backdrop
źródło
Inne rozwiązania nie działały dla mnie od razu po wyjęciu z pudełka. Myślę, że może dlatego, że używam nowszej wersji Bootstrap (3.3.2) .... nakładka pojawiła się na górze modalnego okna dialogowego.
Trochę przebudowałem kod i skomentowałem część, która dostosowywała tło modalne. To rozwiązało problem.
Na marginesie, jeśli chcesz użyć tego w AngularJs, po prostu wstaw kod do metody .run () modułu.
źródło
Niestety nie mam reputacji do komentowania, ale należy zauważyć, że zaakceptowane rozwiązanie z zakodowaną linią bazową indeksu Z 1040 wydaje się być lepsze niż obliczenie zIndex, które próbuje znaleźć maksymalną renderowaną wartość ZIndex na stronie.
Wygląda na to, że niektóre rozszerzenia / wtyczki polegają na zawartości DOM najwyższego poziomu, co sprawia, że obliczenia .Max są tak nieprzyzwoicie duże, że nie mogą już zwiększać zIndex. Powoduje to powstanie modalu, w którym nakładka pojawia się nieprawidłowo nad modalem (jeśli użyjesz narzędzi Firebug / Google Inspector, zobaczysz indeks zI rzędu 2 ^ n - 1)
Nie byłem w stanie wyodrębnić, z jakiego konkretnego powodu różne formy Math.Max dla z-Index prowadzą do tego scenariusza, ale może się zdarzyć i będzie on wydawał się wyjątkowy dla kilku użytkowników. (Moje ogólne testy na przeglądarce stosowały ten kod działający idealnie).
Mam nadzieję, że to komuś pomoże.
źródło
W moim przypadku problem został spowodowany przez rozszerzenie przeglądarki, które zawiera pliki bootstrap.js, w których zdarzenie show obsłużyło się dwukrotnie i
modal-backdrop
dodano dwa divy, ale podczas zamykania modalu usuwany jest tylko jeden z nich.Znaleziono to, dodając punkt przerwania modyfikacji poddrzewa do elementu body w chrome, i śledziłem dodawanie
modal-backdrop
div.źródło
źródło
Aktualizacja: 22.01.2019, 13.41 Zoptymalizowałem rozwiązanie przez jhay, który obsługuje także zamykanie i otwieranie tych samych lub różnych okien dialogowych, na przykład przechodząc od jednego szczegółowego danych do drugiego do przodu lub do tyłu.
źródło
Sprawdź liczbę modali i dodaj wartość do tła jako indeks Z.
źródło