Próbowałem wprowadzić kinetyczne przewijanie (czy to dobry pomysł, czy nie jest to kwestia) i doświadczyłem "dziwnego" zachowania.Dziwne zachowanie w czasie w javascript
function scroll(timestamp){
var deltaTime = timestamp - this.scrollLastTime;
this.scrollLastTime = timestamp;
console.log(deltaTime);
var newPosition = this.scrollTop + this.scrollSpeed*deltaTime;
if(newPosition <= 0){
this.scrollTop = 0;
this.scrolling = false;
return;
}else if(newPosition > this.scrollHeight-this.clientHeight){
this.scrollTop = this.scrollHeight-this.clientHeight;
this.scrolling = false;
}else{
this.scrollTop = newPosition;
var newSpeed = this.scrollSpeed + Math.sign(this.scrollSpeed) * this.scrollAcceleration*deltaTime;
if(this.scrollSpeed < 0 && newSpeed >= 0){
this.scrolling = false;
}else if(this.scrollSpeed >0 && newSpeed <= 0){
this.scrolling = false;
}else{
this.scrollSpeed = newSpeed;
window.requestAnimationFrame(this.scrollCallback);
}
}
}
document.getElementById("0").addEventListener('wheel',
function(e){
this.scrollSpeed = e.wheelDelta/100;
if(!this.scrolling){
this.scrolling = true;
this.scrollLastTime = performance.now();
this.scrollAcceleration = -0.01;
if(!this.scrollCallback)this.scrollCallback = scroll.bind(this);
window.requestAnimationFrame(this.scrollCallback);
}
e.preventDefault();
});
Problemem jest to, że często deltaTime staje się ujemny, co mi brakuje?
Edytuj: Używam wersji Chromium 51.0.2704.79 Ubuntu 14.04 (64-bit), jeśli to pomaga.
Zasadniczo, datownik rAF nie jest bardzo niezawodny. Wygląda na to, że przyciąga do najbliższej ramki, a nie do czasu, w którym kod jest faktycznie uruchamiany. Nigdy nie doszedłem do sedna, ale [miałem ten sam problem] (http://stackoverflow.com/questions/38360250/requestanimationframe-now-vs-performance-now-time-discrepancy). Uciekłem po prostu używając 'performance.now()' każdej klatki zamiast polegania na znaczniku czasu rAF. – Whothehellisthat