【前端】【面試】如何實現圖片漸進式加載?有幾種方法

前端圖片漸進式加載

一、技術原理解析

漸進式加載是通過分階段、按需加載圖片,以提升用戶體驗和頁面性能的優化技術。主要包括以下實現方式:

  • 懶加載:基于IntersectionObserver API,當圖片進入瀏覽器視口時才發起加載請求,減少初始頁面加載量。現代瀏覽器支持loading="lazy"原生屬性,可自動實現延遲加載。
  • 低質量占位圖:使用模糊占位圖(LQIP)或灰色方塊占位,在真實圖片加載前快速呈現,待圖片即將可見時再加載高清版本。
  • 骨架屏:在加載過程中展示頁面布局的灰色框架,讓用戶感知頁面結構和加載狀態。
  • 漸進式圖像格式:如漸進式JPEG,先以低質量方式加載整體輪廓,再逐層疊加細節,讓用戶更快看到圖片概貌。

其核心原理是先展示輕量化占位內容,縮短用戶感知加載時間,再異步加載高清圖片,提升整體體驗。

二、實現方式與代碼示例

1. 原生 HTML/CSS/JS 實現

現代瀏覽器支持原生懶加載:

<img src="real.jpg" loading="lazy" alt="..." width="..." height="...">

如需更靈活控制,可結合IntersectionObserver

<img class="lazyload" data-src="high-res.jpg" alt="示例圖片" width="600" height="400">
const lazyImages = document.querySelectorAll('img.lazyload');
const observer = new IntersectionObserver((entries) => {entries.forEach(entry => {if (entry.isIntersecting) {const img = entry.target;img.src = img.dataset.src;img.classList.remove('lazyload');observer.unobserve(img);}});
});
lazyImages.forEach(img => observer.observe(img));

2. 進階:響應式圖片與懶加載結合

使用<picture>標簽實現格式兼容與懶加載:

<picture><source srcset="image.avif" type="image/avif"><source srcset="image.webp" type="image/webp"><img src="image.jpg" loading="lazy" alt="示例圖片">
</picture>

瀏覽器會優先選擇AVIF或WebP格式,不支持時回退到JPEG。

3. 漸進式圖像格式處理

將JPEG保存為漸進式模式,或使用WebP/AVIF等現代格式,結合TinyJPG等工具生成多尺寸圖及預覽版本。

三、應用場景與優化策略

適用于圖片密集型場景,如長列表、瀑布流、電商頁面等。優化建議:

  • CDN加速:分發圖片資源,提升加載速度。
  • 圖片壓縮與尺寸適配:根據設備類型提供對應尺寸和格式的圖片。
  • 采用現代格式:優先使用WebP/AVIF,降低文件大小。
  • 占位圖策略:使用色塊或低質量圖作為占位,增強過渡體驗。

四、不同方法的優缺點對比

方法優點缺點
Base64占位圖加載迅速,過渡平滑需多版本占位圖,增加數據量
懶加載減少請求,兼容性好依賴現代瀏覽器,滾動過快可能留白
骨架屏展示頁面結構,緩解等待焦慮實現復雜,增加渲染成本
漸進式JPEG快速呈現輪廓,漸進加載細節僅支持JPEG,缺乏新特性支持

五、主流框架中的實現方式

React

使用react-lazyload庫:

import LazyLoad from 'react-lazyload';function Gallery() {return (<LazyLoad height={200} once><img src="large-image.jpg" alt="示例" /></LazyLoad>);
}

或結合react-intersection-observer自定義懶加載邏輯。

Vue

使用vue-lazyload插件:

// main.js
import Vue from 'vue';
import VueLazyload from 'vue-lazyload';
Vue.use(VueLazyload, {loading: '/static/loading-spinner.svg'
});
<img v-lazy="'/assets/' + item.productImage" alt="商品圖">

Vue 3 可使用vue3-lazyload及Composition API實現類似功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80883.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80883.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80883.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 中的條件注解

