Tôi đã có thể tìm ra giải pháp tuyệt vời cho vấn đề này với iScroll, với cảm giác cuộn động lực và mọi thứ https://github.com/cubiq/iscroll Tài liệu github rất tuyệt và tôi chủ yếu theo dõi nó. Đây là chi tiết về việc triển khai của tôi.
HTML:
Tôi đã bọc vùng có thể cuộn của nội dung của mình trong một số div mà iScroll có thể sử dụng:
<div id="wrapper">
<div id="scroller">
... my scrollable content
</div>
</div>
CSS:
Tôi đã sử dụng lớp Modernizr cho "touch" để nhắm mục tiêu các thay đổi kiểu của tôi chỉ đến các thiết bị cảm ứng (vì tôi chỉ khởi tạo iScroll khi chạm).
.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:
Tôi đã bao gồm iscroll-probe.js từ bản tải xuống iScroll, sau đó khởi tạo cuộn như bên dưới, trong đó updatePosition là hàm của tôi phản ứng với vị trí cuộn mới.
# coffeescript
if Modernizr.touch
myScroller = new IScroll('#wrapper', probeType: 3)
myScroller.on 'scroll', updatePosition
myScroller.on 'scrollEnd', updatePosition
Bạn phải sử dụng myScroller để có được vị trí hiện tại, thay vì nhìn vào phần bù cuộn. Đây là một chức năng được lấy từ http://markdalgleish.com/presentations/embracingtouch/ (một bài viết siêu hữu ích, nhưng hiện tại hơi lỗi thời)
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};
}
Điểm khác duy nhất khác là thỉnh thoảng tôi sẽ mất một phần trang mà tôi đang cố cuộn đến và nó sẽ từ chối cuộn. Tôi phải thêm một số lệnh gọi vào myScroller.refresh () bất cứ khi nào tôi thay đổi nội dung của #wrapper và điều đó đã giải quyết được vấn đề.
CHỈNH SỬA: Một điểm khác là iScroll ăn tất cả các sự kiện "nhấp chuột". Tôi đã bật tùy chọn để iScroll phát ra sự kiện "nhấn" và xử lý các sự kiện đó thay vì "nhấp". Rất may, tôi không cần nhấp nhiều vào vùng cuộn, vì vậy đây không phải là vấn đề lớn.
window.pageYOffset
và khôngdocument.body.scrollTop||document.documentElement.scrollTop
giống như mọi trình duyệt / phần cứng khác đang tồn tại.