2014-02-27 59 views
4

我正在創建一個函數,它使用requestAnimationFrame和delta時間在HTML5畫布上在y時間內滾動一個圖像元素x像素。我無法弄清楚的是,當requestAnimationFrame已經用一個參數(一個DOMHighResTimeStamp)調用了我的函數時,如何給我的函數添加更多的參數。我敢肯定,下面的代碼無法正常工作:向函數requestAnimationFrame調用的函數添加附加參數

function scroll(timestamp, distanceToScroll, secondsToScroll) { 
    //delta = how many milliseconds have passed between this and last draw 
    if (!lastDraw) {var lastDraw = timestamp;}; 
    delta = (0.5 + (timestamp - lastDraw)) << 0; //bitwise hack for rounding integers 
    lastDraw = timestamp; 

    //speed (pixels per millisecond) = amount of pixels to move/length of animation (in milliseconds) 
    speed = distanceToScroll/secondsToScroll; 

    //new position = current position + (speed * delta) 
    position += (speed * delta); 

    context.drawImage(myImage,0,position,50,50/*of 200*/,0,0,100,100); 
    requestAnimationFrame(scroll(timestamp, distanceToScroll, secondsToScroll)); 
}; 

//later... 
scroll(timestamp, 100, 5) 
scroll(timestamp, 10, 20) 

我的問題是我不知道如何強制requestAnimationFrame到continute打電話給我的滾動功能與我的其他參數,當所有它在默認情況下是通只有一個參數(時間戳)回調。那麼我該如何去添加更多的參數(或者強迫rAF把時間戳放入我的'時間戳'參數中)?

+0

從我所能掌握的有限知識來看,我認爲解決方案在於.call()/。apply()或者通過傳遞一個包含滾動到其中的匿名函數給rAF,但是我可以'如果我這樣做,就可以繞過我的頭部來訪問RAF的時間戳。 – Danneh

回答

4

您​​語句評估爲什麼:

  • scroll(timestamp, distanceToScroll, secondsToScroll),其中timestamp是不確定的。它拋出一個錯誤或者返回undefined
  • window.requestAnimationFrame不帶參數執行,因此沒有回調

傳遞調用scroll與所需參數的匿名函數應該做的伎倆:

requestAnimationFrame(function(timestamp) { 
    scroll(timestamp, distanceToScroll, secondsToScroll)); 
}); 

什麼這評估爲:

  • window.requestAnimationFrame被調用,匿名函數作爲回調
  • 匿名函數被調用,timestamp作爲第一參數
  • scroll調用與當前timestampdistanceToScrollsecondsToScroll作爲參數
+0

這樣一個明顯的解決方案,但我看不到它。謝謝。 – Danneh

0

純JavaScript

function scrollIntoViewSmooth(elem) { 
    var move = elem.offsetTop - (elem.offsetTop - elem.parentElement.scrollTop) * 0.25; 

    if (Math.abs(elem.offsetTop - move) <= 2) { 
     elem.parentElement.scrollTop = elem.offsetTop; 
    } else { 
     elem.parentElement.scrollTop = move; 
     setTimeout(scrollIntoViewSmooth, 33, elem); 
    } 
} 

示例

scrollIntoViewSmooth(document.getElementById('stuff'));