JS图片懒加载的优点及实现原理
作者:chenmeijiao 发布时间:2024-04-18 09:45:34
这篇文章主要介绍了JS图片懒加载的优点及实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
图片懒加载优势:
增强用户体验
优化代码
减少http的请求
减少服务器端压力
服务器的按需加载
图片懒加载原理:
先将图片的src设置为同一张图片或者不设置,同时给img标签设置一个特殊属性,例如:data-src用于存放图片的真实预览地址;若图片未进入可视区域时,展示同一张图片或者直接不展示图片,此时就不会发生http请求,当图片进入可视区域时,将data-src上的值赋给src,此时再发送http请求。
关键:判断图片是否进入到可视区域(关键函数)
页可见区域宽: document.body.clientWidth;
网页可见区域高: document.body.clientHeight;
网页可见区域宽: document.body.offsetWidth (包括边线的宽);
网页可见区域高: document.body.offsetHeight (包括边线的宽);
网页正文全文宽: document.body.scrollWidth;
网页正文全文高: document.body.scrollHeight;
网页被卷去的高: document.body.scrollTop;
网页被卷去的左: document.body.scrollLeft;
网页正文部分上: window.screenTop;
网页正文部分左: window.screenLeft;
屏幕分辨率的高: window.screen.height;
屏幕分辨率的宽: window.screen.width;
屏幕可用工作区高度: window.screen.availHeight;
当前元素相对于其 offsetParent 元素的顶部的距离: HTMLElement.offsetTop;
浏览器窗口的视口(viewport)高度(以像素为单位): window.innerHeight; (如果有水平滚动条,也包括滚动条高度)
代码实现
html部分
<div>
<img src="./img/1.jpg" data-src="./img/1.jpg" alt="">
<img src="./img/1.jpg" data-src="./img/2.jpg" alt="">
<img src="./img/1.jpg" data-src="./img/3.jpg" alt="">
<img src="./img/1.jpg" data-src="./img/4.jpg" alt="">
<img src="./img/1.jpg" data-src="./img/5.jpg" alt="">
<img src="./img/1.jpg" data-src="./img/6.jpg" alt="">
<img src="./img/1.jpg" data-src="./img/7.jpg" alt="">
<img src="./img/1.jpg" data-src="./img/8.jpg" alt="">
<img src="./img/1.jpg" data-src="./img/9.jpg" alt="">
<img src="./img/1.jpg" data-src="./img/10.jpg" alt="">
</div>
js部分
window.onload = () => {
// 获取某节点与浏览器顶部的距离
function getTop(e) {
if (!e) return
return e.offsetTop
}
let imgs = document.getElementsByTagName('img')
function lazyLoading(imgs) {
// 可是区域高度
let innerHeight = window.innerHeight;
// 滚动区域高度
let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
for (let i = 0; i < imgs.length; i++) {
// 图片距离顶部的距离大于可视区域和滚动区域之和时加载
if (scrollTop + innerHeight > getTop(imgs[i])) {
imgs[i].src = imgs[i].getAttribute('data-src')
}
}
}
lazyLoading(imgs)
window.onscroll = () => {
lazyLoading(imgs)
}
}
来源:https://www.cnblogs.com/chenmeijiao/p/12055986.html


猜你喜欢
- 使用递归实现words = ['giraffe', 'elephant', 'ant', &
- 前言本节我们讲讲一些简单查询语句示例以及需要注意的地方,简短的内容,深入的理解。EOMONTH在SQL Server 2012的教程示例中,
- 最近线上安全扫描到mysql连接器的一个漏洞,看了一下用的是5.1.47的版本,确实挺久了 建议是升级到8.0.27最新版凡是升级
- Python 多线程的实例详解一)线程基础1、创建线程:thread模块提供了start_new_thread函数,用以创建线程
- 目录1、面向对象基本概念1.1 万物皆对象1.2 面向对象编程1.3 面向对象的特征2、Python面向对象的术语3、Python类的构建3
- 背景:工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人问题:使用python 2.7自带的email库来进行邮件的
- 本文实例讲述了Python中xml和json格式相互转换操作。分享给大家供大家参考,具体如下:Python中xml和json格式是可以互转的
- 组合模式Composite Pattern是什么组合模式是一种结构型模式,它允许你将对象组合成树形结构来表示“部分-整体
- 有时我们需要较为实时的查看服务器上的网卡流量,这里我写了两个小脚本,一个用shell(先写的,一次只能查看一个网卡),另一个用Python(
- 前言由于学校科技立项的项目需要实现Android App端与PHP Web端的简单数据交互的实现,当前场景是Web端使用的是MySql数据库
- ah!其实没有标题说的那么严重!不过下面可是我们开发产品初期的一些血淋淋的案例,更多的安全威胁可以看看北北同学的《python hack》P
- FTP服务器FTP服务器是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。FTP是File Transfer Prot
- 1.使用npm进行初始化在本地创建项目的文件夹名称,如 node_test,并在该文件夹下进行黑窗口执行初始化命令 2. 安装 e
- 今天,跟大家聊聊gin框架中是如何实现分片输出的。主要分以下4点:分片输出的效果图gin实现分片传输代码http分片传输的基础:transf
- math模块# 数学相关模块import mathr = math.floor(3.2) # 向下取整print(r)r = math.ce
- 1.安装Pillowpip install Pillow2.安装tesseract-ocrgithub地址: https://gi
- 纯代码通过神经网络实现线性回归的拟合参考链接中的文章,有错误,我给更正了。并且原文中是需要数据集文件的,我直接给替换成了一个数组,采用直接赋
- 本文实例为大家分享了python实现图片中文字分割的具体代码,供大家参考,具体内容如下1、原始图片(包含数字):结果图:2、原始图片(包含文
- 下面是代码,如果看不懂,建议先把表格的一些<tr><td>的表格原理弄清楚了,就可以了代码如下:<table&
- 复数数据结构在 cpython 当中对于复数的数据结构实现如下所示:typedef struct { double