使用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>元素來(lái)表示列表,每個(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 樣式
接下來(lái),我們將為列表項(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來(lái)生成虛擬滾動(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)聽(tīng)滾動(dòng)事件
container.addEventListener("scroll", handleScroll);
});4. 解釋
讓我們解釋上述代碼的關(guān)鍵部分:
我們首先在HTML中創(chuàng)建了一個(gè)包含列表項(xiàng)的
<ul>元素。容器元素(.container)用于容納虛擬列表,而列表元素(.virtual-list)將包含虛擬項(xiàng)。加載指示器(.loading)用于顯示加載過(guò)程中的消息。在CSS中,我們?cè)O(shè)置了列表項(xiàng)和加載指示器的樣式,使其看起來(lái)更好。
在JavaScript中,我們定義了以下幾個(gè)重要的部分:
generateItem(index)函數(shù)用于生成列表項(xiàng),每個(gè)列表項(xiàng)都包含一個(gè)唯一的文本。loadPage(page)函數(shù)模擬分頁(yè)加載數(shù)據(jù)。我們使用setTimeout模擬異步加載,加載完成后將新的項(xiàng)目添加到列表中。handleScroll()函數(shù)用于監(jiān)聽(tīng)滾動(dòng)事件。當(dāng)用戶滾動(dòng)列表并接近底部時(shí),它會(huì)觸發(fā)加載下一頁(yè)的數(shù)據(jù)。在初始化階段,我們加載第一頁(yè)數(shù)據(jù)。
最后,我們監(jiān)聽(tīng)容器的滾動(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)離開(kāi)視圖的項(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)文章
銀河麒麟V10?x86安裝MySQL?8.0超詳細(xì)步驟記錄
MySQL廣泛用于Web應(yīng)用程序的后端數(shù)據(jù)庫(kù)存儲(chǔ),因?yàn)樗且粋€(gè)快速、穩(wěn)定、可靠且易于使用的數(shù)據(jù)庫(kù)系統(tǒng),下面這篇文章主要介紹了銀河麒麟V10 x86安裝MySQL 8.0超詳細(xì)步驟的相關(guān)資料,需要的朋友可以參考下2026-04-04
MySQL Workbench導(dǎo)入excel數(shù)據(jù)的實(shí)現(xiàn)示例
本文主要介紹了MySQL Workbench導(dǎo)入excel數(shù)據(jù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
mysql 動(dòng)態(tài)執(zhí)行存儲(chǔ)過(guò)程語(yǔ)句
MSSQL中動(dòng)態(tài)執(zhí)行sql語(yǔ)句可以使用EXEC()函數(shù)。MSSQL中也有類似的函數(shù)EXECUTE(),不過(guò)不同的是MYSQL中動(dòng)態(tài)執(zhí)行存儲(chǔ)過(guò)程語(yǔ)句與MSSQL還是有區(qū)別的。2009-07-07
mysql+mybatis實(shí)現(xiàn)存儲(chǔ)過(guò)程+事務(wù)?+?多并發(fā)流水號(hào)獲取
這篇文章主要介紹了mysql+mybatis+存儲(chǔ)過(guò)程+事務(wù)?+?多并發(fā)流水號(hào)獲取,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
解決遠(yuǎn)程連接mysql很慢的方法(mysql_connect 打開(kāi)連接慢)
有次同事提出開(kāi)發(fā)使用的mysql數(shù)據(jù)庫(kù)連接很慢,因?yàn)槲覀兊膍ysql開(kāi)發(fā)數(shù)據(jù)庫(kù)是單獨(dú)一臺(tái)機(jī)器部署的,所以認(rèn)為可能是網(wǎng)絡(luò)連接問(wèn)題導(dǎo)致的。2011-07-07
SQL?SERVER數(shù)據(jù)庫(kù)服務(wù)器CPU不能全部利用原因解析
這篇文章主要介紹了SQL?SERVER數(shù)據(jù)庫(kù)服務(wù)器CPU不能全部利用原因解析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09

