wenn ich -webkit-overflow-scrolling
für ein scrollendes div verwende, scrollt es perfekt mit dem nativen Moment. Aber div selbst friert manchmal ein und reagiert nicht auf meine Fingerbewegungen. Nach 2-3 Sekunden wird es wieder scrollbar.
Ich weiß nicht, wie ich dieses Problem reproduziere. Aber wie ich sehe, gibt es zwei Hauptverhalten, die diese Situation schaffen.
Erstens: Wenn ich eine Weile warte, zum Beispiel 20 Sekunden, und das div berühre, reagiert es nicht. Ich warte ein paar Sekunden und es funktioniert wieder.
Zweitens fühle ich mich mehrmals schnell, dann friert es ein und nach ein paar Sekunden wieder funktioniert es wieder.
Wie kann ich dieses Einfrieren verhindern?
Das Einfrieren war für mich wiederholbar und trat auf, wenn versucht wurde, nach oben oder unten zu scrollen, wenn bereits oben oder unten. Das Update bestand darin, einige Listener für touchstart
und touchmove
hinzuzufügen und diese Fälle und event.preventDefault()
on ’em zu erkennen.
Etwas wie das Folgende, wobei .scroller
das div ist, das tatsächlich scrollen wird (ändert sich in scrollTop
).
var lastY = 0; // Needed in order to determine direction of scroll.
$(".scroller").on('touchstart', function(event) {
lastY = event.touches[0].clientY;
});
$('.scroller').on('touchmove', function(event) {
var top = event.touches[0].clientY;
// Determine scroll position and direction.
var scrollTop = $(event.currentTarget).scrollTop();
var direction = (lastY - top) < 0 ? "up" : "down";
// FIX IT!
if (scrollTop == 0 && direction == "up") {
// Prevent scrolling up when already at top as this introduces a freeze.
event.preventDefault();
} else if (scrollTop >= (event.currentTarget.scrollHeight - event.currentTarget.outerHeight()) && direction == "down") {
// Prevent scrolling down when already at bottom as this also introduces a freeze.
event.preventDefault();
}
lastY = top;
});
Ich hoffe, das hilft der nächsten armen Seele, die auf diesen schrecklichen Käfer stößt! Viel Glück und weiter kämpfen!
Dies ist eine offene Ausgabe, deren Link hier zu finden ist Ausgabe in iOS
Eine der Lösungen zu diesem Problem finden Sie hier in diesem GitHub-Link github
Entsprechend den in den oben genannten GitHub-Links gefundenen Problemen - Es können nur wenige Schritte verfolgt werden, um das Bildlaufproblem zu entfernen.
Kommentar aus den folgenden zwei Zeilen im ionic.js
self.el.style.overflowY = 'hidden';
self.el.style.overflowX = 'hidden';
Verwenden Sie cordova.plugins.Keyboard.disableScroll(true)
, um Ohne Unterbrechung durch die Tastatur zu scrollen
$ionicConfigProvider.scrolling.jsScrolling(true)
Setzen Sie diese Option im Konfigurationsteil auf "true".
Unter bestimmten Umständen ist Overflow-Scroll auf "hidden" gesetzt, aber nicht mehr auf "scroll", wodurch der Bildschirm einfriert.
Ich hoffe es kann dir helfen.
/ * Notwendige Maßnahmen für mich, das schließt die Antwort aus * /
/ * Ich erkläre hiermit die vollständige Zuordnung zu den von Github veröffentlichten Seiten, die im Link wie oben angegeben angegeben sind. * /
Stabile Lösung
Nach vielen Tagen, um das Problem zu beheben, habe ich gesehen, dass das Problem von einem fixierten body
-Element herrührt, vielleicht weil Sie nicht möchten, dass Ihre Benutzer den Seitenkörper sehen, wenn der Bildlauf gesperrt ist: cf dieses Beispiel . Wenn der Körper behoben ist und ein Bildsturz beim Scrollen auftritt, wenn Sie den Körper mit Desktop Safari auf Ihrem iOS-Gerät untersuchen, können Sie feststellen, dass es sich "künstlich" bewegt ... ja, Webkit-Zeug. ..
Ich habe alle Lösungen ausprobiert, die zu dieser Bedrohung aufgeführt sind, aber auch zu github-ähnlichen Problemen. Niemand hat gearbeitet.
Die einzige stabile Lösung für mich ist die Verwendung dieses Pakets: body-scroll-lock und entfernt die fixed
von Ihrem body
-Element. Im Moment können Sie sowohl festsitzende Körper als auch keine einfrierenden Fehler beim Scrollen genießen.
Ich hoffe, es hilft Leuten, die derzeit progressive Web-Apps auf IOS erstellen.
Ich habe den folgenden Code verwendet, der meiner Meinung nach funktioniert.
var scrollTimer;
$('.scroller').on('scroll',function(e){
clearTimeout(scrollTimer);
scrollTimer = setTimeout(() => {
this.scrollTop = Math.max(1, Math.min(this.scrollTop, this.scrollHeight - this.clientHeight - 1));
}, 300);
});