当前位置: 首页 > news >正文

JavaScript懒加载图像

懒加载图像是一种优化网页性能的技术,它将页面中的图像延迟加载,即在用户需要查看它们之前不会立即加载。这种技术通常用于处理大量或大尺寸图像的网页,特别是那些包含长页面或大量媒体内容的网站。

好处

**1. 加快页面加载速度:**懒加载允许浏览器在初次渲染页面时不必加载所有图像,而只加载用户正在浏览或者即将浏览的部分。这减少了初始页面加载所需的时间,提高了页面的整体加载速度。
**2. 节省带宽和服务器资源:**延迟加载意味着不会同时请求所有图像资源,特别是对于长页面或包含大量图像的页面,这可以显著减少服务器的负载和带宽消耗。
**3. 改善用户体验:**用户在滚动页面时,只有那些即将进入视窗的图像才会被加载,这降低了页面的初次加载时间,使用户能更快速地浏览内容,提升了用户的整体体验。
**4. 降低跳出率:**快速加载页面和减少等待时间可以降低用户的跳出率,增加页面的停留时间,有助于提高页面的SEO排名和转化率。

如何实现

图像元素(标签)的src属性设置为占位符或者空字符串,例如data-src属性来存储实际图像的URL。

实例展示

● src中存储一个模糊的,内存非常小的图片,而data-src中存储的是真实的图片
在这里插入图片描述

● 我们需要做的是通过交叉观察点的方式来懒加载图片,当图片相交时替换src,并去除相应的模糊CSS
● 首先我们获取我们想要的HTML元素存储到变量中

const imgTargets = document.querySelectorAll('img[data-src]');

● 接着将我们观察点的条件和触发相交时候要做的事情的框架写出来

const loadImg = function (entries, observer) {};const imgObserver = new IntersectionObserver(loadImg, {root: null,threshold: 0,
});

● 使用Intersection Observer API观察图像元素的进入视窗情况,并在需要时加载它们。

imgTargets.forEach(img => imgObserver.observe(img));

● 接着我们需要写当图片进入窗口后我们要做的一系列的事情

const loadImg = function (entries, observer) {const [entry] = entries;if (!entry.isIntersecting) return;//替换srcentry.target.src = entry.target.dataset.src;entry.target.addEventListener('load', function () {entry.target.classList.remove('lazy-img');})observer.unobserve(entry.target);
};

注意:将entry.target.classList.remove(‘lazy-img’);放入事件处理程序中的原因是
1. 确保图像加载完成: 在懒加载的情况下,图像的实际加载是延迟的,直到它进入视窗并且浏览器开始加载它。如果直接在 loadImg 函数中执行移除类操作,可能会在图像加载之前移除 lazy-img 类,导致 CSS 动画或其他样式效果不能正常显示。
2. 避免未加载完成时的问题: 如果 classList.remove(‘lazy-img’) 在图像加载之前执行,那么此时浏览器可能尚未设置好图像的 src 属性,也可能导致 CSS 动画或样式应用不正确,因为此时图像可能仍处于加载中状态或者尚未开始加载。
3. 确保顺序正确性: 将移除类操作放在 load 事件处理程序中可以确保在图像加载完成后立即移除 lazy-img 类。这样可以保证在图像展示给用户之前,所有必要的加载和处理步骤都已完成,从而确保用户体验的连贯性和视觉效果的正确性。

如果直接entry.target.classList.remove(‘lazy-img’);直接输出的话,用户网络缓慢的话会导致图片可能从模糊到清晰的事件很长

● 除此之外,为了不让用户感知我们图片的处理过程,我们可以加载边距,让没有滑动到图片之前按我们已经完成了图片的懒加载过程!

const imgObserver = new IntersectionObserver(loadImg, {root: null,threshold: 0,rootMargin: '200px',
});

完整代码如下

//懒加载图像
const imgTargets = document.querySelectorAll('img[data-src]');const loadImg = function (entries, observer) {const [entry] = entries;if (!entry.isIntersecting) return;//替换srcentry.target.src = entry.target.dataset.src;entry.target.addEventListener('load', function () {entry.target.classList.remove('lazy-img');})observer.unobserve(entry.target);
};const imgObserver = new IntersectionObserver(loadImg, {root: null,threshold: 0,rootMargin: '200px',
});imgTargets.forEach(img => imgObserver.observe(img));

在这里插入图片描述

相关文章:

  • Vue移动端地图App:van-uploader导致的卡顿问题
  • 企业级-生成PDF移除异常空白页
  • pycharm配置conda解释器
  • 【SSL 1056】最大子矩阵 (多维DP)
  • 统计信号处理基础 习题解答11-8
  • C语言中宏定义控制日志输出及log库介绍
  • 在大型项目中,怎样有效地组织和管理 SCSS 文件结构以提高开发效率?
  • 米国政府呼吁抛弃 C 和 C++
  • 基于Lua源码开发动态库供lua脚本使用
  • 红黑树插入删除流程(流程图)
  • 记一次小程序渗透
  • 1982Springboot宠物美容院管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目
  • 网络安全筑基篇——反序列化漏洞
  • 二分查找及其变种
  • Visio框图自动带填充色原因及如何取消
  • Brief introduction of how to 'Call, Apply and Bind'
  • Codepen 每日精选(2018-3-25)
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • dva中组件的懒加载
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • es6--symbol
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Intervention/image 图片处理扩展包的安装和使用
  • Java多线程(4):使用线程池执行定时任务
  • Java知识点总结(JavaIO-打印流)
  • Linux中的硬链接与软链接
  • Python_OOP
  • Redis学习笔记 - pipline(流水线、管道)
  • Vue 2.3、2.4 知识点小结
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 关于for循环的简单归纳
  • 看域名解析域名安全对SEO的影响
  • 排序(1):冒泡排序
  • 巧用 TypeScript (一)
  • 我的zsh配置, 2019最新方案
  • 想写好前端,先练好内功
  • 新手搭建网站的主要流程
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 一些关于Rust在2019年的思考
  • 应用生命周期终极 DevOps 工具包
  • 你对linux中grep命令知道多少?
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​浅谈 Linux 中的 core dump 分析方法
  • # 计算机视觉入门
  • #1014 : Trie树
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #include<初见C语言之指针(5)>
  • #pragma pack(1)
  • #在 README.md 中生成项目目录结构
  • $jQuery 重写Alert样式方法
  • (12)Linux 常见的三种进程状态
  • (2)(2.10) LTM telemetry