Мені вдалося отримати прекрасне вирішення цієї проблеми з iScroll, з відчуттям прокрутки імпульсу і всього https://github.com/cubiq/iscroll Документ github чудовий, і я здебільшого дотримувався його. Ось деталі моєї реалізації.
HTML:
Я загорнув область прокрутки свого вмісту в деякі диви, якими iScroll може користуватися:
<div id="wrapper">
<div id="scroller">
... my scrollable content
</div>
</div>
CSS:
Я використовував клас Modernizr для "дотику", щоб орієнтувати зміни в стилі лише на пристрої, що торкаються (оскільки я лише створював iScroll на дотик).
.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:
Я включив iscroll-probe.js із завантаження iScroll, а потім ініціалізував скроллер, як показано нижче, де updatePosition - це моя функція, яка реагує на нову позицію прокрутки.
# coffeescript
if Modernizr.touch
myScroller = new IScroll('#wrapper', probeType: 3)
myScroller.on 'scroll', updatePosition
myScroller.on 'scrollEnd', updatePosition
Ви повинні використовувати myScroller, щоб отримати поточну позицію зараз, а не дивитися на зміщення прокрутки. Ось функція, взята з http://markdalgleish.com/presentations/embracingtouch/ (надзвичайно корисна стаття, але трохи застаріла зараз)
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};
}
Єдиний інший ґотча - це те, що я час від часу втрачав частину своєї сторінки, на яку я намагався прокрутити, і вона відмовилася прокручувати. Мені доводилося додавати деякі дзвінки до myScroller.refresh (), коли я змінював вміст #wrapper, і це вирішувало проблему.
EDIT: Інша проблема полягає в тому, що iScroll з'їдає всі події "натискання". Я ввімкнув опцію, щоб iScroll випромінював подію "tap" і обробляв їх замість подій "click". На щастя, мені не потрібно було багато клацати в області прокрутки, так що це було не багато.
window.pageYOffset
і неdocument.body.scrollTop||document.documentElement.scrollTop
як і будь-який інший браузер / апаратних засобів в існуванні.