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?


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.


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 }

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

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.


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.


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 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.


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


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.


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.


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.


2

Mit Bootstrap 4 hat das bei mir funktioniert:

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

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


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

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.


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.


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

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

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

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 () { };


0

Dies kann das Problem lösen

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


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.


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 (?)


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.


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

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.


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

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

-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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.