Elemente mit fester Position, die sich bewegt, wenn der Körperüberlauf ausgeblendet ist

8

Ich möchte eine modale Ebene öffnen, die die Körperrolle überholt. Um das zu erreichen, wenn der Layer angezeigt wird, setze ich den Body-Overflow auf versteckt und den Überlauf auf den Modal-Layer. Visuell ersetzt eine Bildlaufleiste die andere.

Im Hintergrund habe ich eine obere Leiste mit fester Position und 100% Breite. Was passiert, wenn der Body-Überlauf auf "Versteckt" eingestellt ist, nimmt das div-Element mit 100% Breite (obere Leiste) den Scrollbalken-Bereich ein und die Elemente bewegen sich nach rechts.

Wie kann ich verhindern, dass sich diese Elemente verschieben?

Ich habe versucht (Javascript) die Breite der Bildlaufleiste zu berechnen und beim Setzen des Körperüberlaufs: ausgeblendet, geben Sie einen Rand rechts: "Bildlaufleiste Breite" zum oberen Balken. Das hat nicht funktioniert.

Probieren Sie auch ein Dummy-Div am rechten Ende der oberen Leiste aus, bei dem der Überlauf aktiviert ist, und scrollen Sie zum Anzeigen einer Bildlaufleiste, wenn die Ebene geöffnet wird. Die Idee war, den Platz der fehlenden Bildlaufleiste mit einer anderen Bildlaufleiste einzunehmen, nur auf dem obersten Container. Das hat fast funktioniert, aber ein 1 oder 2px Flackern erzeugt. Nicht gut genug.

jsFiedle hier mit dem grundlegenden Problem

%Vor%     
ca2s7l 17.06.2015, 17:22
quelle

3 Antworten

7

Grundsätzlich ...

  • Wenn das Modal geöffnet wird , legen Sie die Menübreite auf die aktuelle Breite fest und legen Sie einen window.onresize -Ereignishandler fest, der die Größe des Menüs auf die Körperbreite ändert.

  • Wenn das Modal geschlossen ist , entferne die feste Breite und den window.onresize -Handler und bringe das Menü in den Ausgangszustand zurück.

Im Geiste von less === more habe ich mir die Freiheit genommen, Ihren Code so weit wie möglich zu vereinfachen.

%Vor% %Vor% %Vor%
    
Tiny Giant 17.06.2015, 18:16
quelle
4

Ihr Problem hier ist, dass topBarFixed eine 100% width hat. Wenn diese Breite behoben wäre, hätten Sie dieses Problem nicht. Folgendes wurde in Chrome und Firefox getestet:

Fügen Sie diese Zeile der ersten Zeile Ihrer toggleModal-Funktion hinzu:

$(".topBarFixed").width($(".topBarFixed").width());

Damit wird die Breite auf die tatsächliche Breite (in Pixeln) des Balkens an diesem Punkt eingestellt. Wenn Sie die Ebene schließen, stellen Sie sie auf 100% zurück.

%Vor%

Der gesamte Code sieht folgendermaßen aus:

%Vor%

Und hier ist das jsFiddle: Ссылка

Bearbeiten

Optional können Sie auch eine feste Breite eingeben, und das wird den Trick machen:

%Vor%     
Hanlet Escaño 17.06.2015 18:06
quelle
-1

Einige Fehler in Ihrem Code: id ist nur einer. Verwenden Sie Klassen, wenn Sie denselben Stil auf mehrere Elemente anwenden möchten.

%Vor%

Wie auch immer, das hat Ihr Problem nicht verursacht. Zuallererst sollte der Überlauf Ihres Körpers ausreichen: Fügen Sie keinen% overflowY zu Ihrem .modal-container hinzu, es sei denn, Sie möchten verhindern, dass die Hintergrundseite scrollt, während Modal geöffnet ist. Zweitens, fixiere das Modal selbst und zentriere es mit dem zentrierten CSS-Trick (links: 50%, Rand links: -halb deiner Breite). CSS:     .body-locked {         Überlauf: scrollen;     }

%Vor%

Ich hoffe, es hilft.

    
ImLearningZF2 17.06.2015 18:12
quelle

Tags und Links