Saya bisa mendapatkan solusi hebat untuk masalah ini dengan iScroll, dengan nuansa momentum scrolling dan semuanya https://github.com/cubiq/iscroll Doc github hebat, dan saya kebanyakan mengikutinya. Berikut detail implementasi saya.
HTML:
Saya membungkus area konten saya yang dapat digulir dalam beberapa div yang dapat digunakan oleh iScroll:
<div id="wrapper">
<div id="scroller">
... my scrollable content
</div>
</div>
CSS:
Saya menggunakan kelas Modernizr untuk "sentuh" untuk menargetkan perubahan gaya saya hanya untuk perangkat sentuh (karena saya hanya membuat contoh iScroll saat disentuh).
.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:
Saya menyertakan iscroll-probe.js dari unduhan iScroll, dan kemudian menginisialisasi scroller seperti di bawah ini, di mana updatePosition adalah fungsi saya yang bereaksi terhadap posisi scroll baru.
# coffeescript
if Modernizr.touch
myScroller = new IScroll('#wrapper', probeType: 3)
myScroller.on 'scroll', updatePosition
myScroller.on 'scrollEnd', updatePosition
Anda harus menggunakan myScroller untuk mendapatkan posisi saat ini, daripada melihat scroll offset. Ini adalah fungsi yang diambil dari http://markdalgleish.com/presentations/embracingtouch/ (artikel yang sangat membantu, tapi agak ketinggalan zaman sekarang)
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};
}
Satu-satunya gotcha lain adalah kadang-kadang saya akan kehilangan bagian dari halaman saya yang saya coba gulir, dan itu akan menolak untuk menggulir. Saya harus menambahkan beberapa panggilan ke myScroller.refresh () setiap kali saya mengubah konten #wrapper, dan itu menyelesaikan masalah.
EDIT: Gotcha lain adalah bahwa iScroll memakan semua acara "klik". Saya mengaktifkan opsi agar iScroll mengeluarkan acara "ketuk" dan menanganinya alih-alih acara "klik". Untungnya saya tidak perlu banyak mengklik di area gulir, jadi ini bukan masalah besar.
window.pageYOffset
dan tidakdocument.body.scrollTop||document.documentElement.scrollTop
seperti semua browser / perangkat keras lain yang ada.