Bootstrap-Modal: Der Hintergrund springt beim Umschalten nach oben


110

Ich habe ein Problem mit einem Modal. Ich habe eine Schaltfläche auf einer Seite, die das Modal umschaltet. Wenn das Modal angezeigt wird, springt die Seite nach oben.

Ich habe alles getan, um eine Lösung zu finden, aber ich bin wirklich verloren.

BEARBEITEN:

Ich habe es auch mit versucht: $('#myModal').modal('show');aber es hat genau den gleichen Effekt.


Hallo Benni. Ja, das bin ich trotzig. Ich habe es auch versucht mit: $ ('# myModal'). Modal ('show'); aber es hat genau den gleichen Effekt.
FooBar

1
kann diese Ihnen helfen, das gleiche Problem: stackoverflow.com/questions/12894570/...
Mark

@ Mark, siehe meine Antwort unten ...
Ravimallya

Mir ist aufgefallen, windowdass das Modal ausgelöst wird, wenn ich irgendwo darauf klicke. Das scheint seltsam und unerwartet. Ich habe die buttonvia devtools entfernt und durch Klicken auf eine beliebige Stelle auf der Seite wurde immer noch das modale Fenster geöffnet. War das gewünschtes Verhalten? Ich frage mich, ob Sie nicht den richtigen Selektor für das modale Klickereignis haben.
Dward

Antworten:


174

Wenn das Modal geöffnet wird, wird eine modal-openKlasse auf das <body>Tag gesetzt. Diese Klasse setzt overflow: hidden;auf den Körper. Fügen Sie diese Regel Ihrem Stylesheet hinzu, um den Stil bootstrap.css zu überschreiben:

body.modal-open {
    overflow: visible;
}

Jetzt sollte die Schriftrolle an Ort und Stelle bleiben.


@pstenstrm, ich habe einen Zweifel. Sie haben gesagt, dass Sie das CSS für die .modal-open-Klasse überschreiben sollen. Aber was ist, wenn es zusätzliche schließende Divs gibt und ich in meiner Antwort keine Klassen in meiner Auflösung überschrieben habe? Es funktioniert gut, nachdem 2 zusätzliche Divs entfernt wurden. bs modal Hinzufügen von .modal-Backdrop Div, das verwirrt wird, wo es wegen zusätzlicher schließender Tags geschlossen werden musste.
Ravimallya

4
Funktioniert bei mir nicht, ich habe das Modal in einem Iframe und es scrollt nach oben ... irgendwelche Ideen?
Cabuxa.Mapache

5
Das hat es für mich behoben. Nur um die Wurzel meines Problems hinzuzufügen, war 'body {height: 100%}'.
PeteG

23
Ich arbeite nicht für mich. Ich habe ein Vanille-Modal, mit dem ich öffne, .modal('show')und es rollt immer noch zum Anfang der Seite. Bootstrap v3.2.0
MandM

6
Ich musste zu position: inheritdieser Klasse hinzufügen , arbeitete danach aber wie ein Zauber.
Adrian3martin

28

Wenn Sie modal mit Tag anrufen. Versuchen Sie, '#' aus dem href-Attribut zu entfernen. Rufen Sie modal mit Datenattributen auf.

<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
  Launch demo modal
</button>

Ich öffne es genau so, wie Sie es dort gepostet haben. Überprüfen Sie heraus den Link
FooBar

5
Wenn Sie nicht die "<Button>" verwenden, sondern <a>, wie in meinem Fall, verlieren Sie das Symbol "Fingertaste", wenn Sie den Mauszeiger auf das Objekt bewegen. Um dies zu überwinden, habe ich Folgendes getan: ... href = "# mai_modal_id" data-toggle = "modal" ... und ich habe kein
Datenziel verwendet

3
@pagurix - Ihr Kommentar hat in meinem Szenario am besten funktioniert.
AlfredBr

Ich denke, @pagurix sollte seinen Kommentar als separate Antwort schreiben. Einzige Sache, die geholfen hat. Daumen hoch!
Vibhor Dube

13

Wenn Sie das Ankertag als verwenden <a href"#" ..> ... </a>und ein href="#"Problem erstellen, entfernen Sie dieses. Sie können mehr darüber lesen hier


12
$('the thing you click on').click(function ($e) {
            $e.preventDefault();
});

Dies wird Ihnen helfen, die Bildlaufleiste oben zu stoppen. Es hat bei mir funktioniert


5

Möglicherweise arbeiten Sie mit Modalen, die irgendwo im Code verschachtelt sind:

body.modal-open {
    overflow: visible;
    position: absolute;
    width: 100%;
    height:100%;
}

Für mich war es eine Kombination aus Position, Höhe und Überlauf.


4

Ich sehe keinen bestimmten Fehler, aber ich würde Ihnen raten, Ihre HTML-Syntax zu überprüfen .

Ein kleiner Test mit Ihrer Quelle gibt mir Fehler wie

Zeile 127, Spalte 34: Nicht geschlossenes Element div.

              <div class="inner onlySides">

Dies könnte ein Problem sein.


