543 Stimmen

Wie kann man den Bildlauf vorübergehend deaktivieren?

Ich benutze das scrollTo jQuery-Plugin und würde gerne wissen, ob es irgendwie möglich ist, das Scrollen auf dem Fenster-Element durch Javascript vorübergehend zu deaktivieren? Der Grund, warum ich das Scrollen deaktivieren möchte, ist, dass, wenn Sie scrollen, während scrollTo animiert wird, wird es wirklich hässlich ;)

Natürlich könnte ich eine $("body").css("overflow", "hidden"); und dann wieder auf Auto stellen, wenn die Animation aufhört, aber es wäre besser, wenn die Bildlaufleiste weiterhin sichtbar, aber inaktiv wäre.

14 Stimmen

Wenn sie noch angezeigt wird, ist der Benutzer darauf trainiert, zu denken, dass sie funktionieren muss. Wenn es sich nicht bewegt oder nicht reagiert, wird das mentale Modell des Benutzers, wie die Seite funktioniert, durchbrochen und führt zu Verwirrung. Ich würde einfach einen besseren Weg finden, um mit dem Scrollen während der Animation umzugehen, z. B. die Animation zu stoppen.

0 Stimmen

896voto

gblazex Punkte 47453

El scroll Veranstaltung kann nicht abgesagt werden. Aber Sie können es tun, indem Sie abzubrechen. diese Interaktionsereignisse:
Maus & Berühren Sie den Bildlauf y Buttons in Verbindung mit dem Blättern.

[ Arbeitsfähige Demo ]

// left: 37, up: 38, right: 39, down: 40,
// spacebar: 32, pageup: 33, pagedown: 34, end: 35, home: 36
var keys = {37: 1, 38: 1, 39: 1, 40: 1};

function preventDefault(e) {
  e.preventDefault();
}

function preventDefaultForScrollKeys(e) {
  if (keys[e.keyCode]) {
    preventDefault(e);
    return false;
  }
}

// modern Chrome requires { passive: false } when adding event
var supportsPassive = false;
try {
  window.addEventListener("test", null, Object.defineProperty({}, 'passive', {
    get: function () { supportsPassive = true; } 
  }));
} catch(e) {}

var wheelOpt = supportsPassive ? { passive: false } : false;
var wheelEvent = 'onwheel' in document.createElement('div') ? 'wheel' : 'mousewheel';

// call this to Disable
function disableScroll() {
  window.addEventListener('DOMMouseScroll', preventDefault, false); // older FF
  window.addEventListener(wheelEvent, preventDefault, wheelOpt); // modern desktop
  window.addEventListener('touchmove', preventDefault, wheelOpt); // mobile
  window.addEventListener('keydown', preventDefaultForScrollKeys, false);
}

// call this to Enable
function enableScroll() {
  window.removeEventListener('DOMMouseScroll', preventDefault, false);
  window.removeEventListener(wheelEvent, preventDefault, wheelOpt); 
  window.removeEventListener('touchmove', preventDefault, wheelOpt);
  window.removeEventListener('keydown', preventDefaultForScrollKeys, false);
}

UPDATE: Chrome-Desktop und moderne mobile Browser mit passiven Zuhörern repariert

0 Stimmen

Wie kann ich den Mauszeigerlauf deaktivieren?

0 Stimmen

Rufen Sie an. disable_scroll() aus dem obigen Code, dann enable_scroll() nachdem die Animation beendet wurde.

143 Stimmen

Tipp für andere Entwickler, die in dieser Falle stecken: Stellen Sie sicher, dass Sie alle "e.stopPropagation()"-Aufrufe aus anderen jQuery-Versuchen entfernen, um das Scrollen zu stoppen, da es nicht nur nicht funktioniert, sondern auch verhindert, dass das Ereignis in DIESEN Code übergeht, der funktioniert. Hoffentlich meine verschwendeten 30 Minuten wird helfen, jemand anderes Zeit zu sparen :)

504voto

hallodom Punkte 6319

Fügen Sie dazu einfach eine Klasse in den Textkörper ein:

.stop-scrolling {
  height: 100%;
  overflow: hidden;
}

Fügen Sie die Klasse hinzu und entfernen Sie sie, wenn Sie den Bildlauf wieder aktivieren wollen. Getestet in IE, FF, Safari und Chrome.

$('body').addClass('stop-scrolling')

Para mobile Geräte müssen Sie mit der touchmove Veranstaltung:

$('body').bind('touchmove', function(e){e.preventDefault()})

Und lösen Sie die Bindung, um den Bildlauf wieder zu aktivieren. Getestet in iOS6 und Android 2.3.3

$('body').unbind('touchmove')

0 Stimmen

Dies hat bei mir in Chrome 21.0.1180.89, IE9, FF15 und Safari 5.1.7 gut funktioniert.

0 Stimmen

Kurzer Hinweis: Dies scheint unter iOS6 (vermutlich auch unter 5) nicht zu funktionieren. Jemand weiß von einem Workaround?

4 Stimmen

Ich hab's! Sie müssen die touchmove Ereignis, wie bei $('body').bind('touchmove', function(e){e.preventDefault()}) . Diese Antwort wurde bearbeitet, um diese mobile Lösung einzubeziehen.

77voto

sdleihssirhc Punkte 41111

Hier ist eine sehr einfache Methode, dies zu tun:

window.onscroll = function () { window.scrollTo(0, 0); };

Im IE6 ist es etwas ruckelig.

22 Stimmen

Es handelt sich nicht wirklich um eine Deaktivierung, sondern eher um ein Einrasten auf die Standardeinstellung, wenn ein Bildlauf versucht wird.

14 Stimmen

@Marcus So gut es geht mit einem Ereignis, das nicht abgesagt werden kann.

1 Stimmen

Es kann mit jQuery scrollTo Plugin stören.

73voto

Mohammad Anini Punkte 4847

Die folgende Lösung ist einfach, aber reines JavaScript (kein jQuery):

function disableScrolling(){
    var x=window.scrollX;
    var y=window.scrollY;
    window.onscroll=function(){window.scrollTo(x, y);};
}

function enableScrolling(){
    window.onscroll=function(){};
}

4 Stimmen

Ruckeln in Safari 7.1 und IE 11. Neuestes Chrome, Firefox, Opera ok.

2 Stimmen

Immer noch ein bisschen ruckelig auf dem neuesten Chrome

0 Stimmen

Funktioniert gut, in Safari, Chrome, aber flackert im IE

28voto

lisovaccaro Punkte 29962

Es tut mir leid, auf einen alten Beitrag zu antworten, aber ich habe nach einer Lösung gesucht und bin auf diese Frage gestoßen.

Es gibt viele Umgehungsmöglichkeiten für dieses Problem, um die Bildlaufleiste trotzdem anzuzeigen, z.B. indem man dem Container eine Höhe von 100% und eine overflow-y: scroll Styling.

In meinem Fall habe ich einfach ein Div mit einer Bildlaufleiste erstellt, die ich beim Hinzufügen von overflow: hidden zum Körper:

function disableScroll() {
    document.getElementById('scrollbar').style.display = 'block';
    document.body.style.overflow = 'hidden';
}

Das Element scrollbar muss diesen Stil haben:

overflow-y: scroll; top: 0; right: 0; display: none; height: 100%; position: fixed;

Dies zeigt eine graue Bildlaufleiste, ich hoffe, es hilft zukünftigen Besuchern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X