使用JS+HTML/CSS實(shí)現(xiàn)虛擬滾動(dòng)和分頁(yè)加載效果
1. HTML 結(jié)構(gòu)
首先,我們需要?jiǎng)?chuàng)建一個(gè)基本的HTML結(jié)構(gòu),用于容納虛擬滾動(dòng)列表。我們將使用<ul>
元素來表示列表,每個(gè)列表項(xiàng)使用<li>
元素。
<!DOCTYPE html> <html> <head> <title>虛擬滾動(dòng)和分頁(yè)加載示例</title> <link rel="stylesheet" href="styles.css" rel="external nofollow" > </head> <body> <div class="container"> <ul class="virtual-list"> <!-- 這里將在后續(xù)步驟中生成列表項(xiàng) --> </ul> </div> <div class="loading" id="loading">加載中...</div> </body> </html>
2. CSS 樣式
接下來,我們將為列表項(xiàng)和加載指示器創(chuàng)建一些基本的CSS樣式,以便將其裝飾。
/* styles.css */ .container { width: 300px; height: 400px; overflow: auto; border: 1px solid #ccc; } .virtual-list { list-style: none; padding: 0; margin: 0; } .virtual-list li { padding: 16px; border-bottom: 1px solid #ccc; } .loading { text-align: center; display: none; margin: 20px; }
3. JavaScript 代碼
現(xiàn)在,我們將使用JavaScript來生成虛擬滾動(dòng)列表并實(shí)現(xiàn)分頁(yè)加載。在這個(gè)示例中,我們將加載一個(gè)包含3000個(gè)虛擬項(xiàng)目的數(shù)據(jù)集。
// script.js document.addEventListener("DOMContentLoaded", function () { const container = document.querySelector(".container"); const list = document.querySelector(".virtual-list"); const loadingIndicator = document.getElementById("loading"); const pageSize = 50; // 每頁(yè)加載的項(xiàng)目數(shù)量 let currentPage = 1; // 當(dāng)前頁(yè)碼 function generateItem(index) { const li = document.createElement("li"); li.textContent = `Item #${index}`; return li; } function loadPage(page) { loadingIndicator.style.display = "block"; // 模擬異步加載數(shù)據(jù) setTimeout(() => { for (let i = 0; i < pageSize; i++) { const itemIndex = (page - 1) * pageSize + i + 1; list.appendChild(generateItem(itemIndex)); } loadingIndicator.style.display = "none"; }, 1000); } function handleScroll() { if ( container.scrollTop + container.clientHeight >= list.clientHeight - 100 ) { currentPage++; loadPage(currentPage); } } // 初始化頁(yè)面 loadPage(currentPage); // 監(jiān)聽滾動(dòng)事件 container.addEventListener("scroll", handleScroll); });
4. 解釋
讓我們解釋上述代碼的關(guān)鍵部分:
我們首先在HTML中創(chuàng)建了一個(gè)包含列表項(xiàng)的
<ul>
元素。容器元素(.container
)用于容納虛擬列表,而列表元素(.virtual-list
)將包含虛擬項(xiàng)。加載指示器(.loading
)用于顯示加載過程中的消息。在CSS中,我們?cè)O(shè)置了列表項(xiàng)和加載指示器的樣式,使其看起來更好。
在JavaScript中,我們定義了以下幾個(gè)重要的部分:
generateItem(index)
函數(shù)用于生成列表項(xiàng),每個(gè)列表項(xiàng)都包含一個(gè)唯一的文本。loadPage(page)
函數(shù)模擬分頁(yè)加載數(shù)據(jù)。我們使用setTimeout
模擬異步加載,加載完成后將新的項(xiàng)目添加到列表中。handleScroll()
函數(shù)用于監(jiān)聽滾動(dòng)事件。當(dāng)用戶滾動(dòng)列表并接近底部時(shí),它會(huì)觸發(fā)加載下一頁(yè)的數(shù)據(jù)。在初始化階段,我們加載第一頁(yè)數(shù)據(jù)。
最后,我們監(jiān)聽容器的滾動(dòng)事件,并在接近底部時(shí)觸發(fā)加載下一頁(yè)的數(shù)據(jù)。
5. 性能優(yōu)化
要進(jìn)一步優(yōu)化性能,您可以考慮以下幾點(diǎn):
初始加載:如果用戶不必立即看到整個(gè)列表,請(qǐng)考慮僅加載第一頁(yè)數(shù)據(jù),并在滾動(dòng)時(shí)加載其他頁(yè)面。
回收視圖:當(dāng)用戶滾動(dòng)離開視圖的項(xiàng)目時(shí),可以從DOM中刪除這些項(xiàng)目,以減少內(nèi)存占用。
使用虛擬滾動(dòng)庫(kù):對(duì)于更復(fù)雜的用例,可以考慮使用現(xiàn)有的虛擬滾動(dòng)庫(kù),如
react-window
或react-virtualized
,以簡(jiǎn)化實(shí)現(xiàn)并提高性能。
以上就是使用JS+HTML/CSS實(shí)現(xiàn)虛擬滾動(dòng)和分頁(yè)加載效果的詳細(xì)內(nèi)容,更多關(guān)于JS虛擬滾動(dòng)和分頁(yè)加載的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL Installer 8.0.21安裝教程圖文詳解
這篇文章主要介紹了MySQL Installer 8.0.21安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08詳解MySQL中事務(wù)的持久性實(shí)現(xiàn)原理
這篇文章主要介紹了詳解MySQL中事務(wù)的持久性實(shí)現(xiàn)原理,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2021-01-01MySQL觸發(fā)器基本用法詳解【創(chuàng)建、查看、刪除等】
這篇文章主要介紹了MySQL觸發(fā)器基本用法,結(jié)合實(shí)例形式分析了mysql觸發(fā)器的基本創(chuàng)建、查看、刪除等相關(guān)使用方法與注意事項(xiàng),需要的朋友可以參考下2020-05-05MySQL基于group_concat()函數(shù)合并多行數(shù)據(jù)
這篇文章主要介紹了MySQL基于group_concat()函數(shù)合并多行數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10