Pude obtener una gran solución a este problema con iScroll, con la sensación de desplazamiento por impulso y todo https://github.com/cubiq/iscroll El documento de github es genial, y lo seguí principalmente. Aquí están los detalles de mi implementación.
HTML:
Envolví el área desplazable de mi contenido en algunos divs que iScroll puede usar:
<div id="wrapper">
<div id="scroller">
... my scrollable content
</div>
</div>
CSS:
utilicé la clase Modernizr para "toque" para orientar mis cambios de estilo solo a dispositivos táctiles (porque solo he instanciado 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:
Incluí iscroll-probe.js de la descarga de iScroll y luego inicialicé el scroller como se muestra a continuación, donde updatePosition es mi función que reacciona a la nueva posición de scroll.
# coffeescript
if Modernizr.touch
myScroller = new IScroll('#wrapper', probeType: 3)
myScroller.on 'scroll', updatePosition
myScroller.on 'scrollEnd', updatePosition
Debe usar myScroller para obtener la posición actual ahora, en lugar de mirar el desplazamiento de desplazamiento. Aquí hay una función tomada de http://markdalgleish.com/presentations/embracingtouch/ (un artículo muy útil, pero un poco desactualizado 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};
}
El único otro problema era que ocasionalmente perdía parte de mi página a la que estaba tratando de desplazarme, y se negaba a desplazarse. Tuve que agregar algunas llamadas a myScroller.refresh () cada vez que cambiaba el contenido del #wrapper, y eso resolvió el problema.
EDITAR: Otro problema fue que iScroll se come todos los eventos de "clic". Activé la opción para que iScroll emitiera un evento de "toque" y los manejé en lugar de eventos de "clic". Afortunadamente no necesité hacer mucho clic en el área de desplazamiento, así que esto no fue un gran problema.
window.pageYOffset
y nodocument.body.scrollTop||document.documentElement.scrollTop
como cualquier otro navegador / hardware existente.