Ich versuche, die HTML / Body-Bildlaufleiste des übergeordneten Elements zu deaktivieren, während ich einen Leuchtkasten verwende. Das Hauptwort hier ist deaktivieren . Ich möchte es nicht mit verstecken overflow: hidden;
.
Der Grund dafür ist, overflow: hidden
dass die Site springt und den Bereich einnimmt, in dem sich die Schriftrolle befand.
Ich möchte wissen, ob es möglich ist, eine Bildlaufleiste zu deaktivieren, während sie noch angezeigt wird.
javascript
jquery
html
css
Dejan.S
quelle
quelle
Antworten:
Wenn die Seite unter der Überlagerung oben "fixiert" werden kann, können Sie beim Öffnen der Überlagerung festlegen
Sie sollten immer noch die rechte Bildlaufleiste sehen, aber der Inhalt kann nicht gescrollt werden. Wenn Sie die Überlagerung schließen, setzen Sie diese Eigenschaften einfach mit zurück
Ich habe diesen Weg nur vorgeschlagen, weil Sie kein Bildlaufereignis ändern müssen
Aktualisieren
Sie können auch eine leichte Verbesserung vornehmen: Wenn Sie die
document.documentElement.scrollTop
Eigenschaft kurz vor dem Öffnen der Ebene über Javascript erhalten, können Sie diesen Wert dynamisch alstop
Eigenschaft des Body-Elements zuweisen : Bei diesem Ansatz bleibt die Seite an ihrer Stelle, unabhängig davon, ob Sie Sie sind oben oder wenn Sie bereits gescrollt haben.Css
JS
quelle
$('body').css('top', -($('body').scrollTop()) + 'px').addClass('noscroll');
Vier kleine Ergänzungen zur ausgewählten Lösung:
Komplettlösung, die für die meisten Browser zu funktionieren scheint:
CSS
Bildlauf deaktivieren
Bildlauf aktivieren
Vielen Dank an Fabrizio und Dejan, die mich auf den richtigen Weg gebracht haben, und an Brodingo für die Lösung der doppelten Bildlaufleiste
quelle
afterLoad()
undafterClose
Rückrufen zu deaktivieren . Könnte für andere nützlich sein, die diese Frage suchen.scrollTop
so, dass Zeile 2 des Codes 'Bildlauf deaktivieren' ausgedrückt werden kann als$( window ).scrollTop()
.if (scrollTop < 0) { scrollTop = 0; }
. Hier ist der vollständige Code zum Deaktivieren von gist.github.com/jayd3e/2eefbbc571cd1668544b .Mit jQuery inklusive:
deaktivieren
aktivieren
Verwendung
quelle
Ich bin der OP
Mit Hilfe der Antwort von fcalderan konnte ich eine Lösung finden. Ich lasse meine Lösung hier, da sie Klarheit in die Verwendung bringt und ein sehr wichtiges Detail hinzufügt.
width: 100%;
Ich füge diese Klasse hinzu
Das hat bei mir funktioniert und ich habe Fancyapp verwendet.
quelle
Das hat bei mir sehr gut funktioniert ....
Umschließen Sie diese beiden Codezeilen einfach mit dem, was Sie entscheiden, wenn Sie das Scrollen sperren möchten.
z.B
quelle
Sie können das Bildlaufereignis nicht deaktivieren, aber Sie können die zugehörigen Aktionen deaktivieren, die zu einem Bildlauf führen, z. B. Mausrad und Touchmove:
quelle
Sie können die Bildlaufleiste des Körpers mit ausblenden
overflow: hidden
und gleichzeitig einen Rand festlegen, damit der Inhalt nicht springt:Und dann können Sie der Seite eine deaktivierte Bildlaufleiste hinzufügen, um die Lücke zu füllen:
Genau das habe ich für meine eigene Lightbox-Implementierung getan. Scheint bisher gut zu funktionieren.
quelle
Dies ist die Lösung, mit der wir uns entschieden haben. Speichern Sie einfach die Bildlaufposition, wenn das Overlay geöffnet wird, scrollen Sie jedes Mal, wenn der Benutzer versucht hat, die Seite zu scrollen, zur gespeicherten Position zurück und schalten Sie den Listener aus, wenn das Overlay geschlossen wird.
Es ist ein bisschen nervös im IE, funktioniert aber wie ein Zauber in Firefox / Chrome.
quelle
z-index
von.overlay-shown
so anpassen , dass es größer als der feste Header ist. (Ich habe diesen Code in der Produktion auf einer Site mit einem festen Header ausgeführt und es funktioniert gut.)body
Tags gesprochen. Ich habe gestern mit Ihrem Code experimentiert und habe oben auf meiner Seite einen festen Header. Wenn ich über dasbody
Tag scrollen kann , befindet sich die Bildlaufleiste unter der festen Überschrift.$("body")
, als würden wir stattdessen verwenden$(window)
. Und anstattz-index: -1
auf dem Overlay, um es auszublenden, können Sievisibility: hidden
oder ähnliches verwenden. Unter jsfiddle.net/8p2gfeha finden Sie einen kurzen Test, um festzustellen , ob es funktioniert. Der feste Header wird nicht mehr oben in der Bildlaufleiste angezeigt. Ich werde schließlich versuchen, diese Änderungen in die Antwort aufzunehmen.Ich hatte ein ähnliches Problem: Ein Menü auf der linken Seite, das, wenn es angezeigt wird, das Scrollen verhindert. Sobald die Höhe auf 100 VH eingestellt war, verschwand die Bildlaufleiste und der Inhalt ruckte nach rechts.
Wenn es Ihnen also nichts ausmacht, die Bildlaufleiste aktiviert zu lassen (aber das Fenster auf die volle Höhe einzustellen, damit es nirgendwo hinrollt), können Sie auch einen winzigen unteren Rand festlegen, in dem die Bildlaufleisten angezeigt werden:
quelle
overflow:hidden
Verhindert das nicht, dass der Spielraum eine Wirkung hat?Sie können den Überlauf beibehalten: ausgeblendet, aber die Bildlaufposition manuell verwalten:
Vor dem Anzeigen die tatsächliche Bildlaufposition verfolgen:
es sollte funktionieren
quelle
Eine grobe, aber funktionierende Methode besteht darin, den Bildlauf nach oben zu erzwingen und so das Scrollen effektiv zu deaktivieren:
Wenn Sie den Leuchtkasten öffnen, heben Sie die Flagge und senken Sie die Flagge, wenn Sie sie schließen.
Live-Testfall .
quelle
Ich halte mich gerne an die Methode "Überlauf: Verborgen" und füge einfach das Auffüllen rechts hinzu, das der Breite der Bildlaufleiste entspricht.
Holen Sie sich die Funktion zur Breite der Bildlaufleiste nach lostsource .
Wenn Sie das Overlay anzeigen, fügen Sie HTML die Klasse "noscroll" hinzu und fügen Sie dem Text das Auffüllrecht hinzu:
Entfernen Sie beim Ausblenden die Klasse und die Polsterung:
Der Noscroll-Stil ist genau das:
Beachten Sie, dass Sie, wenn Sie Elemente mit der Position: fest haben, die Auffüllung auch diesen Elementen hinzufügen müssen.
quelle
<div id="lightbox">
befindet sich innerhalb des<body>
Elements. Wenn Sie also durch den Leuchtkasten scrollen, scrollen Sie auch durch den Körper. Die Lösung besteht darin, das<body>
Element nicht über 100% zu erweitern, den langen Inhalt in einem anderendiv
Element zu platzieren und diesemdiv
Element bei Bedarf eine Bildlaufleiste hinzuzufügenoverflow: auto
.Das Scrollen über den Leuchtkasten (und auch den
body
) hat keine Auswirkung, da der Körper nicht länger als 100% der Bildschirmhöhe ist.quelle
Alle Modal / Lightbox-Javascript-basierten Systeme verwenden einen Überlauf, wenn die Modal / Lightbox auf einem HTML-Tag oder einem Body-Tag angezeigt wird.
Wenn der Leuchtkasten angezeigt wird, drücken die js einen Überlauf, der auf HTML oder Body-Tag verborgen ist. Wenn der Leuchtkasten ausgeblendet ist, entfernen einige den ausgeblendeten anderen und drücken einen automatischen Überlauf auf HTML oder Body-Tag.
Entwickler, die auf einem Mac arbeiten, sehen das Problem der Bildlaufleiste nicht.
Ersetzen Sie einfach das Versteckte durch ein Nicht-Set, damit der Inhalt nicht unter das Modal des Entfernens der Bildlaufleiste rutscht.
Leuchtkasten öffnen / zeigen:
Leuchtkasten schließen / verstecken:
quelle
Wenn die Seite unter der Überlagerung oben "fixiert" werden kann, können Sie beim Öffnen der Überlagerung festlegen
Wenn Sie diese Klasse für den scrollbaren Körper bereitstellen, sollte die rechte Bildlaufleiste weiterhin angezeigt werden, der Inhalt ist jedoch nicht scrollbar.
Um die Position der Seite beizubehalten, führen Sie dies in jquery aus
Wenn Sie die Überlagerung schließen, setzen Sie diese Eigenschaften einfach mit zurück
Ich habe diesen Weg nur vorgeschlagen, weil Sie kein Bildlaufereignis ändern müssen
quelle
CSS
JS
Jetzt müssen Sie nur noch die Funktionen aufrufen
quelle
Sie können es mit Javascript tun:
Deaktivieren Sie es dann, wenn Ihr Leuchtkasten geschlossen ist.
Wenn Ihr Leuchtkasten jedoch eine Bildlaufleiste enthält, können Sie nicht scrollen, solange er geöffnet ist. Dies liegt daran, dass
window
beidebody
und enthalten#lightbox
. Sie müssen also eine Architektur wie die folgende verwenden:Und dann wenden Sie die
onscroll
Veranstaltung nur auf#global
.quelle