懒加载<图片懒加载>

news/2024/9/16 23:24:45/ 标签: 前端, javascript, 开发语言

1、懒加载的概念

懒加载也叫做延迟加载、按需加载。指的是在长网页中延迟加载图片数据,是一种较好的网页性能优化的方式。

在比较长的网页或应用中,如果图片很多,所有的图片都被加载出来,而用户只能看到可视窗口的那一部分图片数据,这样就浪费了性能。如果使用图片的懒加载就可以解决以上问题。在滚动屏幕之前,可视化区域之外的图片不会进行加载,在滚动屏幕时才加载。这样使得网页的加载速度更快,减少了服务器的负载

懒加载适用于图片较多页面列表较长(长列表)的场景中。

2、懒加载的特点

  • 减少无用资源的加载
    使用懒加载明显减少了服务器的压力和流量,同时也减小了浏览器的负担。
  • 提升用户体验
    同时加载较多图片,可能需要等待的时间较长会影响用户体验,使用懒加载可以大大的提高用户体验。
  • 防止加载过多图片而影响其他资源文件的加载
    加载过多图片可能会影响网站应用的正常使用。

3、图片懒加载的方式 

(1)img 标签的 loading 属性

loading 属性值【autoeager 、lazy 】

  • auto 浏览器默认的懒加载策略,和不增加这个属性的表现一样
  • eager 立即加载图像,不管它是否在视口之外(默认值);
  • lazy 延迟加载图像,直到它和视口接近到一个计算得到的距离(由浏览器定义,chrome、firfox、edge、safari 都是出现则立即加载)。注意,img 元素需要指定宽高 lazy 才能生效。
<img src="image.png" loading="lazy" width={200} height={200} />

:图片必须声明 width height,不然会布局发生移动

优点:使用简单,兼容性也还可以。

缺点:图片加载完成前,会看到空白区域,用户体验不是很好。

(2)JS事件监听

监听 scroll、resize 等事件,当事件触发时,获取图片元素的位置信息、滚动高度及视口高度,计算出当前图片元素是否出现在视口内,如果出现了则加载图片。

  • window.innerHeight 是浏览器可视区的高度;
  • document.body.scrollTop || document.documentElement.scrollTop 是浏览器滚动的过的距离;
  • imgs.offsetTop 是元素顶部距离文档顶部的高度(包括滚动条的距离);
  • 内容达到显示区域: img.offsetTop < window.innerHeight + document.body.scrollTop;
  • 到达可视区域后,imgs[i].src = imgs[i].getAttribute('data-src') as string;将 data-src 属性值赋值给 src,实现懒加载
<div class="container"><img src="loading.gif" data-src="pic.png"><img src="loading.gif" data-src="pic.png"><img src="loading.gif" data-src="pic.png"><img src="loading.gif" data-src="pic.png"><img src="loading.gif" data-src="pic.png">
<div>
<script>// 获取全部的图片元素let imgs = document.querySelectorAll('img')function lazyLoad () {// 获取浏览器滚动的过的距离var scrollTop = document.body.scrollTop || document.documentElement.scrollTop// 获取浏览器可视区的高度var winHeight = window.innerHeightfor (let i = 0; i < imgs.length; i++) {// 判断是否满足图片加载条件if (imgs[i].offsetTop < scrollTop + winHeight) {imgs[i].src = imgs[i].getAttribute('data-src')}}}window.onscroll = lazyLoad()
</script>

优点:所有浏览器都兼容,可以比较灵活,自定义触发加载的时机,可以结合图片加载预览提升用户体验。

缺点:需要通过事件触发,图片的位置需要手动计算,容易导致性能问题。

 (3)lazyload 插件

v-lazy 指令接收一个字符串类型的值,表示图片的地址。如果是背景图片,需要在指令后加上 :background-image 修饰符(注意冒号)。
当页面滚动时,vue-lazyload 会检测元素是否进入可视区域,如果是,则替换元素的 src 或者 style 属性,从而实现懒加载。

注意:若图片为循环渲染、分页显示,则必须写 key 值,不然切换页面后页面视图不刷新

vue-lazyload 提供了一个自定义指令 v-lazy,可以在img标签或者任何需要设置背景图片的标签上使用它

<!-- 懒加载img标签 -->
<img v-lazy="imgUrl" /><!-- 懒加载背景图片 -->
<div v-lazy:background-image="bgUrl"></div>

安装命令

  • vue2npm i vue-lazyload@1.2.3 -S
  • vue3npm i vue-lazyload-next -S

导入注册

// vue 2 导入
import VueLazyload from 'vue-lazyload'// vue 2 注册
Vue.use(VueLazyload, {//参数配置 可不填// 懒加载默认加载图片loading: 'xxx.png',// 加载失败后加载的图片error: 'xxx.png',preLoad: 1.3, // 预加载高度的比例attempt: 3 // 尝试加载次数
})// vue 3 导入
import VueLazyloadNext from 'vue-lazyload-next';// vue 3 注册
app.use(VueLazyloadNext, {// 添加一些配置参数 可不填// 懒加载默认加载图片loading: 'xxx.png',// 加载失败后加载的图片error: 'xxx.png',preLoad: 1.3, // 预加载高度的比例attempt: 3 // 尝试加载次数
});

