Tôi đang cố gắng triển khai phương pháp cuộn tùy chỉnh đơn giản trong ứng dụng web di động của mình. Tôi đang gặp rắc rối với việc di chuyển dọc, nơi tôi muốn có một chút hiệu ứng động lực nếu trang là 'flicked'.Làm thế nào để phát hiện một 'flick' sau khi kéo?
Vấn đề là phát hiện cử chỉ "rung", (vận tốc và có lẽ là chiều dài của cử chỉ đó) sau khi cử chỉ kéo, thay đổi hướng và những gì không. Hy vọng bạn hiểu ý tôi là gì, bạn có thể kéo trang lên hoặc xuống và ở cuối kéo, tôi muốn phát hiện nếu có một cú nhấp chuột.
Làm cách nào để tách hai? Logic như thế nào?
Rất cám ơn vì đã trợ giúp.
Mã: (xin lỗi nếu đoạn trích này là một chút của một mớ hỗn độn)
var Device = function() {
//define some private variablees
var startY,
startX,
startTime,
deltaY = 0,
deltaX = 0,
lastY,
currentPage,
nextPage,
prevPage,
directionY,
lastTime,
pages,
pane,
offsetX = 0,
offsetY = 0,
isPanning,
isScrolling,
isTouch = "ontouchstart" in window;
return {
init: function() {
document.getElementById('frame').addEventListener(isTouch ? 'touchstart' : 'mousedown', Device.onTouchStart, false);
//get all panes in an array
panes = document.querySelectorAll('.pane');
},
onTouchStart: function (evt) {
//get X and Y of the touch event
var touch = isTouch ? event.touches[0] : event;
startY = touch.clientY;
//add listener for touch move and end
document.addEventListener(isTouch ? 'touchmove' : 'mousemove', Device.onTouchMove, false);
document.addEventListener(isTouch ? 'touchend' : 'mouseup', Device.onTouchEnd, false);
startTime = new Date();
},
onTouchMove: function (evt) {
//get X and Y of the touch event
var touch = isTouch ? event.touches[0] : event;
currentY = touch.clientY;
//calc touch length
deltaY = currentY - startY;
//Detect if scroll is bigger than threshold 5px
if (Math.abs(deltaY) > 5 && !isPanning) {
isScrolling = true;
//get the element
pane = panes[0];
//set new position
offsetY = pane.lastOffset + deltaY;
//call animation
Device.scrollTo(pane,0,offsetY);
}
//detect last direction
directionY = (lastY >= currentY) ? 1 : 0;
//roll over last variables
lastY = currentY;
lastTime = new Date();
},
onTouchEnd: function() {
//timing
var endTime = new Date();
var velocity = (endTime - lastTime).toFixed(0);
console.log('velocity: ' + velocity);
//TEMPORARY
pane.lastOffset = offsetY;
isScrolling = false;
//housekeeping
document.removeEventListener(isTouch ? 'touchmove' : 'mousemove', Device.onTouchMove, false);
document.removeEventListener(isTouch ? 'touchend' : 'mouseup', Device.onTouchEnd, false);
//call for momentum
Device.doMomentum(velocity);
},
scrollTo: function(el,x,y) {
if (el) {
el.style['-webkit-transition-timing-function'] = '';
el.style['-webkit-transition-duration'] = '0ms';
el.style[ 'WebkitTransform' ] = 'translate3d('+x+'px,'+y+'px, 0px)';
}
},
animateTo: function(el,x,y) {
if (el) {
el.style['-webkit-transition-timing-function'] = 'cubic-bezier(0,0,0.25,1)';
el.style['-webkit-transition-duration'] = '300ms';
el.style[ 'WebkitTransform' ] = 'translate3d('+x+'px,'+y+'px, 0px)';
}
},
doMomentum: function(velocity) {
console.log((directionY == 1) ? 'up': 'down');
console.log('pane.lastOffset: ' + pane.lastOffset);
var endPosition;
if (directionY == 1) {
endPosition = pane.lastOffset - velocity;
} else {
endPosition = parseFloat(pane.lastOffset) + parseFloat(velocity);
}
console.log(endPosition);
Device.animateTo(pane,0,endPosition);
pane.lastOffset = endPosition;
}
[Trang MDN này] (https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent#touchmove) tuyên bố rằng _ "Tỷ lệ mà sự kiện touchmove được gửi là cụ thể cho từng trình duyệt, và cũng có thể thay đổi tùy thuộc vào khả năng của phần cứng của người dùng. Bạn không được dựa vào mức chi tiết cụ thể của các sự kiện này. "_ Vì bạn có vẻ đang kiểm tra thời gian delta, bạn có thể muốn xem xét điều này. – rookie1024