J'ai pu trouver une excellente solution à ce problème avec iScroll, avec la sensation de défilement dynamique et tout https://github.com/cubiq/iscroll La doc github est excellente, et je l'ai principalement suivie. Voici les détails de ma mise en œuvre.
HTML:
J'ai enveloppé la zone de défilement de mon contenu dans quelques div qu'iScroll peut utiliser:
<div id="wrapper">
<div id="scroller">
... my scrollable content
</div>
</div>
CSS:
J'ai utilisé la classe Modernizr pour "touch" pour cibler mes changements de style uniquement sur les appareils tactiles (car je n'ai instancié iScroll qu'au toucher).
.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:
J'ai inclus iscroll-probe.js du téléchargement iScroll, puis j'ai initialisé le défilement comme ci-dessous, où updatePosition est ma fonction qui réagit à la nouvelle position de défilement.
# coffeescript
if Modernizr.touch
myScroller = new IScroll('#wrapper', probeType: 3)
myScroller.on 'scroll', updatePosition
myScroller.on 'scrollEnd', updatePosition
Vous devez utiliser myScroller pour obtenir la position actuelle maintenant, au lieu de regarder le décalage de défilement. Voici une fonction tirée de http://markdalgleish.com/presentations/embracingtouch/ (un article super utile, mais un peu dépassé maintenant)
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};
}
Le seul autre problème était que je perdais parfois une partie de ma page sur laquelle j'essayais de faire défiler, et elle refusait de défiler. J'ai dû ajouter quelques appels à myScroller.refresh () chaque fois que je changeais le contenu du #wrapper, et cela résolvait le problème.
EDIT: Un autre problème était que iScroll mange tous les événements de "clic". J'ai activé l'option pour qu'iScroll émette un événement «tap» et ai géré ceux-ci au lieu des événements «clic». Heureusement, je n'ai pas eu besoin de beaucoup de clics dans la zone de défilement, donc ce n'était pas un gros problème.
window.pageYOffset
et pasdocument.body.scrollTop||document.documentElement.scrollTop
comme tous les autres navigateurs / matériels existants.