(七)懒加载预加载

(一)懒加载

1. 什么是懒加载

懒加载,即延迟加载。在访问页面时,先将 img 元素或其他元素的背景图片路径替换为占位图(通常是 1*1px 的小图片),仅当元素进入浏览器可视区域时,才设置其真实的图片路径并显示图片。这有效避免了页面初次加载时一次性请求大量图片资源。

2. 为何使用懒加载

如今很多页面内容丰富、篇幅长且图片众多,如各类商城页面。这些图片体积较大,少则百来 K,多则上兆。若页面载入时一次性加载全部图片,会极大延长页面加载时间,降低用户体验。

3. 懒加载的优点

  • 提升页面加载速度:减少了初始加载时的请求资源数量,让页面更快呈现给用户。

  • 减轻服务器压力:降低了同一时间内服务器需要处理的请求量。

  • 节约流量:用户仅在需要查看图片时才加载,避免不必要的流量消耗。

  • 优化用户体验:快速加载的页面能让用户更流畅地浏览内容。

4. 懒加载的原理

页面中的 img 元素若没有 src 属性,浏览器不会发起图片下载请求。懒加载利用这一特性,先使用占位图填充 img 元素,将真实图片路径存储在自定义属性(如 data-original)中,当元素进入可视区域时,再将自定义属性的值赋给 src 属性,触发图片加载。

5. 懒加载的实现步骤

  1. 存储真实路径:将图片的真实路径存放在自定义属性(如 data-original 或 data-src)中,而非 src 属性。

  2. 判断可视区域:页面加载完成后,实时判断图片是否进入用户的可视区域,若是,则将自定义属性中的真实路径赋值给 src 属性。

6. 懒加载实现方式

html结构

1、 obj.getAttribute("属性名")通过元素节点的属性名称获取属性的值。

2、使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放, dataset 获取自定义属性值的使用

<ul><li><img data-src="./img/img1.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img2.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img3.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img4.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img5.png" src="./img/loading.gif" alt="" /></li></ul>

(第一种)基于元素高度计算

元素距顶部的高度 - 页面被卷去的高度 <= 浏览器可视区的高度)
来判断是否符合我们想要的条件.需要实时监听页面滚动时 图片的高度变化

image.png

