Modale Bootstrap dodają wyściółkę do ciała po zamknięciu


101

Używam frameworka bootstrap i parse, aby zbudować małą aplikację internetową. Ale te modały Bootstrap dodają wyściółkę do ciała po zamknięciu. Jak to rozwiązać?

Próbowałem umieścić ten kod w moim javascript:

$('.modal').on('hide.bs.modal', function (e) {
    $("element.style").css("padding-right","0");
});


Ale to nie działa. Czy ktoś wie, jak to naprawić?

Mój kod:

        <button type="button" class="btn btn-lg btn-default" data-toggle="modal" data-target="#loginModal">Admin panel</button>

         <div id="loginModal" class="modal fade" role="dialog">
                  <div class="modal-dialog modal-sm">

                    <!-- Modal content -->
                    <div class="modal-content">

                      <!-- header -->
                      <div class="modal-header"> 
                        <button type="button" class="close" data-dismiss="modal">&times;</button>
                        <h4 class="modal-title">Login</h4>
                      </div>

                      <!-- body -->
                      <div class="modal-body text-center" >
                          <input class='form-control' type="text" id="userName" placeholder="Username" ng-model='username'>
                          <input class='form-control' type="password" id="password" placeholder="Password" ng-model='password'>

                      <div class="modal-footer">
                        <button type="button" class="btn btn-default" id="loginButton" ng-click="goToAdminPanel()">Login</button>
                        <button type="button" class="btn btn-default" data-dismiss="modal" id="closeButton">Close</button>
                      </div>

                    </div>

                 </div>
                </div>
           </div>

        <div id="adminPanel" class="modal fade" role="dialog">
                  <div class="modal-dialog modal-lg">

                    <!-- Modal content -->
                    <div class="modal-content">

                      <!-- header -->
                      <div class="modal-header"> 
                        <button type="button" class="close" data-dismiss="modal">&times;</button>
                        <h4 class="modal-title">Admin Panel</h4>
                      </div>

                      <!-- body -->
                      <div class="modal-body" >

                        </div>

                      <div class="modal-footer">
                        <button type="button" class="btn btn-default" id="saveButton">Save</button>

                        <button type="button" class="btn btn-default" data-dismiss="modal" id="closeButton">Close</button>



                    </div>

                 </div>
                </div>
           </div>


    $scope.goToAdminPanel = function(){
    Parse.User.logIn($scope.username,$scope.password,{
        success: function(user){
            $('#loginModal').modal('hide');
            $('#adminPanel').modal();
        },
        error: function(user, error) {
            alert('Wrong username and/or password');
        }
    });
}

Używam frameworka bootstrap i parse, aby zbudować małą aplikację internetową. Ale te modały Bootstrap dodają wyściółkę do ciała po zamknięciu. Jak to rozwiązać?


2
To nie tylko dodać padding-right, ale również dodać klasę jak modal-opendla overflow: hiddenjej tylko za ukrywanie zwój-bar .
vivekkupadhyay

@vivekkupadhyay Witam, Próbowałem przesłonić modal-openz padding-right:0 !important;ale to nie działa, wiesz dlaczego?
phuwin

sprawdź moją odpowiedź poniżej, na pewno ci pomoże.
vivekkupadhyay

Prawie to masz. Jesteś wypalania padding-rightaktualizacji właściwości CSS na prawidłowe imprezy, ale jesteś wypalania go na niewłaściwym elementu. Należy go odpalić na bodyelemencie. Proszę sprawdzić moją odpowiedź poniżej.
Sam Malayek

Odpowiedzi:


62

To może być usterka modalu Bootstrap. Z moich testów wynika, że ​​problem polega na tym, że #adminPaneljest inicjowany, #loginModalale nie został jeszcze całkowicie zamknięty. Rozwiązaniem może być usunięcie animacji przez usunięcie fadeklasy #adminPaneli #loginModalustawienie limitu czasu (~ 500 ms) przed wywołaniem $('#adminPanel').modal();. Mam nadzieję że to pomoże.


10
Usunąłem zajęcia .fadez #loginModali działa.
phuwin

