yo era capaz de obtener una gran solución a este problema con iScroll, con el sensación de impulso de desplazamiento y todo https://github.com/cubiq/iscroll El documento github es genial, y en su mayoría lo seguí. Aquí están los detalles de mi implementación.
HTML: Envolví el área de desplazamiento de mi contenido en algunos divs que iScroll puede utilizar:
<div id="wrapper">
<div id="scroller">
... my scrollable content
</div>
</div>
CSS: utilicé la clase Modernizr para "toque" para apuntar a mi estilo solo cambia a dispositivos táctiles (porque solo instanciaba iScroll al tocar).
.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: que incluyen iscroll-probe.js de la descarga iScroll y, a continuación, inicializar el desplazador como abajo, donde updatePosition es mi función que reacciona a la nueva posición de desplazamiento.
# coffeescript
if Modernizr.touch
myScroller = new IScroll('#wrapper', probeType: 3)
myScroller.on 'scroll', updatePosition
myScroller.on 'scrollEnd', updatePosition
Tienes que usar myScroller para obtener la posición actual ahora, en lugar de mirar el desplazamiento de desplazamiento. Aquí es una función tomado de http://markdalgleish.com/presentations/embracingtouch/ (un artículo muy útil, pero un poco fuera de fecha ahora)
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 única otra Gotcha fue de vez en cuando iba a perder parte de mi página que yo estaba tratando de desplazarse a, y se negaría a desplazarse. Tuve que agregar algunas llamadas a myScroller.refresh() cada vez que cambiaba el contenido de la #wrapper, y eso resolvió el problema.
EDITAR: Otro problema es que iScroll come todos los eventos de "clic". Active la opción para que iScroll emita un evento "tap" y los administre en lugar de eventos "click". Afortunadamente, no necesité mucho hacer clic en el área de desplazamiento, así que esto no fue un gran problema.
Gracias, eso me obligó a mirar más lejos en el problema. La verdadera respuesta fue la detección de la parte superior de la ventana en el iPhone/iPad sólo funciona con 'window.pageYOffset' y no ' document.body.scrollTop || document.documentElement.scrollTop' como cualquier otro navegador/hardware que exista. –
@ck_ Desafortunadamente en el iPad 'window.pageYOffset' no se actualiza en la fase de desaceleración, sino solo cuando el desplazamiento finaliza. – Adaptabi
Es una mala práctica sobreescribir window.onscroll directamente. Agregar un detector de eventos sería mejor. Use window.addEventListener ('scroll', function() {alert ('scrolled!');}); –