【requestAnimationFrame】用原生js實(shí)現(xiàn)頁(yè)面平滑滾動(dòng)到目標(biāo)位置-2018-05-11

由于最近要實(shí)現(xiàn)這個(gè)功能,沒有發(fā)現(xiàn)比較完善比較滿意的實(shí)現(xiàn)思路。所以,自己寫了一版。請(qǐng)教了大神一種比較好的思路,寫出來(lái)分享一下~

實(shí)現(xiàn)頁(yè)面滾動(dòng)到目標(biāo)位置,可以向上或向下。

這個(gè)功能用jQuery實(shí)現(xiàn)比較容易,三五行搞定,但是,有時(shí)候,總不能為了實(shí)現(xiàn)一個(gè)滾動(dòng)效果去多引入一個(gè)庫(kù),所以,現(xiàn)在我們拋開jQuery庫(kù),用原生JS實(shí)現(xiàn)。

實(shí)現(xiàn)動(dòng)畫的API:requestAnimationFrame
頁(yè)面滾動(dòng)的API:window.scrollTo()

思路步驟:

獲取元素。
獲取元素到屏幕頂部的距離 top: getBoundingClientRect
獲取頁(yè)面已滾動(dòng)的距離 pageY: pageYOffset。
得到目標(biāo)位置 endPosition: top+pageY。
requestAnimationFrame 是在顯示器屏幕刷新一幀時(shí)候執(zhí)行一次傳入的run函數(shù)。
設(shè)定動(dòng)畫持續(xù)時(shí)間 duration=500ms,
定義run函數(shù),顯示器每刷新一幀,則循環(huán)調(diào)用一次run函數(shù)。

每次調(diào)用run的時(shí)候,獲取時(shí)間差,根據(jù)時(shí)間-位置對(duì)應(yīng)的值,根據(jù)時(shí)間得到此刻應(yīng)該滾動(dòng)到的位置,window.scrollTo 到這個(gè)位置。
根據(jù)時(shí)間設(shè)定要滾動(dòng)到的位置。如果到了規(guī)定時(shí)間,頁(yè)面應(yīng)該在目標(biāo)位置。否則直接滾動(dòng)到目標(biāo)位置。

scroll = (ev, target) => {
    ev.preventDefault();

    const scrollPart = document.querySelector('.' + target); // 目標(biāo)節(jié)點(diǎn)class
    const top = scrollPart.getBoundingClientRect().top;
    const pageY = window.pageYOffset;
    const endPosition = top + pageY;

    const startTime = +new Date();
    const duration = 500; //ms

    function run() {
        const time = +new Date() - startTime;

        window.scrollTo(0, pageY + top * (time / duration));
        run.timer = requestAnimationFrame(run);

        if (time >= duration) {
            window.scrollTo(0, endPosition);
            cancelAnimationFrame(run.timer);
        }
    } 

    requestAnimationFrame(run);
}

scroll();

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前端開發(fā)面試題 <a name='preface'>前言</a> 只看問題點(diǎn)這里 看全部問題和答案點(diǎn)這里 本文由我...
    自you是敏感詞閱讀 904評(píng)論 0 3
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    前端進(jìn)階之旅閱讀 115,532評(píng)論 24 450
  • 使用Java反射,您可以檢查類的方法并在運(yùn)行時(shí)調(diào)用它們。 這是通過Java類java.lang.reflect.M...
    FantJ閱讀 4,825評(píng)論 2 3
  • 近兩年來(lái),魚火鍋成為了一種飲食潮流,無(wú)論是麻辣魚火鍋、清湯魚火鍋、酸菜魚火鍋,都成為北京食客們的最愛,那么為什么魚...
    你腦袋里有花生閱讀 511評(píng)論 0 0
  • 今天放學(xué)回家后,爸爸教我寫作業(yè),改正了我寫字的壞習(xí)慣,有的字沒按米字格的標(biāo)準(zhǔn)寫,大小不一不好看。爸爸告訴我要寫在中...
    郭憲閱讀 265評(píng)論 0 0

友情鏈接更多精彩內(nèi)容