Spring Boot條件注解的匯總&#xff1a; 注解作用判斷依據使用場景ConditionalOnBean容器中存在指定Bean時&#xff0c;被注解的配置或Bean定義生效指定Bean在容器中存在依賴其他已存在Bean時配置相關功能ConditionalOnCheckpointRestore在特定檢查點恢復相關條件滿足時生效滿…

leetcode11-盛水最多的容器

leetcode 11 思路 問題分析 拆解問題&#xff0c;面積 底 * 高 寬度&#xff1a;兩個豎直線之間的距離&#xff0c;顯然是 right - left高度&#xff1a;容器的水位受限于較短的那根豎直線的高度&#xff0c;所以高度為 min(height[left], height[right]) 本題其實很容易…

HTTP:十二.HTTPS

HTTPS 概述 超文本傳輸安全協議(英語:HyperText Transfer Protocol Secure,縮寫:HTTPS;常稱為HTTP over TLS、HTTP over SSL或HTTP Secure)是一種通過計算機網絡進行安全通信的傳輸協議。HTTPS經由HTTP進行通信,利用TLS加密數據包。 HTTPS的主要目的是提供對網站服務器…

MySQL數據庫(14)—— 使用C操作MySQL

目錄 一&#xff0c;下載庫 二&#xff0c;安裝庫 三&#xff0c;使用庫 3.1 連接數據庫 3.2 發送SQL 3.3 獲取結果 問題&#xff1a;為什么不使用C&#xff1f; 解答&#xff1a;使用C的庫已經可以完成絕大部分MySQL操作了&#xff0c;并且C的庫的使用更加復雜&#xff…

Redis故障防御體系:構建七層免疫系統的設計哲學

當Redis遭遇寫入阻塞或服務崩潰時&#xff0c;本質上是系統邊界的多重防御機制被擊穿。本文摒棄碎片化的解決方案&#xff0c;從系統工程的全局視角&#xff0c;構建七層遞進式防御體系&#xff0c;揭示高可用架構的深層設計邏輯。 第一層&#xff1a;動態資源調度 —— 內存的…

在線文本客服系統核心功能解析

在線文本客服系統核心功能解析 在互聯網大廠的Java求職者面試中&#xff0c;經常會被問到關于在線文本客服系統的實現和設計。本文通過一個故事場景來展示這些問題的實際解決方案。 第一輪提問 面試官&#xff1a;馬架構&#xff0c;歡迎來到我們公司的面試現場。請問您對在…

學成在線。。。

一:講師管理 介紹:可以實現對講師的分頁展示,多條件組合分頁查詢,對講師的添加,修改,刪除操作。 針對于添加來說,使用requestBody注解,搭配postmapping接收數據,使用service層的對象,調用mapper方法,向數據庫中保存數據。 修改: 先根據講師id,查詢出講師,再去…

Webug3.0通關筆記17 中級進階(第01-05關)

目錄 第一關 出來點東西吧 1.打開靶場 2.源碼分析 3.源碼修正 4.文件包含漏洞滲透 第二關 提交方式是怎樣的啊&#xff1f; 1.打開靶場 2.源碼分析 3.滲透實戰 &#xff08;1&#xff09;bp改包法 &#xff08;2&#xff09;POST法滲透 第三關 我還是一個注入 1.打開…

C語言復習筆記--內存函數

在復習完字符函數和字符串函數之后,今天讓我們復習一下內存函數吧.這一塊的東西不太多,并且與之前的字符串函數有一些地方很相似,所以這里應該會比較輕松. memcpy使用和模擬實現 老規矩,先看函數原型 void * memcpy ( void * destination, const void * source, size_t num );…

【Unity AR開發插件】一、高效熱更新:Unity AR 插件結合 HybridCLR 與 ARFoundation 的開源倉庫分享

摘要 本篇博客詳細介紹了我基于 HybridCLR 與 AR Foundation 的 Unity AR 開發插件&#xff0c;旨在為開發者提供高效的跨平臺熱更新方案。文章從背景與動機出發&#xff0c;覆蓋一鍵安裝工具、環境配置、熱更新數據制作與示例程序運行等核心模塊&#xff0c;并展示代碼結構與使…

數據分析(四):Python Pandas數據輸入輸出全流程指南

