Udało mi się znaleźć świetne rozwiązanie tego problemu dzięki iScroll, z poczuciem przewijania pędu i wszystkiego https://github.com/cubiq/iscroll Dokument github jest świetny i głównie go śledziłem . Oto szczegóły mojej realizacji.
HTML:
zawinąłem przewijalny obszar mojej zawartości w niektóre elementy div, których może używać iScroll:
<div id="wrapper">
<div id="scroller">
... my scrollable content
</div>
</div>
CSS:
Użyłem klasy Modernizr do „dotyku”, aby kierować zmiany stylu tylko na urządzenia dotykowe (ponieważ utworzyłem instancję iScroll tylko na dotyk).
.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:
Dołączyłem iscroll-probe.js z pobierania iScroll, a następnie zainicjowałem scroller jak poniżej, gdzie updatePosition to moja funkcja, która reaguje na nową pozycję przewijania.
# coffeescript
if Modernizr.touch
myScroller = new IScroll('#wrapper', probeType: 3)
myScroller.on 'scroll', updatePosition
myScroller.on 'scrollEnd', updatePosition
Musisz teraz użyć myScroller, aby uzyskać bieżącą pozycję, zamiast patrzeć na przesunięcie przewijania. Oto funkcja zaczerpnięta z http://markdalgleish.com/presentations/embracingtouch/ (bardzo pomocny artykuł, ale teraz trochę nieaktualny)
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};
}
Jedynym innym problemem było to, że czasami traciłem część mojej strony, do której próbowałem przewijać, i odmawiała przewijania. Musiałem dodać kilka wywołań do myScroller.refresh () za każdym razem, gdy zmieniłem zawartość #wrapper, i to rozwiązało problem.
EDYCJA: Innym problemem było to, że iScroll zjada wszystkie zdarzenia „kliknięcia”. Włączyłem opcję, aby iScroll emitował zdarzenie „tap” i obsłużyłem je zamiast zdarzeń „kliknięcia”. Na szczęście nie potrzebowałem dużo klikania w obszarze przewijania, więc nie było to nic wielkiego.
window.pageYOffset
a niedocument.body.scrollTop||document.documentElement.scrollTop
jak każda inna.