J'ai été en mesure d'obtenir une excellente solution à ce problème avec iScroll, avec la sensation de défilement dynamique et tout et tout https://github.com/cubiq/iscroll Le github doc est super, et j'ai surtout suivi. Voici les détails de ma mise en œuvre.
HTML:
J'ai enveloppé la zone déroulante de mon contenu dans certains divs qui iScroll pouvez utiliser:
<div id="wrapper">
<div id="scroller">
... my scrollable content
</div>
</div>
CSS:
J'ai utilisé la Modernizr classe pour "toucher" pour cibler mes changements de style uniquement pour les appareils tactiles (parce que je ne instancié iScroll sur la touche).
.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 à partir de la iScroll télécharger, et ensuite initialisé la barre de 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éfilement de l'offset. Voici une fonction de prise de http://markdalgleish.com/presentations/embracingtouch/ (un super article utile, mais un peu démodé 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};
}
La seule autre gotcha était parfois je perds une partie de ma page que j'essayais de faire défiler, et il refusera de les faire défiler. J'ai dû ajouter dans certains appels à myScroller.refresh() à chaque fois que j'ai changé le contenu de la #wrapper, et qui a résolu le problème.
EDIT: un Autre piège est que iScroll mange tous les "cliquez sur" événements". J'ai activé l'option pour avoir iScroll émettent un "tap" de l'événement et traitées à la place de ", cliquez sur" événements". Heureusement je n'ai pas besoin de beaucoup d'cliquant dans la zone de défilement, ce n'était pas une grosse affaire.