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ć?

phuwin
źródło
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.

orlland
źródło
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 }
Ngatia Frankline
źródło
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;
}
Suge
źródło
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.

chasmani
źródło
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ę.

vivekkupadhyay
źródło
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 Sen
źródło
@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.

Sam Malayek
źródło
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

Benjamin Oats
źródło
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.

febriana andringa
źródło
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.

jcdsr
źródło
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ę.

gauravbhai daxini
źródło
2

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

$(selector).on('hide.bs.modal', function (e) {
    $('body').css('padding-right','0');
});
michal.jakubeczy
źródło
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

Debrian Ruhut Saragih
źródło
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;
        }
Madalina Taina
źródło
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.

Cleber de Souza Alcântara
źródło
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.

scottx
źródło
1
body.modal-open{
  padding-right: 0 !important;
}
tian
źródło
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;
}
Jack Vial
źródło
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');
Edison D'souza
źródło
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 () { };

Phil
źródło
0

To może rozwiązać problem

.shop-modal.modal.fade.in {
    padding-right: 0px !important;
}
Dinoart
źródło
0

Jest to błąd ładowania początkowego i naprawiony w wersji v4-dev: https://github.com/twbs/bootstrap/pull/18441 do tego czasu powinno pomóc dodanie poniższej klasy CSS.

.fixed-padding {
  padding-right: 0px !important;
}
Ruchita Kasliwal
źródło
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.

Lucas Almeida
źródło
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 (?)

user3666136
źródło
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.

sibaspage
źródło
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');
    });
  }
Sakata Gintoki
źródło
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ę.

Lo Bellin
źródło
-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;
    }
});
yorg
źródło
-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);
netomo
źródło
-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

wkirk
źródło