Bootstrap-Modalitäten fügen dem Körper nach dem Schließen immer wieder Polsterungsrechte hinzu

100

Ich verwende Bootstrap und Parse Framework, um eine kleine Webanwendung zu erstellen. Aber diese Bootstrap-Modalitäten fügen dem Körper nach dem Schließen immer wieder Polsterungsrechte hinzu. Wie kann man das lösen?

Ich habe versucht, diesen Code in mein Javascript einzufügen:

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


Aber es funktioniert nicht. Weiß jemand, wie man das behebt?

Mein Code:

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

Ich verwende Bootstrap und Parse Framework, um eine kleine Webanwendung zu erstellen. Aber diese Bootstrap-Modalitäten fügen dem Körper nach dem Schließen immer wieder Polsterungsrechte hinzu. Wie kann man das lösen?

Phuwin
quelle
2
Es ist nicht nur addieren , padding-rightsondern auch Klasse hinzufügen, um modal-openfür overflow: hiddensein nur für die versteckte Scroll-Leiste .
Vivekkupadhyay
@vivekkupadhyay Hallo, ich habe versucht, das modal-openmit zu überschreiben, padding-right:0 !important;aber es funktioniert nicht. Weißt du warum?
Phuwin
Bitte überprüfen Sie meine Antwort unten, es wird Ihnen sicherlich helfen.
vivekkupadhyay
Sie haben es fast geschafft. Sie lösen das padding-rightCSS-Eigenschaftsupdate für das richtige Ereignis aus, aber Sie lösen es für das falsche Element aus. Es muss auf das bodyElement abgefeuert werden . Bitte überprüfen Sie meine Antwort unten.
Sam Malayek

Antworten:

60

Dies könnte ein Fehler von Bootstrap Modal sein. Aus meinen Tests geht hervor, dass das Problem darin besteht, dass #adminPaneles initialisiert wird, obwohl es #loginModalnoch nicht vollständig geschlossen wurde. Die Abhilfen können die Animation werden zu entfernen , indem die Entfernung fadeKlasse auf #adminPanelund #loginModaloder ein Timeout (~ 500 ms) gesetzt vor dem Aufruf $('#adminPanel').modal();. Hoffe das hilft.

orlland
quelle
10
Ich habe die Klasse .fadeentfernt #loginModalund es funktioniert.
Phuwin
8
Was ist, wenn ich dies beheben und gleichzeitig die modale Animation beibehalten möchte?
Leonardo Montenegro
@LeonardoMontenegro Ich wollte das auch und vor kurzem habe ich auch die gleiche Frage gestellt, dass das Problem darin bestand, dass die Animation entfernt wurde, aber ich habe es behoben, indem ich zuerst die Überblendungsklasse entfernt habe, bevor ich sie ausgeblendet und wieder hinzugefügt habe, kurz nachdem sie ausgeblendet wurde Lösung, es sei denn, Bootstrap behebt es in der Datei selbst
Kramer
121

Ich habe gerade das unten stehende CSS-Update verwendet und es funktioniert für mich

body { padding-right: 0 !important }
Ngatia Frankline
quelle
1
Sie haben die richtige CSS-Eigenschaft, diese muss jedoch beim hide.bs.modalBootstrap-Ereignis ausgelöst werden . Bitte überprüfen Sie meine Antwort unten.
Sam Malayek
59
.modal-open {
    padding-right: 0px !important;
}

Gerade geändert zu

.modal {
    padding-right: 0px !important;
}
Suge
quelle
6
Dies ist die richtige Antwort: "Verwenden Sie die Überblendfunktion nicht" ist ein Kompromiss, keine Lösung.
Tasgall
1
Ich habe das Gleiche getan, aber möglicherweise muss auch "overflow: auto! Important" hinzugefügt werden, da die Bildlaufleiste auch ausgeblendet ist, wenn das Modal angezeigt wird.
Jaigus
Ich habe den Selektor ".modal.fade.show" verwendet, um alle meine Modalitäten mit der Fade-Klasse anzuvisieren.
Andrew Schultz
Das Hinzufügen der gleichen Stile zu .modal.fade.show funktioniert auch
Rami Zebian
Vielen Dank! Ich brauchte beides, weil sowohl das modalPanel als body.modal-openauch die Polsterung hatten. Aber das hat es einfach gut gemacht
Oliver Schimmer
20

Eine reine CSS-Lösung, die die Bootstrap-Funktionalität so hält, wie sie sein sollte.

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

