I był w stanie uzyskać doskonałe rozwiązanie tego problemu z iScroll, z Poczucie przewijania pędu i wszystko, co trzeba. https://github.com/cubiq/iscroll Doktor github jest świetny, a ja głównie go śledziłem. Oto szczegóły mojej implementacji.
HTML: I owinął przewijalną obszar moich treści w niektórych div że iScroll może używać:
<div id="wrapper">
<div id="scroller">
... my scrollable content
</div>
</div>
CSS: użyłem klasy modernizr dla "dotyk", aby kierować mój styl zmienia się tylko na urządzenia dotykowe (ponieważ zainicjowałem tylko iScroll po dotyku).
.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: włączyłem iscroll-probe.js od pobrania iScroll, a następnie zainicjowany scroller jak poniżej, gdzie updatePosition jest 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 użyć myScroller, aby uzyskać aktualną pozycję, zamiast patrzeć na przesunięcie przewijania. Oto funkcja pochodzi z http://markdalgleish.com/presentations/embracingtouch/ (super pomocny artykuł, ale trochę nieaktualne teraz)
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};
}
Jedyna haczyka był sporadycznie chciałbym stracić część mojej stronie, że starał się przejść do i odmówiłby przewijania. Musiałem dodać kilka wywołań myScroller.refresh() za każdym razem, gdy zmieniłem zawartość #wrapper, i to rozwiązało problem.
EDYCJA: Kolejnym problemem było to, że iScroll zjada wszystkie zdarzenia "kliknięcia". Włączyłem opcję, aby program iScroll emitował zdarzenie "stuknij" i obsłużyło zdarzenia zamiast "kliknij". Na szczęście nie potrzebowałem wiele klikania w obszarze przewijania, więc to nie była wielka sprawa.
Dzięki, że zmusił mnie do dalszego spojrzenia na problem. Prawdziwa odpowiedź została wykrywania szczyt rzutni na iPhone/iPad działa tylko z 'window.pageYOffset' i nie ' document.body.scrollTop || document.documentElement.scrollTop' jak każda inna przeglądarka/sprzęt w istnieniu. –
@ck_ Niestety na IPAD 'window.pageYOffset' nie jest aktualizowany w fazie zwalniania, ale tylko po zakończeniu przewijania. – Adaptabi
Zła praktyka bezpośrednio zastępuje window.onscroll. Dodanie detektora zdarzeń byłoby lepsze. Użyj window.addEventListener ('scroll', function() {alert ('scrolled!');}); –