Ich konnte mit iScroll eine großartige Lösung für dieses Problem finden, mit dem Gefühl des Momentum-Scrollings und allem https://github.com/cubiq/iscroll Das Github-Dokument ist großartig und ich habe es größtenteils befolgt. Hier sind die Details meiner Implementierung.
HTML:
Ich habe den scrollbaren Bereich meines Inhalts in einige Divs eingeschlossen, die iScroll verwenden kann:
<div id="wrapper">
<div id="scroller">
... my scrollable content
</div>
</div>
CSS:
Ich habe die Modernizr-Klasse für "touch" verwendet, um meine Stiländerungen nur auf Touch-Geräte auszurichten (da ich iScroll nur bei Berührung instanziiert habe).
.touch #wrapper {
position: absolute;
z-index: 1;
top: 0;
bottom: 0;
left: 0;
right: 0;
overflow: hidden;
}
.touch #scroller {
position: absolute;
z-index: 1;
width: 100%;
}
JS:
Ich habe iscroll-probe.js aus dem iScroll-Download aufgenommen und dann den Scroller wie folgt initialisiert, wobei updatePosition meine Funktion ist, die auf die neue Scrollposition reagiert.
# coffeescript
if Modernizr.touch
myScroller = new IScroll('#wrapper', probeType: 3)
myScroller.on 'scroll', updatePosition
myScroller.on 'scrollEnd', updatePosition
Sie müssen myScroller verwenden, um die aktuelle Position zu ermitteln, anstatt den Bildlaufversatz zu betrachten. Hier ist eine Funktion von http://markdalgleish.com/presentations/embracingtouch/ (ein super hilfreicher Artikel, aber jetzt etwas veraltet).
function getScroll(elem, iscroll) {
var x, y;
if (Modernizr.touch && iscroll) {
x = iscroll.x * -1;
y = iscroll.y * -1;
} else {
x = elem.scrollTop;
y = elem.scrollLeft;
}
return {x: x, y: y};
}
Das einzige andere Problem war, dass ich gelegentlich einen Teil meiner Seite verlor, zu der ich scrollen wollte, und sich weigerte, zu scrollen. Ich musste myScroller.refresh () immer dann aufrufen, wenn ich den Inhalt des #wrapper änderte, und das löste das Problem.
EDIT: Ein weiteres Problem war, dass iScroll alle "Klick" -Ereignisse isst. Ich habe die Option aktiviert, dass iScroll ein "Tap" -Ereignis ausgibt, und diese anstelle von "Click" -Ereignissen behandelt. Zum Glück musste ich nicht viel in den Bildlaufbereich klicken, also war das keine große Sache.
window.pageYOffset
und nichtdocument.body.scrollTop||document.documentElement.scrollTop
wie dieser funktioniert .