Ich habe nach einer Lösung vom Typ "Leuchtkasten" gesucht, die dies ermöglicht, aber noch keine gefunden (bitte schlagen Sie vor, wenn Sie eine kennen).
Das Verhalten, das ich neu erstellen möchte, entspricht genau dem, was Sie bei Pinterest sehen würden, wenn Sie auf ein Bild klicken. Das Overlay kann gescrollt werden ( da sich das gesamte Overlay wie eine Seite über einer Seite nach oben bewegt ), aber der Körper hinter dem Overlay ist fixiert.
Ich habe versucht, dies nur mit CSS zu erstellen ( dh mit einem div
Overlay über der gesamten Seite und dem gesamten Textkörperoverflow: hidden
), aber es verhindert nicht, dass div
es scrollbar ist.
Wie kann verhindert werden, dass der Text / die Seite gescrollt wird, während im Vollbild-Container weiter gescrollt wird?
Antworten:
Theorie
Wenn Sie die aktuelle Implementierung der pinterest-Site betrachten (sie kann sich in Zukunft ändern), wird beim Öffnen des Overlays eine
noscroll
Klasse auf dasbody
Element angewendet undoverflow: hidden
festgelegt, sodass siebody
nicht mehr scrollbar ist.Das Overlay (erstellt on-the-fly oder bereits innerhalb der Seite und sichtbar gemacht durch
display: block
, macht es keinen Unterschied) hatposition : fixed
undoverflow-y: scroll
, mittop
,left
,right
undbottom
Eigenschaften auf0
: dieser Stil macht das das gesamte Ansichtsfenster füllen Overlay.Das
div
Innere der Überlagerung befindet sich stattdessen genau inposition: static
der vertikalen Bildlaufleiste, die Sie sehen, und bezieht sich auf dieses Element. Infolgedessen kann der Inhalt gescrollt werden, die Überlagerung bleibt jedoch fest.Wenn Sie den Zoom schließen, verbergen Sie das Overlay (via
display: none
) und können es dann auch vollständig per Javascript entfernen (oder nur den Inhalt darin, es liegt an Ihnen, wie Sie es einfügen).Als letzten Schritt müssen Sie auch die
noscroll
Klasse aus dem entfernenbody
(damit die Überlaufeigenschaft auf ihren Anfangswert zurückkehrt).Code
(Es funktioniert durch Ändern des
aria-hidden
Attributs des Overlays, um es anzuzeigen und auszublenden und seine Zugänglichkeit zu verbessern.)Markup
(Schaltfläche zum Öffnen)
(Schaltfläche zum Überlagern und Schließen)
CSS
Javascript (Vanille-JS)
Schließlich ist hier ein weiteres Beispiel, in dem die Überlagerung mit einem Einblendeffekt durch ein
transition
auf dieopacity
Eigenschaft angewendetes CSS geöffnet wird . Außerdempadding-right
wird a angewendet, um einen Reflow auf den zugrunde liegenden Text zu vermeiden, wenn die Bildlaufleiste verschwindet.CSS
quelle
div
muss einen CSS-Stilposition:fixed
und einen vertikalen Überlauf haben, der scrollbar ist. Ich habe erfolgreich verwendetoverflow-y:auto;
und für iOS Momentum / Trägheits-Scrollen habe ich-webkit-overflow-scrolling:touch;
das CSS hinzugefügt . Ich verwendendisplay:block;
,width:100%;
undheight:100%;
CSS ein ganzseitige Bildfenster zu haben.Wenn Sie ein Überschreiben auf ios verhindern möchten, können Sie Ihrer .noscroll-Klasse eine feste Position hinzufügen
quelle
position:fixed
ist, dass die Größe meines Hauptkörpers geändert wurde. Vielleicht war es ein Konflikt mit anderen CSS, aber esoverflow:hidden
ist alles, was benötigt wurdeNicht verwenden
overflow: hidden;
aufbody
. Es wird automatisch alles nach oben gescrollt. JavaScript ist ebenfalls nicht erforderlich. Gebrauch machen vonoverflow: auto;
. Diese Lösung funktioniert sogar mit Mobile Safari:HTML-Struktur
Styling
Sehen Sie die Demo hier und den Quellcode hier .
Aktualisieren:
Wenn Sie möchten, dass die Leertaste auf der Tastatur funktioniert, müssen Sie sich auf das Overlay konzentrieren, z. B. darauf klicken, oder JS manuell darauf fokussieren, bevor dieser Teil der
div
Tastatur reagiert. Gleiches gilt, wenn das Overlay "ausgeschaltet" ist, da es das Overlay nur zur Seite bewegt. Ansonsten sind dies für den Browser nur zwei normalediv
s und es würde nicht wissen, warum es sich auf eines von ihnen konzentrieren sollte.quelle
html, body { height: 100%; }
(wie in der Demo) hinzufügen, damit dies ordnungsgemäß funktioniert..offset()
Werte für die Berechnung verwendet, wird durcheinander gebracht, etc ...overscroll-behavior
Mit der CSS-Eigenschaft kann das standardmäßige Überlauf-Scroll-Verhalten des Browsers überschrieben werden, wenn der obere oder untere Rand des Inhalts erreicht wird.Fügen Sie einfach die folgenden Stile zum Überlagern hinzu:
Derzeit funktioniert in Chrome, Firefox und IE ( caniuse )
Weitere Informationen finden Sie im Artikel der Google-Entwickler .
quelle
overflow-y: scroll
(aus Ihrer Codepen-Demo) abgefunden. Der von @pokrishka angesprochene Punkt ist gültig, aber in meinem Fall ist es kein Problem. Auf jeden Fall frage ich mich, ob die Implementierungen der Browser dieses Detail in Zukunft abdecken werden. Ich habe festgestellt, dass in Firefox die Größe des Browsers so geändert wird, dass das Modal nicht auf den Bildschirm passt, und dann die Größe erneut geändert wird, damit diese Eigenschaft auch nach dem Ändern der Größe in voller Größe funktioniert (dh ein Bildlauf ist enthalten) - bis die Seite neu geladen wird , wenigstens.Die meisten Lösungen haben das Problem, dass sie die Bildlaufposition nicht beibehalten. Deshalb habe ich mir angesehen, wie Facebook dies tut. Zusätzlich zum Festlegen des zugrunde liegenden Inhalts wird
position: fixed
der obere Bereich dynamisch festgelegt, um die Bildlaufposition beizubehalten:Wenn Sie die Überlagerung erneut entfernen, müssen Sie die Bildlaufposition zurücksetzen:
Ich habe ein kleines Beispiel erstellt, um diese Lösung zu demonstrieren
quelle
Es ist erwähnenswert, dass das Hinzufügen von "Überlauf: versteckt" zum Body-Tag manchmal nicht funktioniert. In diesen Fällen müssen Sie die Eigenschaft auch dem HTML-Tag hinzufügen.
quelle
width: 100%; height: 100%;
Wenn Sie möchten, dass ein Elternteil (in diesem Fall der Körper) das Scrollen verhindert, wenn ein Kind (in diesem Fall die Überlagerung) einen Bildlauf durchführt, machen Sie das Kind im Allgemeinen zu einem Geschwister des Elternteils, um zu verhindern, dass das Bildlaufereignis sprudelt das Elternteil. Wenn das übergeordnete Element der Körper ist, ist hierfür ein zusätzliches Umhüllungselement erforderlich:
Weitere Informationen zur Funktionsweise finden Sie unter Scrollen bestimmter DIV-Inhalte mit der Hauptscrollleiste des Browsers .
quelle
Die gewählte Antwort ist korrekt, weist jedoch einige Einschränkungen auf:
<body>
im Hintergrund<input>
im Modal werden alle zukünftigen Schriftrollen geleitet<body>
Ich habe keine Lösung für das erste Problem, wollte aber etwas Licht in das zweite bringen. Verwirrenderweise hatte Bootstrap das Tastaturproblem dokumentiert, behauptete jedoch, es sei behoben worden, und führte als Beispiel für das Update http://output.jsbin.com/cacido/quiet an.
In der Tat funktioniert dieses Beispiel unter iOS mit meinen Tests einwandfrei. Ein Upgrade auf den neuesten Bootstrap (v4) führt jedoch zu einer Unterbrechung.
Um herauszufinden, was der Unterschied zwischen ihnen ist, habe ich einen Testfall so reduziert, dass er nicht mehr von Bootstrap abhängt ( http://codepen.io/WestonThayer/pen/bgZxBG) .
Die entscheidenden Faktoren sind bizarr. Um das Tastaturproblem zu vermeiden, scheint es erforderlich zu sein, dass
background-color
es nicht im Stammverzeichnis festgelegt ist,<div>
das das Modal enthält, und dass der Inhalt des Modals in einem anderen verschachtelt sein muss<div>
, das möglicherweisebackground-color
festgelegt wurde.Kommentieren Sie zum Testen die folgende Zeile im Codepen-Beispiel aus:
quelle
Fügen Sie bei Touch-Geräten ein 1 Pixel breites,
101vh
transparentes Div mit minimaler Höhe in die Hülle des Overlays ein. Dann-webkit-overflow-scrolling:touch; overflow-y: auto;
zum Wrapper hinzufügen . Dies täuscht die mobile Safari vor, dass das Overlay scrollbar ist, wodurch das Berührungsereignis vom Körper abgefangen wird.Hier ist eine Beispielseite. Öffnen Sie auf einer mobilen Safari: http://www.originalfunction.com/overlay.html
https://gist.github.com/YarGnawh/90e0647f21b5fa78d2f678909673507f
quelle
-webkit-overflow-scrolling:touch;
für jeden scrollbaren Container hinzufügen , um Berührungsereignisse abzufangen.Das Verhalten, das Sie verhindern möchten, wird als Bildlaufverkettung bezeichnet. Um es zu deaktivieren, setzen Sie
auf Ihrem Overlay in CSS.
quelle
Ich fand diese Frage beim Versuch, das Problem zu lösen, das ich mit meiner Seite auf dem iPad und dem iPhone hatte - der Körper scrollte, als ich festes div als Popup mit Bild anzeigte.
Einige Antworten sind gut, aber keine hat mein Problem gelöst. Ich fand folgenden Blog-Beitrag von Christoffer Pettersson. Die dort vorgestellte Lösung half mir bei Problemen mit iOS-Geräten und half beim Scrollen des Hintergrundproblems.
Sechs Dinge, die ich über das Scrollen von iOS Safari-Gummibändern gelernt habe
Wie vorgeschlagen, füge ich wichtige Punkte des Blogposts hinzu, falls der Link veraltet ist.
"Um zu deaktivieren, dass der Benutzer die Hintergrundseite scrollen kann, während das" Menü geöffnet ist ", können Sie steuern, welche Elemente gescrollt werden dürfen oder nicht, indem Sie JavaScript und eine CSS-Klasse anwenden.
Basierend auf dieser Stackoverflow- Antwort können Sie steuern, dass Elemente mit dem Deaktivierungs-Bildlauf ihre Standard-Bildlaufaktion nicht ausführen sollen, wenn das Touchmove-Ereignis ausgelöst wird. "
Und dann setzen Sie die Disable-Scrolling-Klasse auf die Seite div:
quelle
Sie können dies leicht mit einigen "neuen" CSS und JQuery tun.
Anfänglich:
body {... overflow:auto;}
Mit JQuery können Sie dynamisch zwischen "Overlay" und "Body" wechseln. Wenn auf "Körper", verwenden SieBei Überlagerung verwenden
JQuery für den Switch ('body' -> 'overlay'):
JQuery für den Switch ('Overlay' -> 'Body'):
quelle
Ich möchte zu früheren Antworten hinzufügen, weil ich versucht habe, dies zu tun, und einige Layouts brachen, sobald ich den Körper in die Position schaltete: behoben. Um dies zu vermeiden, musste ich auch die Körpergröße auf 100% einstellen:
quelle
Verwenden Sie den folgenden HTML-Code:
Dann JavaScript zum Abfangen und Stoppen des Bildlaufs:
Dann, um die Dinge wieder normal zu machen:
$(".page").off("touchmove");
quelle
Wenn die Absicht besteht, auf Mobil- / Touch-Geräten zu deaktivieren, ist die Verwendung am einfachsten
touch-action: none;
.Beispiel:
(Das Beispiel funktioniert nicht im Kontext des Stapelüberlaufs. Sie müssen es auf einer eigenständigen Seite neu erstellen.)
Wenn Sie das Scrollen des
#app
Containers deaktivieren möchten , fügen Sie einfach hinzutouch-action: none;
.quelle
Versuche dies
quelle
Wenn Sie den Körper- / HTML-Bildlauf stoppen möchten, fügen Sie Folgendes hinzu
CSS
HTML
Grundsätzlich könnte man es ohne JS machen.
Die Hauptidee ist, HTML / Body mit der Höhe: 100% und dem Überlauf: Auto hinzuzufügen. In Ihrem Overlay können Sie den Bildlauf je nach Anforderung entweder aktivieren / deaktivieren.
Hoffe das hilft!
quelle
In meinem Fall hat keine dieser Lösungen auf dem iPhone (iOS 11.0) funktioniert.
Die einzige effektive Lösung, die auf allen meinen Geräten funktioniert, ist diese - ios-10-Safari-verhindert-das-Scrollen-hinter-einer-festen-Overlay-und-beibehalten-Scroll-Position
quelle
Verwenden Sie den folgenden Code zum Deaktivieren und Aktivieren der Bildlaufleiste.
quelle