Consegui obter uma ótima solução para esse problema com iScroll, com a sensação de rolagem dinâmica e tudo mais https://github.com/cubiq/iscroll O documento do github é ótimo, e eu o segui na maior parte. Aqui estão os detalhes da minha implementação.
HTML:
envolvi a área rolável do meu conteúdo em alguns divs que o iScroll pode usar:
<div id="wrapper">
<div id="scroller">
... my scrollable content
</div>
</div>
CSS:
Usei a classe Modernizr para "toque" para direcionar minhas alterações de estilo apenas para dispositivos de toque (porque eu só instanciei o iScroll no toque).
.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 do download do iScroll e, em seguida, inicializei o scroller como abaixo, em que updatePosition é minha função que reage à nova posição de rolagem.
# coffeescript
if Modernizr.touch
myScroller = new IScroll('#wrapper', probeType: 3)
myScroller.on 'scroll', updatePosition
myScroller.on 'scrollEnd', updatePosition
Você tem que usar myScroller para obter a posição atual agora, em vez de olhar para o deslocamento da rolagem. Aqui está uma função tirada de http://markdalgleish.com/presentations/embracingtouch/ (um artigo muito útil, mas um pouco desatualizado agora)
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};
}
A única outra pegadinha era que ocasionalmente eu perdia parte da minha página que estava tentando acessar, e ela se recusava a rolar. Eu tinha que adicionar algumas chamadas a myScroller.refresh () sempre que alterava o conteúdo do #wrapper, e isso resolveu o problema.
EDIT: Outra pegadinha foi que o iScroll come todos os eventos de "clique". Ativei a opção de fazer com que o iScroll emita um evento de "toque" e lidei com eles em vez de eventos de "clique". Felizmente, não precisei de muitos cliques na área de rolagem, então isso não era grande coisa.
window.pageYOffset
e nãodocument.body.scrollTop||document.documentElement.scrollTop
como qualquer outro navegador / hardware existente.