Das Problem wird durch eine Funktion in der Bootstrap-jQuery verursacht, die beim Öffnen eines modalen Fensters ein wenig Auffüllrecht hinzufügt, wenn auf der Seite eine Bildlaufleiste vorhanden ist. Das verhindert, dass sich Ihr Körperinhalt beim Öffnen des Modals verschiebt, und es ist eine nette Funktion. Aber es verursacht diesen Fehler.

Viele der anderen hier aufgeführten Lösungen unterbrechen diese Funktion und führen dazu, dass sich Ihre Inhalte beim Öffnen des Modals geringfügig verschieben. Diese Lösung behält die Funktion des Bootstrap-Modals bei, verschiebt den Inhalt nicht, sondern behebt den Fehler.

Chasmani
quelle
1
Ich weiß nicht, warum jemand keine CSS-Lösung haben möchte. Ich möchte keine JS-Lösung. Dieser sieht gut aus.
Csaba Toth
1
Ich brauchte das, denn wenn ich das Modal ( nach einem Asyc-Postback im Modal) ablehnte, würde es immer noch diese seltsame Polsterung behalten. Ich brauchte jedoch immer noch eine Antwort von @Benjamin Oats, damit alles funktioniert, wenn ich Bildlaufleisten auf der Seite hatte.
MikeTeeVee
16

Wenn Sie sich mehr Gedanken über die padding-rightverwandte Sache machen, können Sie dies tun

jQuery :

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

Dies wird addClasszu Ihrem bodyund dann mit diesem

CSS :

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

und dies wird Ihnen helfen, loszuwerden padding-right.

Wenn Sie sich aber auch Sorgen um das Verstecken machen, müssen scrollSie auch Folgendes hinzufügen:

CSS :

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

Hier ist die JSFiddle

Bitte schauen Sie, es wird den Trick für Sie tun.