8
A jeśli chcę to naprawić i jednocześnie zachować animację modalną?
Leonardo Czarnogóra

@LeonardoMontenegro Też chciałem tego i ostatnio też opublikowałem to samo pytanie - problem polegał na tym, że animacja została usunięta, ale naprawiłem to, najpierw usuwając klasę zanikania tuż przed ukryciem i dodając ją ponownie zaraz po tym ukryciu, działało, chociaż jest to niewłaściwe obejście rozwiązanie, chyba że bootstrap naprawi to w samym pliku
Kramer

121

Właśnie skorzystałem z poniższej poprawki css i działa ona dla mnie

body { padding-right: 0 !important }

1
Masz poprawną właściwość css, ale musi ona zostać hide.bs.modaluruchomiona w zdarzeniu bootstrap. Proszę sprawdzić moją odpowiedź poniżej.
Sam Malayek

59
.modal-open {
    padding-right: 0px !important;
}

Właśnie zmieniono na

.modal {
    padding-right: 0px !important;
}

6
To jest prawdziwa prawidłowa odpowiedź - „nie używaj funkcji zanikania” to kompromis, a nie rozwiązanie.
Tasgall,

1
Zrobiłem to samo, ale może zaistnieć potrzeba dodania również „przepełnienie: auto!
Jaigus

Użyłem selektora ".modal.fade.show", aby skierować wszystkie moje modale za pomocą klasy fade.
Andrew Schultz

Dodanie tych samych stylów do .modal.fade.show też działa
Rami Zebian Kwietnia

Dzięki! Potrzebowałem obu, ponieważ zarówno modalpanel, jak i body.modal-openwyściółka. Ale to naprawiło to po prostu ładnie
Oliver Schimmer

20

Czyste rozwiązanie CSS, które zachowuje funkcjonalność ładowania początkowego tak, jak powinna.

body:not(.modal-open){
  padding-right: 0px !important;
}

Problem jest spowodowany funkcją w bootstrap jQuery, która dodaje trochę dopełnienia - w prawo, gdy otwiera się okno modalne, jeśli na stronie znajduje się pasek przewijania. To zapobiega przesuwaniu się zawartości ciała, gdy otwiera się modal, i jest to fajna funkcja. Ale to powoduje ten błąd.

Wiele innych podanych tutaj rozwiązań przerywa tę funkcję i sprawia, że ​​zawartość nieznacznie się zmienia w momencie otwarcia modalu. To rozwiązanie zachowa funkcję modalu bootstrap bez przesuwania zawartości, ale naprawi błąd.


1
Nie wiem, dlaczego ktoś miałby nie chcieć rozwiązania CSS. Nie chcę żadnego rozwiązania JS. Ten wygląda dobrze.
Csaba Toth

1
Potrzebowałem tego, ponieważ gdybym odrzucił Modal ( po Asyc-Postback w Modalu), nadal zachowałby to dziwne wypełnienie. Jednak nadal potrzebowałem odpowiedzi @Benjamin Oats, aby wszystko działało, gdy miałem jakiekolwiek paski przewijania na stronie.
MikeTeeVee

16

Jeśli bardziej martwisz się padding-rightpowiązaną rzeczą, możesz to zrobić

jQuery :

$('#loginModal').on('show.bs.modal', function (e) {
     $('body').addClass('test');
});

to będzie addClassdo ciebie, bodya następnie używając tego

CSS :

.test[style] {
     padding-right:0 !important;
 }

a to pomoże ci się pozbyć padding-right.

Ale jeśli obawiasz się również ukrywania, scrollmusisz też dodać to:

CSS :

.test.modal-open {
    overflow: auto;
 }

Oto JSFiddle

Proszę spojrzeć, to załatwi sprawę.


Wygląda na to, że to nie działa. Albo zrobiłem coś złego. Wciąż zwiększa padding-rightsię bodyi zwiększa ilość padding-rightprzez 15px każdym razem, kiedy zamknąć panel administratora.
phuwin

