網站首頁 編程語言 正文
文章目錄
- 什么是懶加載
- 實現圖片懶加載
- 列表懶加載
- 列表滾動加載
什么是懶加載
只在數據或內容即將進入視口或即將需要的時候才加載。
實現懶加載的好處有:
- 提高頁面加載速度和響應速度。只加載當前用戶需要或將要瀏覽到的數據,避免一次性加載大量不必要的數據。
- 節省用戶流量。只加載用戶瀏覽到的數據,避免加載用戶未瀏覽的數據,特別是對于移動端用戶來說可以節省流量。
- 優化用戶體驗。避免一次性加載大量數據導致頁面卡頓,appear突然出現,樣式渲染跳躍等影響用戶體驗的問題。
實現懶加載的弊端有: - 首屏加載會較慢,而一些關鍵數據又需要首屏加載,需要權衡。
- 需要監聽瀏覽器事件并判斷元素是否進入視口,稍微增加了開發難度。
- 如果數據較多,需要加載的內容較長,用戶體驗還是會受到影響。懶加載并非銀彈,還需要結合其他優化手段。
- 不利于 SEO。搜索引擎爬蟲抓取不到實際內容,抓取到的可能是 loading 占位圖等,影響網頁Indexed和排名。
所以,懶加載是一種非常 useful 的技術,可以極大提高用戶體驗和網頁性能,但也有一定的弊端,需要權衡選擇。一般來說,對于加載的數據較多,頁面性能和流量較為關注的場景,懶加載是一個不錯的方案。但如果對 SEO 優化要求較高,或者加載的數據較少,也可以不使用懶加載。
實現圖片懶加載
頁面需要大量展示圖片時可以考慮使用懶加載。實現步驟如下:
- 為圖片添加默認的 loading 圖片源和真實的 data-src 屬性:
<img src="loading.gif" data-src="real-img.jpg" />
- 獲取所有圖片元素:
const images = document.querySelectorAll('img');
- 監聽頁面滾動事件:
window.addEventListener('scroll', loadImages);
- 定義 loadImages 函數來加載圖片:
function loadImages() {
for (let i = 0; i < images.length; i++) {
// 獲取圖片源和位置信息
let imgSrc = images[i].dataset.src;
let imgRect = images[i].getBoundingClientRect();
if (imgRect.top < window.innerHeight && imgRect.left < window.innerWidth
&& imgRect.right > 0 && imgRect.bottom > 0) {
// 圖片進入視口,加載真實圖片源
images[i].src = imgSrc;
images[i].addEventListener('load', () => {
images[i].style.opacity = 1; // 淡入效果
});
}
}
}
- 頁面初始化時調用一次 loadImages,防止某些圖片已進入視口但未加載:
loadImages();
- 為避免加載較大圖片導致頁面卡頓,可以考慮在圖片加載完成后設置淡入效果:
images[i].addEventListener('load', () => {
images[i].style.opacity = 1;
});
列表懶加載
這里提供一個核心代碼,根據自己項目加入即可
// 比如使用我有這樣一個
// 定義頁碼和加載條數
const pageSize = 10;
let currentPage = 1;
// list 代表擁有滾動條的元素, 看你代碼如何定義,可以是網頁窗口 window、div元素、ul列表等等
// 需要先獲取list 元素,再監聽列表中的元素進入視口事件,判斷元素位置并加載數據
list.addEventListener('scroll', () => {
Array.from(list.children).forEach(elem => {
let top = elem.offsetTop;
let height = elem.clientHeight;
if (top > 0 && top < window.innerHeight) {
// 元素進入視口,加載數據
fetchData(currentPage);
currentPage++;
}
});
});
// 定義 fetchData() 方法根據頁碼加載數據,并更新元素內容:
function fetchData(page) {
// 發起請求,加載第page頁的數據,此處省略調用接口的代碼,根據自己代碼結構加入即可
...
...
// 更新列表中符合頁碼的元素內容
Array.from(list.children).forEach(elem => {
if (elem.dataset.page === page) {
elem.innerHTML = ... // 加載的數據內容
}
});
}
// 初始化加載第一頁數據,并為每個列表元素添加 data-page 屬性:
fetchData(1);
Array.from(list.children).forEach((elem, index) => {
elem.dataset.page = index % 10 + 1; // 每10個元素為一頁
});
列表滾動加載
如果是加載列表數據的話,這里提供一個實現滾動加載列表數據的代碼
// 1. 定義頁面大小、每頁加載條數和當前頁碼:
const pageSize = 10; // 每頁10條數據
const listHeight = 400; // 比如列表容器高度400px
let currentPage = 1; // 當前頁碼
let scrollTop = 0; // 上一次滾動條位置
// 2. 綁定滾動事件,判斷滾動方向并加載數據:
list.addEventListener('scroll', () => {
let scrollHeight = list.scrollHeight; // 滾動內容高度
let clientHeight = list.clientHeight; // 視口高度
let scrollDirection = scrollTop - list.scrollTop;
// 向下滾動
if (scrollDirection > 0 && scrollHeight - clientHeight - list.scrollTop <= pageSize * 3) {
// 滾動到底部,加載下一頁
currentPage++;
fetchData(currentPage);
}
// 向上滾動
if (scrollDirection < 0 && list.scrollTop <= pageSize * 3) {
// 滾動到頂部,加載上一頁
currentPage--;
fetchData(currentPage);
}
scrollTop = list.scrollTop; // 更新滾動條位置
});
// 定義 fetchData() 方法,根據頁碼加載數據:
function fetchData(page) {
// 發起請求,加載第page頁的數據
...
// 將新加載的數據添加到列表尾部
list.append(...);
}
// 初始化獲取第一頁數據
fetchData(1)
原文鏈接:https://blog.csdn.net/study_way/article/details/131150164
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-05-06 linux/mac上如何查看公網ip
- 2022-11-30 C語言實現單鏈表的基本操作分享_C 語言
- 2022-05-06 C++提取文件名與提取XML文件的方法詳解_C 語言
- 2022-12-27 golang中日期操作之日期格式化及日期轉換_Golang
- 2022-04-28 C++實現班級成績管理系統_C 語言
- 2023-01-20 Python輸入圓半徑,計算圓周長和面積的實現方式_python
- 2022-10-11 Linux下恢復應用程序被刪除的文件(lsof)
- 2022-05-17 EdgeX 設備服務與core-data、core-command的交互
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支