vivekkupadhyay
quelle
Scheint, als würde es nicht funktionieren. Oder ich habe etwas falsch gemacht. Er fügt noch padding-rightzu bodyund erhöht die Menge des padding-rightdurch 15px jedes Mal , wenn ich das Admin Panel schließen.
Phuwin
Ich habe gerade Ihren Link überprüft. Es scheint, dass Ihr Code nicht ausgeführt wird, da er nicht $(document).ready(function(){versucht, Ihren Code darin zu platzieren.
Vivekkupadhyay
Versuchen Sie, eine Warnung in Ihren Code einzufügen. Dann können Sie überprüfen, ob Ihr Code nicht ausgeführt wird. Es funktioniert gut auf Geige und wird auch auf Ihrer Seite nur funktionieren, wenn Sie es entsprechend verwenden
vivekkupadhyay
Aus einem bestimmten Grund wird der Code nicht ausgeführt, wenn das Modal angezeigt wird.
Phuwin
1
@vivekkupadhyay Vielen Dank für Ihre Mühe. Einen schönen Tag noch.
Phuwin
13

Öffnen Sie einfach bootstrap.min.css

Diese Zeile suchen (Standard)

.modal-open{overflow:hidden;}

und ändern Sie es als

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

Es funktioniert für jedes Modal der Site. Sie können einen Überlauf durchführen: auto; Wenn Sie die Bildlaufleiste beim Öffnen des modalen Dialogfelds beibehalten möchten.

Ashok Sen.
quelle
@Ashok Können Sie bitte die Ursache des Problems erläutern?
Alter
6
Diese Lösung hat mich in die richtige Richtung gelenkt. Aber anstatt bootstrap.min.css zu ändern, habe ich .modal-open {overflow: auto; padding-right: 0! Important;} in mein Hauptthema-Stylesheet eingefügt und es hat funktioniert!
Pratyush Deb
3
Bearbeiten Sie niemals die CSS von Bootstrap direkt. Fügen Sie die Überschreibungen immer dem CSS in Ihrem eigenen Stylesheet hinzu. Genau wie @PratyushDeb vorgeschlagen.
dotnetengineer
Dies ist keine großartige Lösung, da damit der Inhalt hinter dem Modal gescrollt werden kann. Das Modal grauisiert diesen Inhalt, weil der Benutzer mit ihm und nur mit ihm interagieren soll.
Ubiquibacon
11

Ich hatte das gleiche Problem sehr lange. Keine der Antworten hier hat funktioniert! Aber das Folgende hat es behoben!

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

Es gibt zwei Ereignisse, die beim Schließen eines Modals ausgelöst werden: erstens hide.bs.modalund dann hidden.bs.modal. Sie sollten nur eine verwenden können.

Sam Malayek
quelle
3
Es hat bei mir nicht funktioniert, als ich Listener für beide hide.bs.modalund hinzugefügt habe hidden.bs.modal. Aber es hat perfekt funktioniert, als ich mich hide.bs.modalvom Hörer entfernt habe. :)
HariV
An den Abwärtswähler: Bitte hinterlassen Sie konstruktive Kritik in einem Kommentar, damit ich diese Antwort verbessern kann.
Sam Malayek
3

einfache Lösung

füge diese Klasse hinzu

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

Es ist ein Override, funktioniert aber

Benjamin Oats
quelle
1
Diese Klasse, kombiniert mit der Antwort von @Chasmani, war für mich eine vollständige Lösung. Auch +1 für " Diese Klasse hinzufügen ". Es ist verrückt, die Antworten aller hier zu lesen und vorzuschlagen, die Datei Bootstrap.css zu überschreiben. Lassen Sie diese Datei in Ruhe und haben Sie Ihre eigene CSS-Datei, in der Sie alle " Bootstrap-Überschreibungen " anwenden . Dies ist wichtig, damit Sie sie dann alle an einem Ort dokumentieren und beim Aktualisieren / Aktualisieren von Bootstrap nicht verlieren und nach dem Upgrade auf eine neue Bootstrap-Version überprüfen können (um festzustellen, ob Sie die Problemumgehungen noch benötigen).
MikeTeeVee
1
Ich bin mit @MikeTeeVee einverstanden, dass Sie das Bootstrap-CSS definitiv nicht bearbeiten sollten. Ich habe das nicht in meine Antwort aufgenommen, weil ich herausgefunden habe, dass es etwas außerhalb des Rahmens für die Beantwortung dieser Frage liegt
Chasmani
2

Ich habe gerade die fadeKlasse entfernt und den Klassenüberblendungseffekt mit geändert animation.css. Ich hoffe das wird helfen.

febriana andringa
quelle
2

removeAttr funktioniert nicht. Sie werden die CSS-Eigenschaft folgendermaßen entfernen:

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

Ohne Eigenschaftswert wird die Eigenschaft entfernt.

jcdsr
quelle
2

Ich lade das Standard-Bootstrap 3.3.0-CSS und hatte ein ähnliches Problem. Durch Hinzufügen dieses CSS gelöst:

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

Das! Wichtig ist, dass das modale Bootstrap-Javascript programmgesteuert 15 Pixel Padding nach rechts hinzufügt. Ich vermute, dass es die Bildlaufleiste kompensieren soll, aber das will ich nicht.

gauravbhai daxini
quelle
2

Mit Bootstrap 4 hat das bei mir funktioniert:

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

Ich habe das gleiche Problem mit Bootstrap 3.3.7 und meiner Lösung für die feste Navigationsleiste: Hinzufügen dieses Stils zu Ihrem benutzerdefinierten CSS.

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

Dadurch wird Ihr Modal angezeigt, während das Bildlauffenster noch funktioniert. danke, hoffe das hilft dir auch

Debrian Ruhut Saragih
quelle
1

Ich weiß, dass dies eine alte Frage ist, aber keine der Antworten von hier hat das Problem in meinen ähnlichen Situationen behoben, und ich dachte, es wäre für einige Entwickler nützlich, auch meine Lösung zu lesen.

Ich verwende, um dem Body etwas CSS hinzuzufügen, wenn ein Modal geöffnet wird, auf den Websites, auf denen noch Bootstrap 3 verwendet wird.

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

Meine Lösung erfordert kein zusätzliches CSS.

Wie von @Orland angegeben, findet ein Ereignis immer noch statt, wenn das andere beginnt. Meine Lösung besteht darin, das zweite Ereignis (das adminPanelModal anzeigen) erst zu starten, wenn das erste abgeschlossen ist (das loginModalModal ausblenden).

Sie können dies erreichen, indem Sie einen Listener wie folgt an das hidden.bs.modalEreignis Ihres loginModalModals anhängen :

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

Und wenn nötig, verstecken Sie einfach das loginModalModal.

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

Natürlich können Sie Ihre eigene Logik im Listener implementieren, um zu entscheiden, ob das adminPanelModal angezeigt werden soll oder nicht .

Weitere Informationen zu Bootstrap Modal Events erhalten Sie hier .

Viel Glück.

Cleber de Souza Alcântara
quelle
1

Bootstrap-Modelle fügen dem Körper dieses Polsterrecht hinzu, wenn der Körper überläuft.

In Bootstrap 3.3.6 (der von mir verwendeten Version) ist dies die Funktion, die für das Hinzufügen dieses Auffüllrechts zum Body-Element verantwortlich ist: https://github.com/twbs/bootstrap/blob/v3.3.6/dist/js /bootstrap.js#L1180

Eine schnelle Problemumgehung besteht darin, diese Funktion nach dem Aufrufen der Datei bootstrap.js einfach zu überschreiben:

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

Dies hat das Problem für mich behoben.

Scottx
quelle
1
body.modal-open{
  padding-right: 0 !important;
}
Tian
quelle
1

Das hat bei mir funktioniert:

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
quelle
1
Funktioniert in Chrome! Vielen Dank.
Gene Kelly
0

Entfernen Sie einfach das data-targetvon der Schaltfläche und laden Sie das Modal mit jQuery.

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

jQuery:

$("#myBtn").modal('show');
Edison D'souza
quelle
0

Ich habe mich in das Bootstrap-Javascript eingegraben und festgestellt, dass der Modal-Code das richtige Auffüllen in einer Funktion adjustDialog()festlegt, die im Modal-Prototyp definiert und in jQuery verfügbar gemacht wird. Das Platzieren des folgenden Codes irgendwo, um diese Funktion zu überschreiben und nichts zu tun, hat den Trick für mich getan (obwohl ich nicht weiß, was die Konsequenz ist, wenn ich dies noch nicht eingestellt habe !!)

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

Phil
quelle
0

Dies kann das Problem lösen

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

Dies ist ein Bootstrap-Fehler, der in v4-dev behoben wurde: https://github.com/twbs/bootstrap/pull/18441 bis dahin sollte das Hinzufügen der folgenden CSS-Klasse helfen.

.fixed-padding {
  padding-right: 0px !important;
}
Ruchita Kasliwal
quelle
0

Ich hatte das gleiche Problem mit Modal und Ajax. Dies lag daran, dass auf die JS-Datei sowohl auf der ersten Seite als auch auf der von Ajax aufgerufenen Seite zweimal verwiesen wurde. Wenn also Modal geschlossen wurde, wurde das JS-Ereignis zweimal aufgerufen, wodurch standardmäßig ein Auffüllrecht von 17 Pixel hinzugefügt wurde.

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

Hat für mich gearbeitet. Beachten Sie, dass die Bildlaufleiste im Körper gezwungen ist - aber wenn Sie trotzdem eine "Bildlauf" -Seite haben, spielt es keine Rolle (?)

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

Versuche dies

Nach dem modalen Schließen wird die Polsterung um 0px zum Körper hinzugefügt.

sibaspage
quelle
0

Wenn Sie ein Modal öffnen, tritt das vorherige Modal noch nicht vollständig geschlossen auf. Um das Problem zu beheben, öffnen Sie einfach das neue Modal, wenn alle Modal vollständig geschlossen sind. Überprüfen Sie die folgenden Codes:

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

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

Ich jetzt das ist alt, und alle hier angebotenen Lösungen können funktionieren. Ich füge nur etwas Neues hinzu, falls es jemandem helfen könnte: Ich hatte das gleiche Problem und bemerkte, dass das Öffnen des Modals meinem Seitenav ein Randrecht hinzufügte (wahrscheinlich eine Art Vererbung von der Polsterung, die dem Körper hinzugefügt wurde). Das Hinzufügen von {margin-right: 0! Important;} zu meinem Seitenav hat den Trick gemacht.

Lo Bellin
quelle
-1

(Bootstrap v3.3.7) Von meinem Browser Inspektor sah ich , dass diese direkt in das Element gesetzt Stil Eigenschaft, Hexe Überschreibungen Klasseneigenschaften.

Ich habe versucht, den Paddig-Right- Wert zurückzusetzen, wenn das Modal angezeigt wird mit:

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

Aber es kommt zurück, sobald die Fenstergröße geändert wird :( (wahrscheinlich aus dem Pluggin-Skript).

Diese Lösung hat bei mir funktioniert:

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
quelle
-1

Wie @Orland sagt, wenn Sie einen Effekt wie Fade verwenden, müssen wir dort warten, bevor wir das Modal anzeigen. Dies ist ein bisschen hackig, reicht aber aus.

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
quelle
-2

Ich hoffe, es gibt noch jemanden, der diese Antwort braucht. In bootstrap.js gibt es eine Funktion namens resetScrollbar (). Aus irgendeinem dummen Grund haben die Entwickler beschlossen, die Abmessungen der Bildlaufleiste zum Auffüllrecht des Körpers hinzuzufügen. Wenn Sie also die rechte Auffüllung auf eine leere Zeichenfolge setzen, wird das Problem technisch behoben

wkirk
quelle