Właśnie sprawdziłem twój link . Wygląda na to, że twój kod nie jest wykonywany, ponieważ nie ma $(document).ready(function(){próby umieszczenia w nim twojego kodu .
vivekkupadhyay

spróbuj umieścić alert wewnątrz swojego kodu, a następnie możesz sprawdzić, czy kod nie jest uruchomiony. działa dobrze na skrzypcach i będzie działać również na twojej stronie tylko wtedy, gdy będziesz go odpowiednio używać
vivekkupadhyay

Z jakiegoś powodu kod nie działa, gdy wyświetlany jest modal.
phuwin

1
@vivekkupadhyay Dziękuję bardzo za twój wysiłek. Miłego dnia.
phuwin

13

Po prostu otwórz bootstrap.min.css

Znajdź tę linię (domyślnie)

.modal-open{overflow:hidden;}

i zmień go jako

.modal-open{overflow:auto;padding-right:0 !important;}

Będzie działać dla każdego modalu witryny. Możesz zrobić przepełnienie: auto; jeśli chcesz zachować pasek przewijania bez zmian podczas otwierania okna modalnego.


@Ashok Czy możesz wyjaśnić przyczynę problemu?
koleś

6
To rozwiązanie wskazało mi właściwy kierunek. Ale zamiast modyfikować bootstrap.min.css, umieściłem .modal-open {overflow: auto; padding-right: 0! Important;} w moim głównym arkuszu stylów motywu i zadziałało!
Pratyush Deb

3
Nigdy nie edytuj bezpośrednio css bootstrapa. Zawsze dodawaj nadpisania do css we własnym arkuszu stylów. Tak jak sugerował @PratyushDeb.
dotnetengineer

To nie jest świetne rozwiązanie, ponieważ pozwala na przewijanie zawartości za modalem. Modalne wyszarzają zawartość, ponieważ użytkownik powinien wchodzić w interakcję z nią i tylko z nią.
ubiquibacon

11

Miałem ten sam problem przez BARDZO długi czas. Żadna z odpowiedzi tutaj nie zadziałała! Ale następujące rozwiązania to naprawiły!

$(document.body).on('hide.bs.modal,hidden.bs.modal', function () {
    $('body').css('padding-right','0');
});

Są dwa zdarzenia, które uruchamiają się po zamknięciu modalu, najpierw to hide.bs.modal, a potem to hidden.bs.modal. Powinieneś móc użyć tylko jednego.


3
Nie działało to dla mnie, kiedy dodałem słuchacz dla obu hide.bs.modali hidden.bs.modal. Ale działało idealnie, gdy odsunąłem się hide.bs.modalod słuchacza. :)
HariV

Do słabszego wyborcy: Proszę zostawić konstruktywną krytykę w komentarzu, abym mógł poprawić tę odpowiedź.
Sam Malayek

3

łatwa naprawa

dodaj tę klasę

.modal-open {
    overflow: hidden;
    padding-right: 0 !important;
}

To przesłonięcie, ale działa


1
Ta klasa, w połączeniu z odpowiedzią zamieszczoną przez @Chasmani, stanowiła dla mnie kompletne i kompletne rozwiązanie. Również +1 za powiedzenie „ dodaj tę zajęcia ”. Szaleństwem jest czytanie tutaj wszystkich odpowiedzi sugerujących zastąpienie pliku Bootstrap.css. Zostaw ten plik w spokoju i miej swój własny plik CSS, w którym zastosujesz wszelkie " przesłonięcia Bootstrap ". Jest to ważne, więc możesz je wszystkie udokumentować w jednym miejscu, nie zgubić ich podczas aktualizacji / uaktualniania Bootstrap i przejrzeć je (aby sprawdzić, czy nadal potrzebujesz obejść) po aktualizacji do nowej wersji Bootstrap.
MikeTeeVee

1
Zgadzam się @MikeTeeVee, że zdecydowanie nie powinieneś edytować pliku css bootstrap. Nie
zawarłem

2

Właśnie usunąłem fadeklasę i zmieniłem efekt zanikania klasy za pomocą animation.css. Mam nadzieję, że to pomoże.


2

removeAttr nie zadziała, będziesz musiał usunąć właściwość CSS w następujący sposób:

        $('.modal').on('hide.bs.modal', function (e) {
            e.stopPropagation();
            $('body').css('padding-right','');
        }); 

Bez wartości właściwości właściwość jest usuwana.


2

Ładuję domyślny plik CSS bootstrap 3.3.0 i miałem podobny problem. Rozwiązany przez dodanie tego CSS:

body.modal-open { overflow:inherit; padding-right:inherit !important; }

Jest to ważne, ponieważ modalny javascript bootstrap dodaje 15 pikseli dopełnienia po prawej stronie programowo. Domyślam się, że ma to na celu skompensowanie paska przewijania, ale tego nie chcę.


2

Z Bootstrap 4 to zadziałało dla mnie:

$(selector).on('hide.bs.modal', function (e) {
    $('body').css('padding-right','0');
});

1

Mam ten sam problem z Bootstrapem 3.3.7 i moim rozwiązaniem dla stałego paska nawigacyjnego: Dodanie tego stylu do niestandardowego css.

.modal-open {
    padding-right: 0px !important;
    overflow-y: scroll;
}

sprawi, że twój modal zostanie pokazany, podczas gdy okno przewijania nadal działa. dzięki, mam nadzieję, że to też ci pomoże


1

Wiem, że to stare pytanie, ale żadna z odpowiedzi z tego miejsca nie usunęła problemu w podobnych sytuacjach i pomyślałem, że niektórzy deweloperzy również powinni przeczytać moje rozwiązanie.

Używam, aby dodać CSS do ciała, gdy modal jest otwarty, na stronach internetowych, gdzie nadal jest używany bootstrap 3.

body.modal-open{
            padding-right: 0!important;
            overflow-y:scroll;
            position: fixed;
        }

1

Moje rozwiązanie nie wymaga dodatkowego CSS.

Jak wskazał @Orland, jedno wydarzenie nadal ma miejsce, gdy zaczyna się drugie. Moje rozwiązanie polega na rozpoczęciu drugiego zdarzenia (pokazanie adminPanelmodalu) dopiero po zakończeniu pierwszego (ukrycie loginModalmodalu).

Możesz to osiągnąć, dołączając odbiornik do hidden.bs.modalzdarzenia swojego loginModalmodalu, jak poniżej:

$('#loginModal').on('hidden.bs.modal', function (event) {
    $('#adminPanel').modal('show');
}

W razie potrzeby po prostu ukryj loginModalmodal.

$('#loginModal').modal('hide');

Oczywiście możesz zaimplementować własną logikę wewnątrz słuchacza, aby zdecydować, czy pokazać adminPanelmodalne, czy nie .

Więcej informacji o zdarzeniach modalnych Bootstrap można znaleźć tutaj .

Powodzenia.


1

Modele Bootstrap dodają to wypełnienie - bezpośrednio do ciała, jeśli ciało jest przepełnione.

W bootstrap 3.3.6 (wersja, której używam) jest to funkcja odpowiedzialna za dodanie tego dopełnienia w prawo do elementu body: https://github.com/twbs/bootstrap/blob/v3.3.6/dist/js /bootstrap.js#L1180

Szybkim obejściem jest po prostu nadpisanie tej funkcji po wywołaniu pliku bootstrap.js:

$.fn.modal.Constructor.prototype.setScrollbar = function () { };

To rozwiązało problem.



1

Oto, co zadziałało dla mnie:

body.modal-open {
    overflow: auto !important;
}

// Bootstrap uses JS to set the element style so you can
// override those styles like this
body.modal-open[style] {
    padding-right: 0px !important;
}

1
Działa w Chrome! Dzięki.
Gene Kelly

0

Po prostu usuń przycisk data-targetz przycisku i załaduj modal za pomocą jQuery.

<button id='myBtn' data-toggle='modal'>open modal</button>

jQuery:

$("#myBtn").modal('show');

0

Zagłębiłem się w javascript bootstrap i odkryłem, że kod modalny ustawia właściwe wypełnienie w wywołanej funkcji, adjustDialog()która jest zdefiniowana w prototypie Modal i ujawniona w jQuery. Umieszczenie poniższego kodu gdzieś w celu przesłonięcia tej funkcji, aby nic nie zrobiło, załatwiło mi sprawę (chociaż nie wiem, jakie są konsekwencje niepodjęcia tego ustawienia !!)

$.fn.modal.Constructor.prototype.adjustDialog = function () { };


0

To może rozwiązać problem

.shop-modal.modal.fade.in {
    padding-right: 0px !important;
}


0

Miałem ten sam problem przy użyciu modali i ajax. Było tak, ponieważ plik JS był odwoływany dwukrotnie, zarówno na pierwszej stronie, jak i na stronie wywoływanej przez ajax, więc kiedy modal został zamknięty, wywołał zdarzenie JS dwukrotnie, co domyślnie dodaje dopełnienie o 17 pikseli.


0
body {
    padding-right: 0 !important;
    overflow-y: scroll!important;
}

Pracował dla mnie. Zwróć uwagę, że pasek przewijania jest wymuszony w treści - ale jeśli i tak masz stronę „przewijaną”, nie ma to znaczenia (?)


0
$('.modal').on('hide.bs.modal,hidden.bs.modal', function () {
 setTimeout(function(){
  $('body').css('padding-right',0);
 },1000);
});

Spróbuj tego

Doda wypełnienie po prawej stronie 0px do ciała po zamknięciu modalnym.


0

Występuje, gdy otwierasz modal, że poprzedni modal nie jest jeszcze całkowicie zamknięty. Aby to naprawić, po prostu otwórz nowy modal w momencie, gdy wszystkie modalne są całkowicie zamknięte, sprawdź kody poniżej:

  showModal() {
    let closeModal = $('#your-modal');

    closeModal.modal('hide');
    closeModal.on('hidden.bs.modal', function() {
      $('#new-open-modal').modal('show');
    });
  }

0

Teraz to jest stare i wszystkie oferowane tutaj rozwiązania mogą działać. Po prostu dodaję coś nowego na wypadek, gdyby ktoś mógł pomóc: miałem ten sam problem i zauważyłem, że otwarcie modalu było dodaniem prawa do marginesu do mojego sidenav (prawdopodobnie rodzaj dziedziczenia z wypełnienia dodanego do ciała). Dodanie {margin-right: 0! Important;} do mojego sidenava załatwiło sprawę.


-1

(Bootstrap v3.3.7) Z inspektora mojej przeglądarki zauważyłem, że jest to bezpośrednio ustawione we właściwości stylu elementu , co zastępuje właściwości klasy.

Próbowałem `` zresetować '' wartość paddig-right, gdy modal jest wyświetlany z:

$("#myModal").on('shown.bs.modal', function(){
    $(this).css({paddingRight:""});
});

Ale wraca, gdy tylko zmieni się rozmiar okna :( (prawdopodobnie ze skryptu pluggin).

To rozwiązanie zadziałało dla mnie:

var modal_needfix=true;
$("#myModal").on('shown.bs.modal', function(){
    var modalscope=$(this);
    modalscope.css({paddingRight:""});
    if(modal_needfix){
        window.addEventListener("resize",function(){
            requestAnimationFrame(function(){// be sure to act after the pluggin script
                modalscope.css({paddingRight:""});
            });
        });
        modal_needfix=false;
    }
});

-1

Jak mówi @Orland, jeśli używasz jakiegoś efektu, takiego jak zanikanie, musimy poczekać przed wyświetleniem modalu, jest to trochę hacky, ale załatwi sprawę.

function defer(fn, time) {
    return function () {
        var args = arguments,
            context = this;

        setTimeout(function () {
            fn.apply(context, args);
        }, time);
    };
}

$.fn.modal.Constructor.prototype.show = defer($.fn.modal.Constructor.prototype.show, 350);

-2

Mam nadzieję, że nadal jest ktoś, kto potrzebuje tej odpowiedzi. W bootstrap.js znajduje się funkcja o nazwie resetScrollbar (), z jakiegoś głupiego powodu programiści zdecydowali się dodać wymiary paska przewijania do prawego dopełnienia ciała. więc technicznie rzecz biorąc, jeśli po prostu ustawisz dopełnienie w prawo na pusty ciąg, rozwiąże to problem

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.