Vielen Dank - ich werde das untersuchen - auch wenn ich kaum glauben kann, dass dies das Problem auslösen könnte, das ich habe. Es sieht so aus, als würden Sie ein Plugin verwenden, um dies zu verfolgen - wenn ja; welche?
FooBar

Ich benutze kein Plugin außer Firebug. Es ist immer eine gute Sache, die Gültigkeit Ihrer Seite auf validator.w3.org zu überprüfen . Es wäre ein Problem, denn wenn Sie div nicht geschlossen haben, werden Sie seltsames Verhalten haben :)
BillyJoe

4

Der einfachste Weg, den springenden Hintergrund zu lösen, besteht darin, zwei Parameter zu definieren:

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

3

Ich habe versucht, dieses Problem auf meinem lokalen Host zu replizieren, und so seltsam es auch scheinen mag, es liegt ein Konflikt mit der von Ihnen verwendeten Bootstrap JS-Datei vor.

Versuchen Sie, Ihren Code zu kommentieren:

<script src="/min/?f=bootstrap.min.js,modernizr.js,bootstrap-datetimepicker.js,nprogress.js,feedback.js,select2.min.js,jquery.unveil.js,equalheights.jquery.js,hogan-v2.0.0.min.edu-custom.js,jquery.visible.min.js,handlebars-v1.2.0.js,typeahead.bundle.min.js,jquery.gridster.js,cookie.jquery.js,jquery.autosize.min.js,application.js&ver=1392814384"></script>    

Verwenden Sie stattdessen Bootstrap 2.3.2:

<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>

Das hat es für mich funktionieren lassen.

Ich habe es mit Bootstrap Version 3 versucht, aber das hat nicht funktioniert. Ich kann den Problemteil immer noch nicht genau bestimmen, aber irgendwo in Firebug ist mir ein e.preventDefault() is not a functionFehler aufgetreten. Ich vermute, dass dies die Hauptursache sein sollte, aber ich muss ihn noch mit den anderen JS-Dateien vergleichen.


3

Ich habe versucht, .modal oben in die Mitte des Bildschirms zu setzen.

.modal {
    position: absolute;
    top: 50%;
}

Nur meine 2 Cent Gedanken.


Nahe genug. Ich werde nicht abstimmen, weil mein Problem möglicherweise anderswo liegt, aber dies führte dazu, dass die untere Hälfte des Bildschirms abgeblendet wurde, aber das Modal in Richtung Mitte positioniert war.
Crafter

3

In Bootstrap 3.1.1 habe ich mit folgender Lösung gelöst:

body.modal-open {
    position: absolute !important;
}

2
Du hast meinen Tag gerettet @Filo Vielen Dank
vinothini

2

Sie haben 2 zusätzliche schließende divTags kurz vor <div id="footer">oder nach dem <div id="mainFrame" class="group">div. Ich benutze Visual Studio 2012 Express, um dies zu überprüfen.

Bitte entfernen Sie diese 2 zusätzlichen Divs und lassen Sie uns wissen, wie es funktioniert. Ich habe zusätzliche Divs entfernt und alle benutzerdefinierten Skripte entfernt. nur jquery core und bootstrap in der footer beibehalten. Hier ist der Screenshot der endgültigen Ausgabe. Hier ist der JSBIN-Spielplatz für Sie, der gut funktioniert.

Ich empfehle Ihnen, headjs zu verwenden, um alle Skripte und CSS-Dateien zu laden. Es ist auch keine gute Praxis, Skripte zweimal zu laden.

Geben Sie hier die Bildbeschreibung ein


4
herabgestufte Antworten erfordern angemessene Kommentare mit Gründen.
Ravimallya

2

Versuchen Sie dies, um Modal zu öffnen und zu sehen, was passiert:

<a href="#generalModal" class="btn btn-primary btn-lg" data-toggle="modal">
  Launch demo modal 
</a>

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

Ich brauchte das wichtige Attribut, um es zu beheben


Dies funktionierte für mich und ich hatte das Problem von @ MandM (in den Kommentaren) aus der Antwort von pstenstrm: "Funktioniert nicht für mich. Ich habe ein Vanille-Modal, das ich mit .modal ('show') öffne, und es scrollt immer noch zum Anfang der Seite. Bootstrap v3.2.0 ". Der einzige seltsame Effekt ist, dass jetzt der Hintergrund gescrollt wird, wenn Sie weiter durch ein Modal scrollen, das größer als das Fenster ist, aber dies ist ein kleines Problem für mich. Vielen Dank.
Dgig

1

Ich hatte das gleiche Problem mit Bootstrap 2.3.2

Es war ein Problem beim Klicken auf einen Link:

Der Trick war: return false;

<a href="#" class="btn" onclick="openPositionPopup(${positionReport[0]}); return false;">
     <i class="icon-map-marker"></i>
</a>

und die js:

function openModal() {
    $('#myModal').modal('show');
}

1

Ich habe Stunden damit verbracht, alles hier und anderswo auszuprobieren. Es stellte sich heraus, dass ich für die Verwendung von AngularJS-Material die Animation auf dem Konfigurationsobjekt arg uibModal.open deaktivieren musste.