Python Pandas數據輸入輸出全流程指南 1. 引言 數據輸入輸出(I/O)是數據分析工作流中最基礎也是最重要的環節之一。Pandas提供了豐富的數據讀寫接口&#xff0c;支持從各種文件格式和數據庫中加載數據&#xff0c;以及將處理后的數據保存到不同存儲系統中。本文將全面介紹Pan…

人工智能與機器學習:Python從零實現性回歸模型

?? 向所有學習者致敬! “學習不是裝滿一桶水,而是點燃一把火。” —— 葉芝 我的博客主頁: https://lizheng.blog.csdn.net ?? 歡迎點擊加入AI人工智能社區! ?? 讓我們一起努力,共創AI未來! ?? 前言 在 AI 的熱潮中,很容易忽視那些讓它得以實現的基礎數學和技…

Ubuntu18.04更改時區(圖文詳解)

Ubuntu18.04更改時區 1、前言2、更改時區3、總結 1、前言 記錄一下Ubuntu18.04更改時區的過程&#xff0c;方便自己日后回顧&#xff0c;也可以給有需要的人提供幫助。 2、更改時區 輸入下面的指令&#xff0c;進行時區選擇 tzselect輸入4選擇亞洲&#xff0c;輸入9選擇中…

vue2 項目使用vite2 升級 vite4 后,對別名的解析有問題,導致打包后項目無法正常運行

問題描述&#xff1a; 之前使用的 vite2 版本&#xff0c;需要在 vite.config 里配置 vue 別名&#xff0c;不然會有commonjs 的依賴包找不到 vue&#xff0c;因為 vite 默認使用 esm 版本。 vue: vue/dist/vue.common.prod.js 在 vite2 中可以正常進行打包上線&#xff0c;…

民辦生從零學C的第十二天:指針(1)

每日勵志&#xff1a;拼搏十年&#xff0c;征戰沙場&#xff0c;不忘初心&#xff0c;努力成為一個渾身充滿銅臭味的有錢人。 一.內存和地址 1.內存 計算機內存是一系列存儲單元的集合&#xff0c;每個存儲單元都有唯一的地址來標識。這些存儲單元用于存儲程序的數據和指令。…

用Postman驗證IAM Token的實際操作

當我們需要用Postman發送一個最簡單的請求去驗證Token的時候我們該怎么辦&#xff1f; 【一、步驟】 步驟1&#xff1a;打開Postman&#xff0c;新建一個GET請求 請求地址填&#xff1a; https://iam.cn-north-4.myhuaweicloud.com/v3/auth/projects 解釋一下&#xff1a;…

關于常量指針和指向常量的指針

關于指針&#xff0c;對于常量指針和指向常量的指針也是傻傻分不清。看到定義時&#xff0c;不知道是指針不能變&#xff0c;還是指針指向的內容不能變量。 先看形式&#xff1a; const char * A; char * const B; 這兩種有什么區別&#xff1f;傻傻分不清。 A這種定義&am…

unity 讀取csv

1.讀取代碼 string filePath Application.streamingAssetsPath "\\data.csv"; public List<MovieData> movieData new List<MovieData>(); private void ReadCSV(string filePath) { List<List<string>> data new List<…

安達發|高效智能塑料切割數控系統 - 全自動化軟件解決方案

在當今的制造業中&#xff0c;塑料作為一種輕便、耐用且成本效益高的材料&#xff0c;被廣泛應用于各個領域。隨著科技的進步和市場需求的變化&#xff0c;塑料加工行業正面臨著前所未有的挑戰和機遇。為了提高生產效率&#xff0c;降低成本&#xff0c;并滿足日益嚴格的質量標…

c#接口_抽象類_多態學習

c#接口_抽象類_多態學習 學習日志 關于&#xff1a;c#接口_抽象類_多態的學習記錄。 一、概念 1. 多態&#xff08;Polymorphism&#xff09; 定義&#xff1a;同一操作作用于不同對象時&#xff0c;表現出不同的行為。實現方式&#xff1a; 繼承 方法重寫&#xff08;ov…