मैं अपने मोबाइल वेब ऐप में एक साधारण कस्टम स्क्रॉलिंग विधि को लागू करने की कोशिश कर रहा हूं। मुझे ऊर्ध्वाधर स्क्रॉलिंग में परेशानी हो रही है, जहां पृष्ठ 'flicked' है, तो मैं थोड़ा गति प्रभाव रखना चाहता हूं।ड्रैग के बाद 'फ्लिक' का पता लगाने के लिए कैसे?
समस्या खींचने के संकेत, दिशा बदलने और क्या नहीं होने के बाद समस्या "झटका" इशारा, (वेग और शायद उस इशारा की लंबाई) का पता लगा रही है। आशा है कि आप समझेंगे कि मेरा क्या मतलब है, आप पृष्ठ को ऊपर या नीचे खींच सकते हैं और उस ड्रैग के अंत में, मैं यह जानना चाहता हूं कि कोई झटका भी है ..
आप दोनों को कैसे अलग करते हैं? ऐसा तर्क कैसे दिखता है?
किसी भी मदद के लिए बहुत धन्यवाद।
कोड: (खेद है कि अगर यह अंश एक मेस का एक सा है)
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;
}
[यह एमडीएन पृष्ठ] (https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent#touchmove) कहता है कि "जिस दर पर टचमोव ईवेंट भेजे जाते हैं वह ब्राउज़र-विशिष्ट है, और उपयोगकर्ता के हार्डवेयर की क्षमता के आधार पर भी भिन्न हो सकता है। आपको इन घटनाओं की विशिष्ट ग्रैन्युलरिटी पर भरोसा नहीं करना चाहिए। "_ क्योंकि आप डेल्टा-टाइम की जांच कर रहे हैं, तो आप इसे विचार करना चाहेंगे। – rookie1024