<ul><li><img data-src="./img/img1.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img2.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img3.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img4.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img5.png" src="./img/loading.gif" alt="" /></li></ul>
<script>window.onload = function () {const imgs = document.querySelectorAll("img");// 初始化执行lazyLoad(imgs);// 滚动执行window.addEventListener("scroll", function () {lazyLoad(imgs);});function lazyLoad(imgs) {for (let i = 0; i < imgs.length; i++) {const imgoffsetT = imgs[i].offsetTop; // 图片距顶部的高度const wheight = window.innerHeight; // 浏览器可视区的高度const scrollT = document.documentElement.scrollTop || document.body.scrollTop; // 页面被卷去的高度if (imgoffsetT - scrollT <= wheight) {// 判断图片是否将要出现imgs[i].src = imgs[i].dataset.src; // 出现后将自定义地址转为真实地址}}}};
</script>

这种方式通过计算元素距顶部的高度、页面被卷去的高度和浏览器可视区的高度,判断图片是否进入可视区域。需要注意的是,不同浏览器对 document.documentElement.scrollTop 和 document.body.scrollTop 的支持有所差异,因此要同时考虑这两个属性。

(第二种)使用 getBoundingClientRect() 方法

getBoundingClientRect()

——获取元素位置,这个方法没有参数

——用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。

——是DOM元素到浏览器可视范围的距离(不包含文档卷起的部分)。

该函数返回一个Object对象,该对象有6个属性:top,lef,right,bottom,width,height;

<ul><li><img data-src="./img/img1.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img2.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img3.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img4.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img5.png" src="./img/loading.gif" alt="" /></li></ul>
<script>window.onload = function () {const imgs = document.querySelectorAll("img");// 初始调动一次lazyLoad();// 监听滚动时,再调用函数window.addEventListener("scroll", throttle(lazyLoad, 1000), false);// 函数 1: 封装判定图片是否在可视区function isInVisibleArea(imgOne) {const info = imgOne.getBoundingClientRect();// 获取页面可视区的高度,宽度const windowH = window.innerHeight;const windowW = window.innerWidth;// 限定参数在可视区内const res = info.bottom > 0 && info.top < windowH && info.right > 0 && info.left < windowW;return res;}// 函数 2: 封装滚动时重新加载函数function lazyLoad() {for (let i = 0; i < imgs.length; i++) {const imgOne = imgs[i];// 判定是否在可视区内if (isInVisibleArea(imgOne)) {// 替换 src 方法一:// imgOne.src = imgOne.getAttribute("data-src");// 替换 src 方法二:imgOne.src = imgOne.dataset.src;}}}// 函数 3: 节流函数function throttle(fn, time = 250) {let lastTime = null;return function (...args) {const now = Date.now(); // 当前时间if (!lastTime || now - lastTime >= time) {fn.apply(this, args); // 帮助执行函数,改变上下文lastTime = now;}};}};
</script>

getBoundingClientRect() 方法可获取元素相对浏览器视窗的位置信息。为避免滚动事件频繁触发导致性能问题,使用了节流函数 throttle 来限制函数的调用频率。

(第三种)使用 IntersectionObserver

IntersectionObserver(callback)

callback函数会触发两次,元素进入视窗(开始可见时)和元素离开视窗(开始不可见时)都会触发

<ul><li><img data-src="./img/img1.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img2.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img3.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img4.gif" src="./img/loading.gif" alt="" /></li><li><img data-src="./img/img5.png" src="./img/loading.gif" alt="" /></li></ul>
<script>const imgs = document.querySelectorAll("img");const callback = function (res) {// res 是观察的元素数组,info 每个被观察的图片信息res.forEach(function (info) {// isIntersecting 目标是否被观察到,返回布尔值if (info.isIntersecting) {// img 就是当前的图片标签const img = info.target;img.src = img.getAttribute("data-src");// 真实地址替换后取消对它的观察obs.unobserve(img);}});};// 实例化 IntersectionObserverconst obs = new IntersectionObserver(callback);// 遍历 imgs 所有的图片,然后给每个图片添加观察实例imgs.forEach(function (img) {// observe: 被调用的 IntersectionObserver 实例。给每个图片添加观察实例obs.observe(img);});
</script>

IntersectionObserver 是一种更高效的懒加载实现方式,它会在元素进入或离开视窗时触发回调函数。当元素进入视窗时,将真实图片路径赋值给 src 属性,并取消对该元素的观察,避免重复操作。

(二)预加载

1. 什么是预加载

资源预加载是一种性能优化技术,它提前告知浏览器某些资源在未来可能会被使用,并将这些资源提前请求加载到本地。当需要使用这些资源时,可直接从本地缓存中获取,从而提高页面响应速度。

2. 为何使用预加载

对于内容庞大的页面,如果不使用预加载技术,用户可能会长时间看到空白页面,直到所有内容加载完成。预加载可以在页面全部加载之前,提前加载主要内容,减少用户等待时间,提升用户体验。

3. 预加载实现方式

<!-- 需求:实现点击图片,切换下一张图片 -->
<div><p></p><img src="./img/img1.gif" alt="" />
</div>
<script>const imgs = ["./img/img2.gif", "./img/img3.gif", "./img/img4.gif", "./img/img5.png"];const img = document.querySelector("img");const test = document.querySelector("p");// 实现点击切换下一张图片let index = 0;test.innerHTML = "我是第" + (index + 1) + "张图片";img.addEventListener("click", function () {if (index < imgs.length) {img.src = imgs[index];index++;test.innerHTML = "我是第" + (index + 1) + "张图片";} else {alert('没有了');}// 切换图片后,同时让浏览器提前加载下载一张图片if (index < imgs.length) {preLoad(imgs[index]);}});// 调用加载函数,页面一开始就加载数组第一个元素preLoad(imgs[0]);// 封装函数,新建一个 img 标签,然后增加 src 属性,让浏览器加载下一张图片function preLoad(src) {const newImg = new Image();newImg.src = src;}
</script>

上述代码通过点击图片切换显示内容,并在切换后预加载下一张图片。通过创建一个新的 Image 对象并设置其 src 属性,触发浏览器对图片的预加载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23982.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Revisiting Reverse Distillation for Anomaly Detection

重新审视反向蒸馏在异常检测中的应用 文章链接&#xff1a;点这里 源码链接&#xff1a;点这里 前言 此篇文章是在 Anomaly detection via reverse distillation from one-class embedding 这篇的基础上改进创新的。重新审视了反向蒸馏&#xff08;KD&#xff09;这一想法&am…

Windows CMD 命令大全(Complete List of Windows CMD Commands)

Windows CMD 命令大全&#xff1a; Windows CMD 是 Windows 系统内置的命令行工具&#xff0c;用于执行各种命令和管理任务。 称为Command Prompt。它提供了一个通过键入命令来与计算机系统进行交互的方式&#xff0c;类似于早期的DOS操作系统。以下是 CMD 的基础知识和常用命…

hot100-二叉树

二叉树 二叉树递归 相当于这个的顺序来回调换 class Solution {private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null)return res;inorderTraversal(root.left);res.add(root.val);inorde…

【JavaWeb13】了解ES6的核心特性,对于提高JavaScript编程效率有哪些潜在影响?

文章目录 &#x1f30d;一. ES6 新特性❄️1. ES6 基本介绍❄️2. 基本使用2.1 let 声明变量2.2 const 声明常量/只读变量2.3 解构赋值2.4 模板字符串2.5 对象拓展运算符2.6 箭头函数 &#x1f30d;二. Promise❄️1. 基本使用❄️2. 如何解决回调地狱问题2.1回调地狱问题2.2 使…

ROS的action通信——实现阶乘运算(三)

在ROS中除了常见的话题(topic&#xff09;通信、服务(server)通信等方式&#xff0c;还有action通信这一方式&#xff0c;由于可以实时反馈任务完成情况&#xff0c;该通信方式被广泛运用于机器人导航等任务中。本文将通过三个小节的分享&#xff0c;实现基于action通信的阶乘运…

centos系统MBR格式转换成gpt格式 (华为云)

在华为云上的centos7.9系统MBR格式转换成GPT格式的步骤 华为云上关于转换的步骤 这个链接里面 gdisk -g /dev/vda 是不对的&#xff0c;-g参数是新创建一个分区&#xff0c;慎用 自己步骤如下&#xff1a;&#xff08;已经试验过&#xff09; 1、gdisk /dev/sda (这里是盘 不…

【Microsoft PowerPoint for Mac】2分钟配置-MAC一键删除PPT中的所有备注

MAC一键删除PPT中的所有备注 1.搜索自动操作2.点击快速操作3.搜索并运行AppleScript4.输入代码&#xff0c;并选择只应用于Microsoft PowerPoint for Mac【右上角】5. CRTLS保存为“清除当前文稿中的所有备注”&#xff0c;PPT中应用。 MAC没自带&#xff0c;需要自己配置 1.搜…

uni-app 开发 App 、 H5 横屏签名(基于lime-signature)

所用插件&#xff1a;lime-signature 使用到 CSS 特性 绝对定位transform 旋转transform-origin transform 原点 复习一下定位元素&#xff08;相对定位、绝对定位、粘性定位&#xff09; 代码# <template><view class"signature-page"><view clas…

【Linux探索学习】第三十一弹——线程互斥与同步(下):深入理解确保线程安全的机制

线程互斥与同步&#xff08;上&#xff09;&#xff1a;【Linux探索学习】第三十弹——线程互斥与同步&#xff08;上&#xff09;&#xff1a;深入理解线程保证安全的机制-CSDN博客 Linux探索学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?…

《Effective Objective-C》阅读笔记(中)

目录 接口与API设计 用前缀避免命名空间冲突 提供“全能初始化方法” 实现description方法 尽量使用不可变对象 使用清晰而协调的命名方式 方法命名 ​编辑类与协议命名 为私有方法名加前缀 理解OC错误模型 理解NSCopying协议 协议与分类 通过委托与数据源协议进行…

python-leetcode-每日温度

739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; class Solution:def dailyTemperatures(self, temperatures: List[int]) -> List[int]:n len(temperatures)answer [0] * nstack [] # 存储索引for i, temp in enumerate(temperatures):while stack and temperat…

山东大学软件学院nosql实验三

实验题目&#xff1a; 用Java做简单查询(2学时) 实验内容 用API方式&#xff0c;做简单查询。 实验要求 在以下要求中选择至少2个&#xff0c;使用Java语言实现数据查询&#xff0c;最终把数据输出到前端界面。 &#xff08;1&#xff09;找出年龄小于20岁的所有学生 &…

【Linux】初探信号的奥秘

目录 一、引入信号&#xff1a; 1、什么是信号&#xff1a; 二、前后台进程&#xff1a; 三、信号的处理方式&#xff1a; 四、键盘数据与信号&#xff1a; 前言&#xff1a; 在Linux系统编程中&#xff0c;信号&#xff08;Signal&#xff09;是一种至关重要的进程间通信…

Bugku CTF CRYPTO

Bugku CTF CRYPTO 文章目录 Bugku CTF CRYPTO聪明的小羊ok[-<>]散乱的密文.!? 聪明的小羊 描 述: 一只小羊翻过了2个栅栏 fa{fe13f590lg6d46d0d0} 分 析&#xff1a;栅栏密码&#xff0c;分2栏&#xff0c;一个栏里有11个 ①手动解密 f a { f e 1 3 f 5 9 0 l g 6 d 4 …

数据库的基本操作

目录 一、查看所有的数据库&#xff1a; 二、创建数据库&#xff1a; if not exists : 字符编码集&#xff1a; 排序规则&#xff1a; 三、查看创建的库&#xff1a; 四、修改数据库&#xff1a; 五、删除数据库&#xff1a; if exists&#xff1a; 前言&#xff1a; 在…

IDEA集成DeepSeek,通过离线安装解决无法安装Proxy AI插件问题

文章目录 引言一、安装Proxy AI1.1 在线安装Proxy AI1.2 离线安装Proxy AI 二、Proxy AI中配置DeepSeek2.1 配置本地部署的DeepSeek&#xff08;Ollama方式&#xff09;2.2 通过第三方服务商提供的API进行配置 三、效果测试 引言 许多开发者尝试通过安装Proxy AI等插件将AI能力…

Java+SpringBoot+Vue+数据可视化的音乐推荐与可视化平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在互联网技术以日新月异之势迅猛发展的浪潮下&#xff0c;5G 通信技术的普及、云计算能力…

【时时三省】(C语言基础)常量和变量

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 在计算机高级语言中&#xff0c;数据有两种表现形式&#xff1a;常量和变量。 常量 在程序运行过程中&#xff0c;其值不能被改变的量称为常量。数值常量就是数学中的常数。 常用的常量有以…

zabbix故障案例 WEB页面Database error Connection refused

目录 1.思路 2.问题解决 3.其他数据库问题思路 1.思路 当我们遇到 Database error Connection refused的问题的时候一般想到的都是数据库的问题 那我们这时候就顺着这条线索排查 2.问题解决 我们首先先进入数据库 mysql -uzabbix -p123 发现了如下报错 应该是数…

MaxKB+Ollama+DeepSeek1.5B部署知识库

环境信息 练习测试用&#xff0c;所以资源很低&#xff0c;8G显卡。大模型部署在Windows台式机上&#xff0c;MaxKB部署在CentOS虚拟机上。 台式机&#xff1a; 硬件&#xff1a;i7 13900 NV GeForce RTX 3060 Ti 8G显存 32G内存 软件&#xff1a;Windows 11操作系统&…