App下載

在html5中有幾種方法可以實(shí)現(xiàn)平滑滾動(dòng)效果?詳解三種實(shí)現(xiàn)方法!

猿友 2021-07-29 09:32:53 瀏覽數(shù) (5654)
反饋

今天小編來和大家講解一下有關(guān)于:“在html5中有幾種方法可以實(shí)現(xiàn)平滑滾動(dòng)效果?詳解三種實(shí)現(xiàn)方法!”這個(gè)問題的相關(guān)內(nèi)容分享!

背景

最近開發(fā)公司的公眾號(hào)H5,做了一個(gè)點(diǎn)擊icon滾動(dòng)到頂部的功能。實(shí)現(xiàn)功能比較簡(jiǎn)單,直接調(diào)用window.scrollTo(0, 0),一行代碼完成。但是作為一個(gè)攻城獅,怎么可能對(duì)自己要求這么低,所以我給自己加了個(gè)需求,實(shí)現(xiàn) 平滑滾動(dòng)頁(yè)面到頂部 的功能。經(jīng)過調(diào)研和查看文檔,有了以下三種方案。

1.使用CSS

完成功能的最高境界,只用CSS就搞定。代碼如下:

html {
    scroll-behavior: smooth;
}

該樣式的作用是為有滾動(dòng)條的元素指定一個(gè)滾動(dòng)的行為,但是只有在當(dāng)用戶手動(dòng)導(dǎo)航或者 CSSOM scrolling API觸發(fā)滾動(dòng)的時(shí)候生效,不影響用戶行為產(chǎn)生的滾動(dòng)。就在我慶祝的時(shí)候,打開can i use看了下兼容性:

日了狗,還是老老實(shí)實(shí)用JS實(shí)現(xiàn)吧。

2.使用Window.scrollTo API

我們都知道window.scrollTo(x, y),通過傳入文檔中的x,y軸坐標(biāo)來實(shí)現(xiàn)滾動(dòng)到頁(yè)面某個(gè)位置的功能。這個(gè)API其實(shí)還可以傳入一個(gè)option,是一個(gè)對(duì)象,left值對(duì)應(yīng)坐標(biāo)中的x,top對(duì)應(yīng)坐標(biāo)中的y,還有一個(gè)值為behavior,可以讓你自定義滾動(dòng)行為,然后我們這樣來實(shí)現(xiàn)滾動(dòng)到頂部:

window.scrollTo({
    left: 0,
    top: 0,
    behavior: 'smooth'
})

真香,搞定。過了幾天,產(chǎn)品經(jīng)理扛著5米大刀來找我,說在Safari上滾動(dòng)效果奇怪,體檢極差。于是我默默打開了MDN文檔,滾動(dòng)到底部:

看到了這張圖,雖然API瀏覽器都幾乎支持,但是option選項(xiàng)在Safari上直接掛掉,于是我又打開了stackoverflow,總結(jié)了終極方案。

3.使用requestAnimationFrame

經(jīng)常能看到大名鼎鼎的requestAnimationFrame,但是沒機(jī)會(huì)用上,這次可以嘗嘗鮮了。我們知道requestAnimationFrame的作用就是告訴瀏覽器在下次重繪之前執(zhí)行傳入的回調(diào)函數(shù),這個(gè)行為是瀏覽器自動(dòng)幫你做的。于是有了如下代碼:

const scrollToTop = () => {
    let scrollTop = document.documentElement.scrollTo || document.body.scrollTop
    if (scrollTop > 0) {
        window.requestAnimationFrame(scrollTop)
        window.scrollTop(0, scrollTop - scrollTo / 8)
    }
}

Done?。?!Perfect?。?!雀躍的同時(shí),我還是打開了can i use查看了requestAnimationFrame的兼容性:

相信通過以上小編的整理和分享大家對(duì)于:“在html5中有幾種方法可以實(shí)現(xiàn)平滑滾動(dòng)效果?詳解三種實(shí)現(xiàn)方法!”這個(gè)問題就有了不少的了解,當(dāng)然了在html5中可以完成的效果不僅如此,更多的相關(guān)內(nèi)容我們都可以在W3Cschool中進(jìn)行學(xué)習(xí)和了解! 


0 人點(diǎn)贊