(4)Intersection Observer API

API 接口参考网址

  • IntersectionObserver 是浏览器原生提供的构造函数,使用它能省到大量的循环和判断。这个构造函数的作用是它能够观察可视窗口与目标元素产生的交叉区域。简单来说就是当用它观察我们的图片时,当图片出现或者消失在可视窗口,它都能知道并且会执行一个特殊的回调函数,就可以利用这个回调函数实现需要的操作。
  • 解释补充:目标元素位置是通过 getBoundingClientRect() 方法确定的,所以无论是图片在正常文档流中还是脱离文档流,或者使用了 transform 改变渲染位置,最终都会根据元素相对于视口的实际渲染位置进行处理(可以理解为和视觉上是统一的,看到了就会触发)
useEffect(() => {const container = ref.current;const imgElements =container?.querySelectorAll<HTMLImageElement>('.lazy');const imgObserver = new IntersectionObserver((entries) => {entries.forEach((entry) => {if (entry.isIntersecting) {const img = entry.target as HTMLImageElement;img.src = img.dataset.src || '';img.classList.remove('lazy');imgObserver.unobserve(img);}});});imgElements?.forEach(function (img) {imgObserver.observe(img);});
}, []);
  • 创建观察器后,使用观察器对所有懒加载 img 元素进行观察,创建观察器时传入的回调函数会在每个 img 元素进入视口时调用。
  • 回调函数的 entries 参数是状态发生变化的元素对象,entry 对象的 isIntersecting 为 true 则说明元素进入了视口。
  • 上面代码中,当元素进入视口后,修改 img 元素的 src 来加载图片,并取消对当前元素的观察。

优点:使用简单,不依赖事件监听,也不需要手动计算元素位置,性能更好。 

本文引用了以下博主的优秀文章 

原文链接


http://www.ppmy.cn/news/1521690.html

相关文章

基于Spring的Uniapp自动更新实现方法

Uniapp自动更新 本文介绍了基于rouyi-uniapp的更新包版本自动推送更新。结合minio和网址下载地址两种方式&#xff0c;计算版本号大小后&#xff0c;可选是否强制更新。 一、表结构和后端版本号检测设计 1、版本更新控制表结构 主要字段和设计思路&#xff1a; fileUrl&…

使用matplotlab绘制多条形图

##黑马程序学习 这种多个条形图放在一起的图形该怎么画呢&#xff1f; 请看以下代码 #横着的条形图 from matplotlib import pyplot as plt import matplotlib#设置显示中文 和 负号 matplotlib.rcParams[font.sans-serif][SimHei] matplotlib.rcParams[axes.unicode_minus]F…

学会这2招,让你轻松提取长视频中的文案!

在当今数字化时代&#xff0c;短视频已成为备受欢迎的内容形式&#xff0c;众多品牌和营销人员借助短视频推广宣传产品。 短视频文案作为短视频内容的关键部分&#xff0c;能够在极短时间内向受众传达品牌信息和产品特点。 不过&#xff0c;短视频文案的提取和创作确实极具挑…

CleanMyMac X2024破解版mac电脑清理工具

今天&#xff0c;我要跟大家分享一个让我彻底告别电脑卡顿的秘密武器——CleanMyMac X。这不仅仅是一款普通的清理工具&#xff0c;它是你电脑的私人健身教练&#xff0c;让电脑焕发青春活力&#xff01; CleanMyMac直装官方版下载地址&#xff1a; http://wm.makeding.com/i…

Xinstall助力App全渠道统计,参数传递下载提升用户体验!

在移动互联网时代&#xff0c;App已成为我们日常生活中不可或缺的一部分。然而&#xff0c;对于App开发者来说&#xff0c;如何有效地推广和运营自己的应用&#xff0c;却是一个不小的挑战。尤其是在面对众多渠道、复杂的数据统计和用户需求多样化的情况下&#xff0c;如何精准…

活动系统开发之采用设计模式与非设计模式的区别-需求整理

用户需求(活动系统)&#xff1a; 1、活动类型&#xff1a;答题、图片展示、签到、抽奖、组团等活动 2、活动介绍&#xff1a; a、答题活动&#xff1a; 第一种是签到后&#xff0c;随机抽取10道题&#xff0c;答对8到就可以抽奖&#xff1b; 第二种是随机抽取一道题&#xff0…

RSS/RFS/RPS

概念 在多核CPU中&#xff0c;有几种方式对网卡接收到到的数据进行分流以提升网络接收处理性能&#xff1a; RSS&#xff08;接收端缩放&#xff0c;Receive Side Scaling&#xff09;是一种网络适配器技术&#xff0c;用于将网络流量分配到多个CPU核上&#xff0c;从而提高并…

Linux操作系统:yum安装报错问题

