摘要:起因之前自己在使用這種網(wǎng)站時(shí),經(jīng)常看到無(wú)限加載的效果。原理在需要無(wú)限加載的列表底部,埋下一個(gè)隱藏元素。這時(shí)候就需要進(jìn)行列表加載。通過(guò)查閱,得知方法返回元素的大小及其相對(duì)于視口的位置。
起因
之前自己在使用這種網(wǎng)站時(shí),經(jīng)常看到無(wú)限加載的效果。
今天正好看到了getBoundingClientRect這個(gè)Api,就想著試試看如何實(shí)現(xiàn)Infinite scroll的效果。
在需要無(wú)限加載的列表底部,埋下一個(gè)隱藏元素。
當(dāng)不斷滑動(dòng)時(shí),隱藏元素將出現(xiàn)在視窗(viewport)里,也就意味著當(dāng)前瀏覽的列表已經(jīng)到底部了。
這時(shí)候就需要進(jìn)行列表加載。
大概的HTML結(jié)構(gòu)如下:
- 我是文章
- 我是文章
- 我是文章
- 我是文章
- 我是文章
也就是:滑動(dòng)列表 => 隱藏的無(wú)限加載指示器出現(xiàn)在視圖 => 開(kāi)始加載
那么重點(diǎn)就是檢測(cè)隱藏的無(wú)限加載指示器是否出現(xiàn)在視圖窗口。
還好,我們有getBoundingClientRect這個(gè)Api。
通過(guò)查閱MDN,得知:
Element.getBoundingClientRect()方法返回元素的大小及其相對(duì)于視口的位置。而除了 width 和 height 外的屬性都是相對(duì)于視口的左上角位置而言的。
至于兼容性,一片綠,可以放心使用。
DOMRect 對(duì)象getBoundingClientRect()方法的返回值是一個(gè) DOMRect 對(duì)象,這個(gè)對(duì)象是由該元素的 getClientRects() 方法返回的一組矩形的集合, 即:是與該元素相關(guān)的CSS 邊框集合 。
對(duì)象的屬性如下圖所示:
其中的 top, left, bottom, right 均是元素自身相對(duì)于視圖左上角而言的。
就top, left屬性而言,很好理解。而bottom, right則一開(kāi)始搞的有點(diǎn)懵,后面通過(guò)devtools觀察,發(fā)現(xiàn)bottom是元素的最底部相對(duì)于視圖窗口左上角而言的,而right則是元素的最右側(cè)相對(duì)于視圖窗口左上角而言的。
其中right-left為元素的寬度,bottom - top則是元素的高度。
在這里,有兩種情況,一個(gè)是元素是否出現(xiàn)于視圖窗口中,另一種則是元素是否完全出現(xiàn)于視圖窗口中。
兩種情況的區(qū)別在于一個(gè)是部分出現(xiàn),一個(gè)是完全出現(xiàn)。
下面我把兩種情況都寫(xiě)出來(lái):
部分出現(xiàn)在視圖窗口中
function checkIsPartialVisible (element) { const rect = element.getBoundingClientRect() const { top, left, bottom, right } = rect const isPartialVisible = top >= 0 && left >= 0 return isPartialVisible }
全部出現(xiàn)于視圖窗口中:
function checkIsTotalVisible (element) { const rect = element.getBoundingClientRect() const { top, left, bottom, right } = rect const isTotalVisible = ( top >= 0 && left >= 0 && bottom < document.documentElement.clientHeight && right < document.documentElement.clientWidth ) return isTotalVisible }
那么問(wèn)題來(lái)了:我們到底選用那種呢?
從無(wú)限加載這個(gè)業(yè)務(wù)場(chǎng)景出發(fā),埋在列表最下邊的加載觸發(fā)器都非常小且不可見(jiàn),因此推薦選用第二種,也就是完全出現(xiàn)于視圖窗口的方式。
至于第一種,更適合檢測(cè)該元素是否已經(jīng)出現(xiàn)在視圖窗口,但并不要求全部出現(xiàn)的情況。
具體可以看我在jsfiddle上寫(xiě)的demo:
無(wú)限加載實(shí)例
后續(xù)更多的則是一些性能優(yōu)化的事情,比如debounce或者throttle來(lái)減少scroll事件調(diào)用次數(shù),加入ajax加載,loading indicator等。
那些都是屬于具體的業(yè)務(wù)范圍了,這兒不做討論。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/50815.html
摘要:起因之前自己在使用這種網(wǎng)站時(shí),經(jīng)常看到無(wú)限加載的效果。原理在需要無(wú)限加載的列表底部,埋下一個(gè)隱藏元素。這時(shí)候就需要進(jìn)行列表加載。通過(guò)查閱,得知方法返回元素的大小及其相對(duì)于視口的位置。 起因 之前自己在使用這種網(wǎng)站時(shí),經(jīng)常看到無(wú)限加載的效果。今天正好看到了getBoundingClientRect這個(gè)Api,就想著試試看如何實(shí)現(xiàn)Infinite scroll的效果。 原理 在需要無(wú)限加載...
摘要:大潮來(lái)襲前端開(kāi)發(fā)能做些什么去年谷歌和火狐針對(duì)提出了的標(biāo)準(zhǔn),顧名思義,即的體驗(yàn)方式,我們可以戴著頭顯享受沉浸式的網(wǎng)頁(yè),新的標(biāo)準(zhǔn)讓我們可以使用語(yǔ)言來(lái)開(kāi)發(fā)。 VR 大潮來(lái)襲 --- 前端開(kāi)發(fā)能做些什么 去年谷歌和火狐針對(duì) WebVR 提出了 WebVR API 的標(biāo)準(zhǔn),顧名思義,WebVR 即 web + VR 的體驗(yàn)方式,我們可以戴著頭顯享受沉浸式的網(wǎng)頁(yè),新的 API 標(biāo)準(zhǔn)讓我們可以使用 ...
摘要:優(yōu)秀無(wú)限滾動(dòng)的五項(xiàng)原則將無(wú)限滾動(dòng)做好,并不是不可能完成的任務(wù)。提供為特定項(xiàng)添加書(shū)簽的可能無(wú)限滾動(dòng)最常見(jiàn)的缺點(diǎn)之一就是,內(nèi)容出現(xiàn)的時(shí)候,沒(méi)法添加書(shū)簽。結(jié)論無(wú)限滾動(dòng)實(shí)現(xiàn)得好的話,可以達(dá)到令人難以置信的光滑無(wú)縫體驗(yàn)。 本文轉(zhuǎn)載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/673原文:https://uxplanet.org/infinite-scrolli...
摘要:實(shí)現(xiàn)列表動(dòng)態(tài)無(wú)限滾動(dòng)問(wèn)題在開(kāi)發(fā)頁(yè)面工程中,經(jīng)常會(huì)遇到滾動(dòng)列表當(dāng)實(shí)際需要顯示的內(nèi)容寬度或高度超過(guò)容器的寬度或高度時(shí),設(shè)置當(dāng)滾動(dòng)列表中的內(nèi)容比較少時(shí),我們可以一次性加載所有的內(nèi)容到列表容器中顯示。 JS+HTML實(shí)現(xiàn)列表動(dòng)態(tài)無(wú)限滾動(dòng) 問(wèn)題 在HTML開(kāi)發(fā)頁(yè)面工程中,經(jīng)常會(huì)遇到滾動(dòng)列表-當(dāng)實(shí)際需要顯示的內(nèi)容寬度或高度超過(guò)容器的寬度或高度時(shí),設(shè)置CSS overflow-x:auto;...
摘要:實(shí)現(xiàn)列表動(dòng)態(tài)無(wú)限滾動(dòng)問(wèn)題在開(kāi)發(fā)頁(yè)面工程中,經(jīng)常會(huì)遇到滾動(dòng)列表當(dāng)實(shí)際需要顯示的內(nèi)容寬度或高度超過(guò)容器的寬度或高度時(shí),設(shè)置當(dāng)滾動(dòng)列表中的內(nèi)容比較少時(shí),我們可以一次性加載所有的內(nèi)容到列表容器中顯示。 JS+HTML實(shí)現(xiàn)列表動(dòng)態(tài)無(wú)限滾動(dòng) 問(wèn)題 在HTML開(kāi)發(fā)頁(yè)面工程中,經(jīng)常會(huì)遇到滾動(dòng)列表-當(dāng)實(shí)際需要顯示的內(nèi)容寬度或高度超過(guò)容器的寬度或高度時(shí),設(shè)置CSS overflow-x:auto;...
閱讀 2475·2021-11-17 09:33
閱讀 762·2021-11-04 16:13
閱讀 1334·2021-10-14 09:50
閱讀 697·2019-08-30 15:53
閱讀 3664·2019-08-30 14:18
閱讀 3271·2019-08-30 14:14
閱讀 2100·2019-08-30 12:46
閱讀 3185·2019-08-26 14:05