Beispielsweise:

  $uibModal.open(
    {
      animation: false,
      component: 'myDialogComponent',
      size: 'lg',
      resolve: {
        details: function() {
          return detailsCollection;
        }
      }
    }
  );

Hoffe das hilft jemand anderem.


1

Wenn Sie in einem Angular-Programm auf dieses Problem stoßen, fügen Sie den folgenden Code in die erste Zeile der .scss-Datei ein.

::ng-deep {   
     body.modal-open {
          overflow: visible !important;
          position: absolute !important;   
     } 
}

0

Ich hatte das gleiche Problem und ich denke, ich finde es heraus. Sie müssen nur den modalen HTML-Code als direktes untergeordnetes Element des Body-Tags platzieren ! Sie können den HTML-Code für die Schaltfläche, die das Modal auslöst, an einer beliebigen Stelle platzieren. Ich glaube, dies vermeidet CSS-Vererbungs- und Positionsprobleme, die dieses Problem auslösen.

Beispiel:

<body>
    <!-- All your other HTML code -->
    <div>
        <!-- Button trigger modal -->
        <button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
            Launch demo modal
        </button>
    </div>

    <!-- Modal -->
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            <h4 class="modal-title" id="myModalLabel">Modal title</h4>
          </div>
          <div class="modal-body">
            ...
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
            <button type="button" class="btn btn-primary">Save changes</button>
          </div>
        </div>
      </div>
    </div>
</body>

0

Endlich herausgefunden. Wickeln Sie die Schaltfläche, die auf das Modal abzielt, NICHT in ein Ankertag.

Schlecht

<a href"#">
    <button type="button" class="btn"
data-toggle="modal" data-target="#myModal">See Detail</button>
</a>

Gut

<button type="button" class="btn"
    data-toggle="modal" data-target="#myModal">See Detail</button>

0

Dieser hat es für mich getan

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

Ich hatte ein ähnliches Problem mit dem Springen der Navigationsleiste und des Containers, als das Modal geöffnet wurde. Das habe ich gesucht.
Awhitey98

Ich bin froh, dass es geholfen hat!
Warkitty

0

Nachdem ich über mehrere Stunden Dutzende Antworten gelesen hatte, kopierte ich den Originalcode erneut aus der Bootstrap-Datei und debuggte Schritt für Schritt, um zu sehen, warum ich immer nach oben springe. Weil die aktuellste Version von Bootstrap 3 das Modal an der Position anzeigt, an der Sie sich gerade befinden. Ich hatte das herausgefunden -webkit-transform: translate3d(0,0,0);und height: 100%in meinem CSS-Body-Tag dieses Verhalten verursacht. Vielleicht hilft das jemandem.


0

Für mich funktioniert, wenn ich die Version von 3.1.1 auf 3.3.7 geändert habe

Wenn Sie Version 3.3.1 nicht verwenden müssen, versuchen Sie es zu ersetzen.

Nach der Änderung sollten Sie überprüfen, ob der Rest der Funktion ordnungsgemäß funktioniert.

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

0

body.modal-open { position: inherit; }

Das hat für mich wie ein Zauber gewirkt.


0

Ich habe alle oben genannten Beispiele ausprobiert - dies ist das einzige, was für mich funktioniert hat:

.modal-open {

            padding-right: 0 !important;

        }

Entfernen der Polsterung von der rechten Seite des Modells - verhindert den Sprung.


0

Höhe: 100% ist Problem zu lösen, aber Sie müssen korrekte "div" hinzufügen


0

Ich habe das gleiche Problem und keine der Antworten hat mir geholfen. Ich habe eine Problemumgehung gefunden, die dumm aussieht, aber zumindest in meinem Fall funktioniert.

Ich habe festgestellt, dass die Seite nur einmal nach oben gescrollt wird und danach die nächsten geöffneten Modalitäten wie erwartet funktionieren. Dann habe ich festgestellt, dass das Verstecken eines Elements im DOM dieselbe seltsame Schriftrolle auslöst. Also habe ich nach dem Laden der Seite nur ein Dummy-Div erstellt, als es auszublenden und zu entfernen, und das hat das Problem gelöst.

var $dummy= $("<div>");
$("body").append($dummy);
$dummy.hide().remove();

0

Ich stand vor dem gleichen Problem. Das Problem war, dass ich HTML- und Body-Elementen die Klasse .modal-open hinzufügte. Fügen Sie diese Klasse einfach dem Körper hinzu und alles funktioniert wie erwartet.


-1

Versuchen Sie dies, es funktioniert perfekt

/* fix body.modal-open overflow:hidden */
body.modal-open {
    height: auto;
}


-3

Wenn die Antwort von pstenstrm bei Ihnen nicht funktioniert, kombinieren Sie sie mit diesem HTML-Ersatzknopf:

<a class="btn btn-primary btn-lg" data-toggle="modal" data-target="#generalModal" id="launchbutton" href="#launchbutton"> Launch demo modal </a>

Dadurch sollte die Schaltfläche auf dem Bildschirm angezeigt werden.

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.