摘要:起因之前自己在使用這種網(wǎng)站時(shí),經(jīng)常看到無限加載的效果。原理在需要無限加載的列表底部,埋下一個(gè)隱藏元素。這時(shí)候就需要進(jìn)行列表加載。通過查閱,得知方法返回元素的大小及其相對(duì)于視口的位置。
起因
之前自己在使用這種網(wǎng)站時(shí),經(jīng)常看到無限加載的效果。
今天正好看到了getBoundingClientRect這個(gè)Api,就想著試試看如何實(shí)現(xiàn)Infinite scroll的效果。
在需要無限加載的列表底部,埋下一個(gè)隱藏元素。
當(dāng)不斷滑動(dòng)時(shí),隱藏元素將出現(xiàn)在視窗(viewport)里,也就意味著當(dāng)前瀏覽的列表已經(jīng)到底部了。
這時(shí)候就需要進(jìn)行列表加載。
大概的HTML結(jié)構(gòu)如下:
- 我是文章
- 我是文章
- 我是文章
- 我是文章
- 我是文章
也就是:滑動(dòng)列表 => 隱藏的無限加載指示器出現(xiàn)在視圖 => 開始加載
那么重點(diǎn)就是檢測(cè)隱藏的無限加載指示器是否出現(xiàn)在視圖窗口。
還好,我們有getBoundingClientRect這個(gè)Api。
通過查閱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則一開始搞的有點(diǎn)懵,后面通過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à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 }
那么問題來了:我們到底選用那種呢?
從無限加載這個(gè)業(yè)務(wù)場(chǎng)景出發(fā),埋在列表最下邊的加載觸發(fā)器都非常小且不可見,因此推薦選用第二種,也就是完全出現(xiàn)于視圖窗口的方式。
至于第一種,更適合檢測(cè)該元素是否已經(jīng)出現(xiàn)在視圖窗口,但并不要求全部出現(xiàn)的情況。
具體可以看我在jsfiddle上寫的demo:
無限加載實(shí)例
后續(xù)更多的則是一些性能優(yōu)化的事情,比如debounce或者throttle來減少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://m.specialneedsforspecialkids.com/yun/83140.html
摘要:起因之前自己在使用這種網(wǎng)站時(shí),經(jīng)常看到無限加載的效果。原理在需要無限加載的列表底部,埋下一個(gè)隱藏元素。這時(shí)候就需要進(jìn)行列表加載。通過查閱,得知方法返回元素的大小及其相對(duì)于視口的位置。 起因 之前自己在使用這種網(wǎng)站時(shí),經(jīng)常看到無限加載的效果。今天正好看到了getBoundingClientRect這個(gè)Api,就想著試試看如何實(shí)現(xiàn)Infinite scroll的效果。 原理 在需要無限加載...
摘要:大潮來襲前端開發(fā)能做些什么去年谷歌和火狐針對(duì)提出了的標(biāo)準(zhǔn),顧名思義,即的體驗(yàn)方式,我們可以戴著頭顯享受沉浸式的網(wǎng)頁,新的標(biāo)準(zhǔn)讓我們可以使用語言來開發(fā)。 VR 大潮來襲 --- 前端開發(fā)能做些什么 去年谷歌和火狐針對(duì) WebVR 提出了 WebVR API 的標(biāo)準(zhǔn),顧名思義,WebVR 即 web + VR 的體驗(yàn)方式,我們可以戴著頭顯享受沉浸式的網(wǎng)頁,新的 API 標(biāo)準(zhǔn)讓我們可以使用 ...
摘要:優(yōu)秀無限滾動(dòng)的五項(xiàng)原則將無限滾動(dòng)做好,并不是不可能完成的任務(wù)。提供為特定項(xiàng)添加書簽的可能無限滾動(dòng)最常見的缺點(diǎn)之一就是,內(nèi)容出現(xiàn)的時(shí)候,沒法添加書簽。結(jié)論無限滾動(dòng)實(shí)現(xiàn)得好的話,可以達(dá)到令人難以置信的光滑無縫體驗(yàn)。 本文轉(zhuǎn)載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/673原文:https://uxplanet.org/infinite-scrolli...
摘要:實(shí)現(xiàn)列表動(dòng)態(tài)無限滾動(dòng)問題在開發(fā)頁面工程中,經(jīng)常會(huì)遇到滾動(dòng)列表當(dāng)實(shí)際需要顯示的內(nèi)容寬度或高度超過容器的寬度或高度時(shí),設(shè)置當(dāng)滾動(dòng)列表中的內(nèi)容比較少時(shí),我們可以一次性加載所有的內(nèi)容到列表容器中顯示。 JS+HTML實(shí)現(xiàn)列表動(dòng)態(tài)無限滾動(dòng) 問題 在HTML開發(fā)頁面工程中,經(jīng)常會(huì)遇到滾動(dòng)列表-當(dāng)實(shí)際需要顯示的內(nèi)容寬度或高度超過容器的寬度或高度時(shí),設(shè)置CSS overflow-x:auto;...
摘要:實(shí)現(xiàn)列表動(dòng)態(tài)無限滾動(dòng)問題在開發(fā)頁面工程中,經(jīng)常會(huì)遇到滾動(dòng)列表當(dāng)實(shí)際需要顯示的內(nèi)容寬度或高度超過容器的寬度或高度時(shí),設(shè)置當(dāng)滾動(dòng)列表中的內(nèi)容比較少時(shí),我們可以一次性加載所有的內(nèi)容到列表容器中顯示。 JS+HTML實(shí)現(xiàn)列表動(dòng)態(tài)無限滾動(dòng) 問題 在HTML開發(fā)頁面工程中,經(jīng)常會(huì)遇到滾動(dòng)列表-當(dāng)實(shí)際需要顯示的內(nèi)容寬度或高度超過容器的寬度或高度時(shí),設(shè)置CSS overflow-x:auto;...
閱讀 2430·2021-11-23 10:04
閱讀 1501·2021-09-02 15:21
閱讀 897·2019-08-30 15:44
閱讀 1069·2019-08-30 10:48
閱讀 714·2019-08-29 17:21
閱讀 3562·2019-08-29 13:13
閱讀 1989·2019-08-23 17:17
閱讀 1792·2019-08-23 17:04