摘要:實現列表動態無限滾動問題在開發頁面工程中,經常會遇到滾動列表當實際需要顯示的內容寬度或高度超過容器的寬度或高度時,設置當滾動列表中的內容比較少時,我們可以一次性加載所有的內容到列表容器中顯示。
JS+HTML實現列表動態無限滾動 問題
在HTML開發頁面工程中,經常會遇到滾動列表-當實際需要顯示的內容寬度或高度超過容器的寬度或高度時,設置CSS
overflow-x:auto; overfow-y:auto;
當滾動列表中的內容比較少時,我們可以一次性加載所有的內容到列表容器中顯示。
當滾動列表中的內容比較多,使用分頁加載的方式逐步加載數據,2種方式
1.通過在列表的末尾添加一個標別元素indicator,和添加列表的scroll事件來監聽indicator元素是否可見,如果可見那么提交請求加載下一頁數據,append到列表內容的尾部。通過這個方式可以實現數據的無限加載,一直到數據取完。
2.在列表下部添加分頁工具條,用戶通過請求獲取指定頁的數據并且替換到當前列表里的內容
對于方式1對用戶想對友好,加載過的數據不會重復加載,請求的資源少,但是當量多時,頁面上的DOM元素量很不斷增加,消耗的內存也會加大
方式2用戶每翻一頁都要重新請求數據,即使對于翻過看過的數據想要重新看也是如此,請求資源多,好處是頁面DOM元素數量固定,占用內存資源少
那么有沒有一種方式結合方式1和方式2的優點,摒棄缺點,融合優化下呢?
~~有!有方法~~解決方案:
對當前列表的寬高固定,對列表包含的內容高度固定,列表滾動滿足條件時動態刪除或添加元素,保持元素數量的固定已經內容在列表可視區域的正確顯示。
列表能夠無限滾動,數據能夠無限加載,DOM元素保持一定數量
先放出實現的代碼吧
HTML部分Title 123456789101112131415161718192021222324252627282930
.infinity-scroll指定列表容器,CSS設置其水平不滾動,垂直方向自動滾動
.main-content為滾動內容組件,其高度隨著實際內容的增多而加大
.item為滾動內容的單個項目元素
.first-item為當前放置在列表容器內的內容的第1個元素,同時為當前滾動到頂部的標識元素
.last-item為當前放置在列表容器內的內容的最后一個元素,同時為當前滾動到底部的標識元素
放3組元素作為初始的列表內容,為什么是3組呢?為了保證滾動的流暢性,當前列表窗口顯示一組,卷起一組,下部隱藏一組
JS部分$(".infinity-scroll").on("scroll",infinity_scrollFun);
為列表添加scroll事件監聽infinity_scrollFun
infinity_scrollFun函數
計算列表容器的高度和離viewpoint頂部距離
if(!infinity_scroll_height){ infinity_scroll_height=$(".infinity-scroll")[0].getBoundingClientRect().height; infinity_scroll_top=$(".infinity-scroll")[0].getBoundingClientRect().top; }
計算.last-item的位置,如果正在加載數據不執行任何動作
if(isLoading){ return; }else{ last_item_top=$(".item.last-item")[0].getBoundingClientRect().top; last_item_top=last_item_top-infinity_scroll_top; }
如果.last-item出現在列表窗口,那么加載新的數據
if(last_item_top<=infinity_scroll_height){ isLoading=true; appendNewItems($(".main-content")[0].getBoundingClientRect().height,$(this).scrollTop()); return; }
如果.first-item出現在列表窗口,那么restore原來已經加載過的數據
first_item_top=$(".item.first-item")[0].getBoundingClientRect().top; first_item_top=first_item_top-infinity_scroll_top; console.log("~~first_item_top~~~%s",first_item_top); if(first_item_top>=0){ restorePreItems($(".main-content")[0].getBoundingClientRect().height,$(this).scrollTop()); return; }
appendNewItems函數
保持總體元素的個數,將.first-item后的10個元素刪除,添加新的內容到底部,并要保持內容的實際高度及顯示在列表窗口的內容的位置
$(".item").slice(0,10).remove(); $(".item").first().addClass("first-item"); var mainContentPaddingTop=$(".main-content").css("padding-top"); mainContentPaddingTop=parseFloat(mainContentPaddingTop.split("px")[0]||0); $(".main-content").append(documentFragment); if(lastMaxItemIndexrestorePreItems函數
功能和appendNewItems函數類似,只是刪除底部的10個元素,添加10個元素到頭部,并要保持內容的實際高度及顯示在列表窗口的內容的位置//刪除尾部的10個元素 $(".item.last-item").prevAll().slice(0,9).remove(); $(".item.last-item").remove(); $(".item").last().addClass("last-item"); mainContentPaddingTop=$(".main-content").css("padding-top"); mainContentPaddingTop=parseFloat(mainContentPaddingTop.split("px")[0]||0); $(".main-content").css({ "padding-top":mainContentPaddingTop-10*50 }); $(".main-content").prepend(documentFragment); $(".infinity-scroll").off("scroll",infinity_scrollFun); $(".infinity-scroll").scrollTop(scroll_top); $(".infinity-scroll").on("scroll",infinity_scrollFun);待改進的地方上面的假設內容區的item的高度都是相同,并且每次加在的item數量都是相同的。如果內容item的高度是動態變化的;
同時沒有做到頁面DOM元素的復用,其實完全可以復用刪除的元素作為將要添加的元素,只是變更其中的數據顯示內容;代碼需要做相應的修改,就留給小伙伴們改進吧:)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/50573.html
摘要:實現列表動態無限滾動問題在開發頁面工程中,經常會遇到滾動列表當實際需要顯示的內容寬度或高度超過容器的寬度或高度時,設置當滾動列表中的內容比較少時,我們可以一次性加載所有的內容到列表容器中顯示。 JS+HTML實現列表動態無限滾動 問題 在HTML開發頁面工程中,經常會遇到滾動列表-當實際需要顯示的內容寬度或高度超過容器的寬度或高度時,設置CSS overflow-x:auto;...
摘要:虛擬列表的實現有多種方案,本文以組件為基礎進行分析。常見的無限滾動便是延遲渲染的一種實現,而虛擬列表則是按需渲染的一種實現。接下來,本文會簡單介紹虛擬列表的一種實現方案。實現本章節將會創建一個組件,并結合代碼,慢慢梳理虛擬列表的實現。 在 列表數據的展示優化 一文中,提到了對于列表形態的數據展示的按需渲染。這種方式是指根據容器元素的高度以及列表項元素的高度來顯示長列表數據中的某一個部分...
摘要:合理的優化長列表,可以提升用戶體驗。這樣保證了無論如何滾動,真實渲染出的節點只有可視區內的列表元素。具體效果如下圖所示對于比無優化的情況,優化后的虛擬列表渲染速度提升很明顯。是基于來實現的,但是是一個維的列表,而不是網狀。 ??對于較長的列表,比如1000個數組的數據結構,如果想要同時渲染這1000個數據,生成相應的1000個原生dom,我們知道原生的dom元素是很復雜的,如果長列表...
摘要:合理的優化長列表,可以提升用戶體驗。這樣保證了無論如何滾動,真實渲染出的節點只有可視區內的列表元素。具體效果如下圖所示對于比無優化的情況,優化后的虛擬列表渲染速度提升很明顯。是基于來實現的,但是是一個維的列表,而不是網狀。 ??對于較長的列表,比如1000個數組的數據結構,如果想要同時渲染這1000個數據,生成相應的1000個原生dom,我們知道原生的dom元素是很復雜的,如果長列表...
閱讀 2486·2021-10-19 11:45
閱讀 2464·2021-09-30 09:56
閱讀 1432·2021-09-30 09:47
閱讀 591·2019-08-30 15:53
閱讀 1834·2019-08-30 15:44
閱讀 584·2019-08-30 12:52
閱讀 1084·2019-08-30 11:16
閱讀 1605·2019-08-29 16:36