目录 采用yum命令安装软件或库&#xff0c;报错的解决办法&#xff01; 第1步&#xff1a;检查yum组件 第2步&#xff1a;检查网络 第3步&#xff1a;检查网络防火墙 第4步&#xff1a;将yum源换成国内镜像源 采用yum命令安装软件或库&#xff0c;报错的解决办法&#xff…

macos 使用port查询并安装python2, python3多版本, 设置默认python版本方法

不管是新版macos还是旧版本的macos都可以使用macport这个包管理工具简单方便的在mac上面安装并存多个版本的python, 还可以利用port select --set python python3 来设置默认的python版本等. port search查询可用python安装包 命令 port search --name --line --regex ^pytho…

队列-数据结构

一、队列 FIFO 特点&#xff1a;先进先出&#xff0c;后进后出 允许从一段插入数据&#xff0c;另一端删除数据的线性存储结构 队尾&#xff1a;插入数据 入队 队头&#xff1a;删除数据 出队 管道实质上也是一个队列。 用途&#xff1a;缓存数据&#xff08;主要是避免两…

设置vim的tab宽度

设置vim的tab宽度 [gblocalhost test]$ vim ~/.vimrc set tabstop4 " 设置制表符的宽度为4个空格 set shiftwidth4 " 设置缩进时使用的空格数为4个空格 set expandtab " 将制表符自动转换为空格 set autoindent " 启用自动缩进…

HarmonyOS 开发范式、应用模型

ArkUI框架两种开发范式&#xff1a; 基于ArkTS的声明式开发范式&#xff08;简称“声明式开发范式”&#xff09;兼容JS的类Web开发范式&#xff08;简称“类Web开发范式”&#xff09;。 以下是两种开发范式的简单对比: 开发范式名称 语言生态 UI更新方式 声明式开发范式…

qt5.15.2 模拟LVGL8.3

目录 1.下载需要的东西1.SDL 动态库2.LVGL模拟器源码3.下载lv_drivers4.下载lvgl 2.创建QT例程3.往qt里移植lvgl1.将lv_port_pc_eclipse-release-v8.3文件夹里的文件全部复制到Qt_LVGL_Demo文件夹中2.将lv_drivers和lvgl文件夹复制到Qt_LVGL_Demo3.复制SDL2和lib文件夹 4.配置Q…

OpenCV绘图函数(14)图像上绘制文字的函数putText()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在图像上绘制指定的文本字符串。 cv::putText 函数在图像上绘制指定的文本字符串。无法使用指定字体渲染的符号会被问号&#xff08;?&#xff…

前端请求的路径baseURL怎么来的 ?nodejs解决cors问题的一种方法

背景&#xff1a;后端使用node.js搭建&#xff0c;用的是express 前端请求的路径baseURL怎么来的 &#xff1f; 前后端都在同一台电脑上运行&#xff0c;后端的域名就是localhost&#xff0c;如果使用的是http协议&#xff0c;后端监听的端口号为3000&#xff0c;那么前端请求…

Web3开发与安全:6个月高效学习路径

学习计划概览 总时长&#xff1a;6个月每周学习时间&#xff1a;10-15小时目标&#xff1a;掌握 Solidity 智能合约开发&#xff0c;并具备基本的智能合约安全审计能力。 第一阶段&#xff1a;基础准备&#xff08;第1-2周&#xff09; 1. 区块链基础&#xff08;1周&#x…

随机生成一个圆柱体

随机生成一个圆柱体 import os import random import numpy as np import matplotlib.pyplot as plt def plot_cylinder(center, radius, height, num_points=100):# 生成圆柱体的侧面点坐标theta = np.linspace(0, 2*np.pi, num_points)intervalZ = height/num_pointsindx2 =…

vue3 响应式 API:shallowRef()和shallowReactive()

shallowRef() shallowRef()是一个用于创建浅层响应式引用的函数。它创建一个响应式数据&#xff0c;但只对顶层属性进行响应式处理。 特点&#xff1a; 只跟踪引用值的变化&#xff0c;不关心值内部的属性变化。 <template><div>{{ shallowRefObj }}</div>…

Tortoise-ORM FastAPI integration 中文文档(完整版)

Tortoise-ORM FastAPI integration 中文文档(完整版) 前言 初衷:在学习的时候发现 Tortoise-ORM FastAPI integration 官方文档缺中文版,翻阅英文文档效率低,萌生翻译想法。 本系列旨在原汁原味的翻译 Tortoise-ORM FastAPI integration 官方文档,帮助英语不好的小伙伴快速…

电脑桌面一键整理,高效整理,让你的电脑桌面焕然一新!

电脑桌面整理是一个能够提高工作效率、增强安全性、简化资产管理、改善用户体验的电脑软件。无论是图标管理还是文件整理&#xff0c;通过专业的电脑桌面整理软件都能轻松搞定&#xff0c;有序的管理文件、应用程序。 下面是关于Windows桌面工具的介绍与说明&#xff01; 一、…