ฉันสามารถหาทางออกที่ยอดเยี่ยมสำหรับปัญหานี้ด้วย iScroll ด้วยความรู้สึกของการเลื่อนโมเมนตัมและทุกอย่างhttps://github.com/cubiq/iscrollเอกสาร github นั้นยอดเยี่ยมมากและฉันก็ติดตามมันเป็นส่วนใหญ่ นี่คือรายละเอียดการใช้งานของฉัน
HTML:
ฉันรวมพื้นที่ที่เลื่อนได้ของเนื้อหาของฉันใน div บางตัวที่ iScroll สามารถใช้ได้:
<div id="wrapper">
<div id="scroller">
... my scrollable content
</div>
</div>
CSS:
ฉันใช้คลาส Modernizr สำหรับ "touch" เพื่อกำหนดเป้าหมายการเปลี่ยนแปลงสไตล์ของฉันกับอุปกรณ์สัมผัสเท่านั้น (เพราะฉันสร้างอินสแตนซ์ 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 จากนั้นเริ่มต้น scroller ดังต่อไปนี้โดยที่ 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};
}
gotcha อื่น ๆ เท่านั้นที่บางครั้งฉันจะสูญเสียส่วนหนึ่งของหน้าเว็บที่ฉันพยายามจะเลื่อนไปและมันจะปฏิเสธที่จะเลื่อน ฉันต้องเพิ่มการโทรไปยัง myScroller.refresh () เมื่อใดก็ตามที่ฉันเปลี่ยนเนื้อหาของ #wrapper และนั่นช่วยแก้ปัญหาได้
แก้ไข: gotcha อีกอย่างคือ iScroll กินเหตุการณ์ "คลิก" ทั้งหมด ฉันเปิดตัวเลือกให้ iScroll ปล่อยเหตุการณ์ "แตะ" และจัดการเหตุการณ์เหล่านั้นแทนการ "คลิก" เหตุการณ์ โชคดีที่ฉันไม่ต้องการการคลิกในพื้นที่เลื่อนมากนักดังนั้นนี่จึงไม่ใช่เรื่องใหญ่
window.pageYOffset
ได้และไม่document.body.scrollTop||document.documentElement.scrollTop
เหมือนกับเบราว์เซอร์ / ฮาร์ดแวร์อื่น ๆ ที่มีอยู่