Ich verwende das scrollTo jQuery-Plugin und möchte wissen, ob es irgendwie möglich ist, das Scrollen im Fensterelement durch Javascript vorübergehend zu deaktivieren. Der Grund, warum ich das Scrollen deaktivieren möchte, ist, dass es wirklich hässlich wird, wenn Sie scrollen, während scrollTo animiert;)
Natürlich könnte ich a machen $("body").css("overflow", "hidden");
und es dann wieder auf auto setzen, wenn die Animation stoppt, aber es wäre besser, wenn die Bildlaufleiste noch sichtbar, aber inaktiv wäre.
javascript
jquery
scroll
Olivier Lalonde
quelle
quelle
Antworten:
Die
scroll
Veranstaltung kann nicht abgesagt werden. Sie können dies jedoch tun, indem Sie die folgenden Interaktionsereignisse abbrechen :Maus- und Touch-Bildlauf und Schaltflächen Bildlauf mit dem Bildlauf verknüpfte .
[ Arbeitsdemo ]
UPDATE: Feste Chrome-Desktops und moderne mobile Browser mit passiven Listenern
quelle
Tun Sie es einfach, indem Sie dem Körper eine Klasse hinzufügen:
Fügen Sie die Klasse hinzu und entfernen Sie sie, wenn Sie das Scrollen wieder aktivieren möchten, das in IE, FF, Safari und Chrome getestet wurde.
Für mobile Geräte müssen Sie die
touchmove
Ereignis behandeln:Und lösen Sie die Bindung, um das Scrollen wieder zu aktivieren. Getestet in iOS6 und Android 2.3.3
quelle
touchmove
Ereignis wie bei behandeln$('body').bind('touchmove', function(e){e.preventDefault()})
. Diese Antwort wurde bearbeitet, um diese mobile Lösung einzuschließen.$('body,html')
Hier ist ein wirklich grundlegender Weg, dies zu tun:
In IE6 ist es ziemlich nervös.
quelle
(0, 0)
nur die aktuelle Bildlaufposition verwenden.Die folgende Lösung ist einfaches, aber reines JavaScript (keine jQuery):
quelle
scroll-behavior: smooth
borks dies. Ich bin auch nicht damit einverstanden, dass Oto sagt, dass es die Schuld des Browsers ist. Sie gehen im Grunde davon aus, dass etwas sofort passiert, wenn es in Wirklichkeit asynchron istDiese Lösung behält die aktuelle Bildlaufposition bei, während das Bildlauf deaktiviert ist, im Gegensatz zu einigen, bei denen der Benutzer wieder nach oben springt.
Es basiert auf der Antwort von Galambalazs , unterstützt jedoch Touch-Geräte und wurde als einzelnes Objekt mit JQuery Plugin Wrapper überarbeitet.
Demo hier.
Auf Github hier.
quelle
mousewheel
ein Zauber warEs tut mir leid, einen alten Beitrag zu beantworten, aber ich habe nach einer Lösung gesucht und bin auf diese Frage gestoßen.
Es gibt viele Problemumgehungen für dieses Problem, um die Bildlaufleiste weiterhin anzuzeigen, z. B. dem Container eine Höhe von 100% und eine
overflow-y: scroll
Styling zu .In meinem Fall habe ich gerade ein Div mit einer Bildlaufleiste erstellt, die ich beim Hinzufügen
overflow: hidden
zum Body anzeige :Die Element-Bildlaufleiste muss folgende Stile haben:
Dies zeigt eine graue Bildlaufleiste, hoffe, es hilft zukünftigen Besuchern.
quelle
Ich habe nach einer Lösung für dieses Problem gesucht, war aber mit keiner der oben genannten Lösungen zufrieden ( zum Zeitpunkt des Schreibens dieser Antwort ), daher habe ich diese Lösung gefunden.
CSS
JS
quelle
overflow-y: scroll
den.scrollDisabled
Stil hinzufügte . Ansonsten gab es einen kleinen Sprung, da sich die Bildlaufleiste jedes Mal versteckte. Das funktioniert natürlich nur bei mir, weil meine Seite lang genug ist, um auch auf den größten Displays eine Bildlaufleiste zu benötigen.Laut dem Beitrag von Galambalaz würde ich Unterstützung für Touch-Geräte hinzufügen, damit wir berühren können, aber nicht nach oben oder unten scrollen:
quelle
Ab Chrome 56 und anderen modernen Browsern müssen Sie
passive:false
denaddEventListener
Anruf ergänzen , damit diepreventDefault
Arbeit funktioniert. Also benutze ich dies, um das Scrollen auf dem Handy zu beenden:quelle
Nein, ich würde mich nicht für die Ereignisbehandlung entscheiden, weil:
Nicht alle Ereignisse erreichen garantiert den Körper.
Wenn Sie Text auswählen und nach unten gehen, wird das Dokument gescrollt.
Wenn in der Phase des Ereignisses das Ablösen von etw schief geht, sind Sie zum Scheitern verurteilt.
Ich habe mich daran gewöhnt, indem ich eine Aktion zum Kopieren und Einfügen mit einem ausgeblendeten Textbereich ausgeführt habe. Ratet mal, die Seite wird beim Kopieren gescrollt, da ich intern den Textbereich auswählen muss, bevor ich anrufe
document.execCommand('copy')
.Wie auch immer, so gehe ich vor, beachte
setTimeout()
:Ein Momentum blinkt, wenn die Bildlaufleisten für einen Moment verschwinden, aber es ist akzeptabel, was ich finde.
quelle
Je nachdem, was Sie mit dem entfernten Bildlauf erreichen möchten, können Sie einfach das Element korrigieren, von dem Sie den Bildlauf entfernen möchten (per Klick oder mit einem anderen Auslöser, den Sie vorübergehend deaktivieren möchten).
Ich suchte nach einer "Temp No Scroll" -Lösung und für meine Bedürfnisse löste dies das Problem
eine Klasse machen
dann mit Jquery
Ich fand, dass dies eine ausreichend einfache Lösung ist, die auf allen Browsern gut funktioniert und sich auch auf tragbaren Geräten (z. B. iPhones, Tablets usw.) einfach verwenden lässt. Da das Element vorübergehend fixiert ist, gibt es keine Schriftrolle :)
HINWEIS! Abhängig von der Platzierung Ihres "contentContainer" -Elements müssen Sie es möglicherweise von links anpassen. Dies kann einfach durch Hinzufügen eines CSS-Linkswerts zu diesem Element erfolgen, wenn die feste Klasse aktiv ist
quelle
Eine andere Lösung:
Auf diese Weise haben Sie immer eine vertikale Bildlaufleiste, aber da der größte Teil meines Inhalts länger als das Ansichtsfenster ist, ist dies für mich in Ordnung. Der Inhalt wird mit einem separaten Div zentriert, aber ohne den Rand im Körper erneut festzulegen, würde mein Inhalt links bleiben.
Dies sind die beiden Funktionen, mit denen ich mein Popup / Modal anzeige:
Ergebnis: nicht scrollbarer Hintergrund und keine Neupositionierung des Inhalts aufgrund der linken Bildlaufleiste. Getestet mit aktuellem FF, Chrome und IE 10.
quelle
Wie wäre es damit? (Wenn Sie jQuery verwenden)
quelle
Ich verwende showModalDialog , um die sekundäre Seite als modalen Dialog anzuzeigen .
So blenden Sie die Bildlaufleisten des Hauptfensters aus:
und beim Schließen des modalen Dialogfelds werden die Bildlaufleisten des Hauptfensters angezeigt:
So greifen Sie über den Dialog auf Elemente im Hauptfenster zu:
Nur für alle, die nach showModalDialog suchen : (nach Zeile 29 des Originalcodes)
quelle
Das Absagen des Ereignisses wie in der akzeptierten Antwort ist meiner Meinung nach eine schreckliche Methode: /
Stattdessen habe ich
position: fixed; top: -scrollTop();
unten verwendet.Demo: https://jsfiddle.net/w9w9hthy/5/
Aus meinem jQuery-Popup-Projekt: https://github.com/seahorsepip/jPopup
Dieser Code berücksichtigt Probleme mit Breite, Höhe, Bildlaufleiste und Seitensprung.
Mögliche Probleme mit dem obigen Code behoben:
Wenn jemand Verbesserungen am obigen Code zum Einfrieren / Auftauen von Seiten hat, lassen Sie es mich wissen, damit ich diese Verbesserungen meinem Projekt hinzufügen kann.
quelle
quelle
Ich habe das gleiche Problem. Unten ist die Art und Weise, wie ich damit umgehe.
Ich hoffe das hilft.
quelle
Aufbauend auf der Antwort von Cheyenne Forbes und einer, die ich hier über fcalderan gefunden habe: Deaktiviere einfach die Schriftrolle, verstecke sie nicht? und um Hallodoms Problem zu beheben, dass die Bildlaufleiste verschwindet
CSS:
JS:
Dieser Code bringt Sie zwar an den Anfang der Seite, aber ich denke, dass der Code von fcalderan eine Problemumgehung hat.
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich musste etwas sehr Ähnliches tun, und nachdem ich einige Zeit nach einer Antwort gesucht und verschiedene Ansätze ausprobiert hatte, fand ich eine sehr einfache Lösung.
Mein Problem war sehr ähnlich, fast identisch. Der einzige Unterschied besteht darin, dass ich die Bildlaufleiste nicht anzeigen musste. Ich musste nur sicherstellen, dass die Breite weiterhin verwendet wird, damit sich die Seitenbreite nicht ändert, während mein Overlay angezeigt wird .
Wenn ich meine Überlagerung in den Bildschirm schiebe, mache ich Folgendes:
und nachdem ich mein Overlay vom Bildschirm geschoben habe, mache ich:
WICHTIG: Dies funktioniert perfekt, da meine Überlagerung wann positioniert
absolute
ist .right: 0px
visible
quelle
Die einfachste Methode ist:
Um es rückgängig zu machen:
Einfach zu implementieren, aber der einzige Nachteil ist:
Dies liegt daran, dass die Bildlaufleiste entfernt wird und das Ansichtsfenster etwas breiter wird.
quelle
body
umhtml
statt.overflow:hidden
sie dort nicht funktioniertHier ist meine Lösung, um den Bildlauf zu stoppen (keine jQuery). Ich benutze es, um den Bildlauf zu deaktivieren, wenn das Seitenmenü angezeigt wird.
Ich habe 17 Pixel Polsterung nach rechts gesetzt, um das Verschwinden der Bildlaufleiste zu kompensieren. Dies ist jedoch auch problematisch, vor allem für mobile Browser. Gelöst, indem die Balkenbreite entsprechend ermittelt wird .
Alles zusammen in diesem Stift.
quelle
Ich habe ein ähnliches Problem bei Touch-Geräten. Durch Hinzufügen von "touch-action: none" zum Element wurde das Problem behoben.
Für mehr Informationen. Überprüfen Sie dies heraus: -
https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action
quelle
Dies ist die einfachste Lösung, die ich bisher bekommen habe. Und glauben Sie mir, ich habe alle anderen ausprobiert und dies ist die einfachste. Es funktioniert hervorragend auf Windows-Geräten , bei denen die Seite von rechts verschoben wird, um Platz für die System-Bildlaufleiste und für iOS-Geräte zu haben, die keinen Platz für ihre Bildlaufleisten in den Browsern benötigen. Wenn Sie dies verwenden, müssen Sie rechts keine Auffüllungen hinzufügen, damit die Seite nicht flackert, wenn Sie den Überlauf des Körpers oder HTML mit CSS verbergen .
Die Lösung ist ziemlich einfach, wenn Sie darüber nachdenken. Die Idee ist, das window.scrollTop () zu geben genau die Position zu geben, an der ein Popup geöffnet wird. Ändern Sie diese Position auch, wenn die Größe des Fensters geändert wird (da sich die Bildlaufposition ändert, sobald dies geschieht).
Auf geht's...
Erstellen Sie zunächst die Variable, die Sie darüber informiert, dass das Popup geöffnet ist, und rufen Sie stopWindowScroll auf . Wenn wir dies nicht tun, erhalten Sie einen Fehler einer undefinierten Variablen auf Ihrer Seite und setzen sie auf 0 - als nicht aktiv.
Lassen Sie uns jetzt die Popup-Funktion öffnen, die eine beliebige Funktion in Ihrem Code sein kann, die jedes Popup auslöst, das Sie als Plugin oder benutzerdefiniert verwenden. In diesem Fall handelt es sich um ein einfaches benutzerdefiniertes Popup mit einer einfachen Funktion zum Klicken auf Dokumente.
Als nächstes erstellen wir die Funktion zum Schließen des Popups, die ich noch einmal wiederhole. Dies kann jede Funktion sein, die Sie bereits erstellt haben oder die Sie in einem Plugin verwenden. Wichtig ist, dass wir diese beiden Funktionen benötigen, um die Variable stopWindowScroll auf 1 oder 0 zu setzen und zu wissen, wann sie geöffnet oder geschlossen ist.
Lassen Sie uns dann die window.scroll-Funktion erstellen, damit wir das Scrollen verhindern können, sobald der oben erwähnte stopWindowScroll auf 1 gesetzt ist - als aktiv.
Das ist es. Damit dies funktioniert, ist kein CSS erforderlich, außer Ihren eigenen Stilen für die Seite. Das hat mir sehr gut gefallen und ich hoffe, es hilft Ihnen und anderen.
Hier ist ein Arbeitsbeispiel für JSFiddle:
JS Fiddle Beispiel
Lassen Sie mich wissen, ob dies geholfen hat. Grüße.
quelle
quelle
Dieser Code funktioniert unter Chrome 56 und höher (die ursprüngliche Antwort funktioniert unter Chrome nicht mehr).
Verwenden Sie
DomUtils.enableScroll()
diese Option , um das Scrollen zu aktivieren.Verwenden Sie
DomUtils.disableScroll()
diese Option, um das Scrollen zu deaktivieren.quelle
Um den Sprung zu verhindern, habe ich dies verwendet
und in meinem css
quelle
Ich habe diese Antwort auf einer anderen Seite gefunden :
Bildlauf deaktivieren:
Nach dem Schließen der Popup-Freigabe scrollen:
quelle
Die Lösung von Galambalazs ist großartig! Es hat sowohl in Chrome als auch in Firefox perfekt für mich funktioniert. Es kann auch erweitert werden, um ein Standardereignis im Browserfenster zu verhindern. Angenommen, Sie erstellen eine App auf der Leinwand. Sie könnten dies tun:
Nehmen wir dann an, Sie verarbeiten in Ihrer App Ihre eigenen Ereignisse wie Maus, Tastatur, Berührungsereignisse usw. Sie können Standardereignisse deaktivieren, wenn sich die Maus in der Zeichenfläche befindet, und sie wieder aktivieren, wenn Sie mit der Maus arbeiten geht raus:
Sie können mit diesem Hack sogar das Rechtsklick-Menü deaktivieren:
quelle
Ich hatte ein ähnliches Animationsproblem auf mobilen Bildschirmen, aber nicht auf Laptops, als ich versuchte, ein Div mit dem Befehl animieren von jquery zu animieren. Deshalb habe ich mich für einen Timer entschieden, der die Bildlaufposition des Fensters so häufig wiederherstellt, dass das Dokument mit bloßem Auge statisch erscheint. Diese Lösung funktionierte perfekt auf mobilen Geräten mit kleinem Bildschirm wie Samsung Galaxy-2 oder iPhone-5.
Hauptlogik dieses Ansatzes : Der Timer zum Festlegen der Bildlaufposition des Fensters auf die ursprüngliche Bildlaufposition sollte vor dem Befehl jquery animate gestartet werden. Wenn die Animation abgeschlossen ist, müssen wir diesen Timer löschen (
original scroll position
ist die Position unmittelbar vor dem Start der Animation).Zu meiner angenehmen Überraschung stellte ich fest, dass das Dokument während der Animationsdauer tatsächlich statisch erschien, wenn das Timer-Intervall war
1 millisecond
, was ich anstrebte.EINE ANDERE LÖSUNG, die funktioniert hat : Basierend auf der Antwort von Mohammad Anini in diesem Beitrag zum Aktivieren / Deaktivieren des Bildlaufs habe ich auch festgestellt, dass eine modifizierte Version des Codes wie unten funktioniert.
quelle
Eine einfache Lösung, die für mich funktioniert hat (Deaktivieren des Fenster-Bildlaufs vorübergehend).
Basierend auf dieser Geige: http://jsfiddle.net/dh834zgw/1/
Das folgende Snippet (mit jquery) deaktiviert den Fensterlauf:
Und in Ihrem CSS:
Vergessen Sie beim Entfernen des Modals nicht, die Noscroll-Klasse im HTML-Tag zu entfernen:
quelle