图片懒加载方案

【高频考点精讲】图片懒加载原理深度解析:如何实现高性能的图片延迟加载方案 🧑‍🏫:全栈老李📅:2025 年 5 月🧑‍💻:前端初学者、进阶开发者🚀:本文由全栈老李原创,转载请注明出处。大家好,我是全栈老李。今天咱们聊聊前端性能优化中一个经典话题——图片懒加载。这玩意儿听起来简单,但真要玩出花样来,里面的门道可不少。 阅读详情

一、scroll事件监听

<img src="default.jpg" data-src="http://www.xxx.com/target.jpg" />
let img = document.getElementsByTagName("img");

let num = img.length;

let count = 0;//计数器,从第一张图片开始计

lazyload();//首次加载别忘了显示图片

window.addEventListener('scroll', throttle(lazyload, 300));//节流

function lazyload() {
  let viewHeight = document.documentElement.clientHeight;//视口高度

  let scrollHeight = document.documentElement.scrollTop || 

document.body.scrollTop;//滚动条卷去的高度

  for(let i = count; i <num; i++) {
    // 元素现在已经出现在视口中

    if(img[i].offsetTop < scrollHeight + viewHeight) {
      if(img[i].getAttribute("src") !== "default.jpg") continue;
      img[i].src = img[i].getAttribute("data-src");
      count ++;
   }
 }
}

二、getBoundingClientRect

function lazyload() {
  for(let i = count; i <num; i++) {
    // 元素现在已经出现在视口中

    if(img[i].getBoundingClientRect().top < 

document.documentElement.clientHeight) {
      if(img[i].getAttribute("src") !== "default.jpg") continue;
      img[i].src = img[i].getAttribute("data-src");
      count ++;
   }
 }
}

三、IntersectionObserver 

let img = document.getElementsByTagName("img");

const observer = new IntersectionObserver(changes => {
  //changes 是被观察的元素集合

  for(let i = 0, len = changes.length; i < len; i++) {
    let change = changes[i];
    // 通过这个属性判断是否在视口中

    if(change.isIntersecting) {
      const imgElement = change.target;
      imgElement.src = imgElement.getAttribute("data-src");
      observer.unobserve(imgElement);
   }
 }
})

Array.from(img).forEach(item => observer.observe(item));

JavaScript实现PC与移动端通用图片懒加载完整方案 HTML5 规范允许开发者在任何元素上添加以data-开头的自定义属性,这些属性不会影响渲染行为,但可通过 JavaScript 轻松访问。data-src正是基于此机制的一种约定俗成的命名方式。// 获取所有带有 data-src 的图片元素// 将 data-src 赋值给 src// 清理标记,避免重复执行});上面这段代码展示了懒加载的基本逻辑:遍历所有带有data-src的<img>元素,判断其是否进入视口,若满足条件则将data-src的值赋给src。 阅读详情

相关推荐

PTA-浙大版 《Python程序设计》 第三章编程题目及答案

博主第一次写优快云的博客,所以排版上可能有些不尽人意,代码部分均为自己的思路,可能复杂或者考虑欠妥,欢迎大家一起讨论~ 第一题:大于身高的平均值 这里用了np数组求得平均数,当然for循环累加也是可以的 import numpy as np data = input().split() data = list(map(int,data)) avg = np.mean(data) for i in data: if i > avg: print(i,end = '

Legendwqs的博客 1万+

两种方法实现图片懒加载

两种方法实现图片懒加载

csD_Dscnnnnnnn的博客 1012

OpenCV学习笔记(25)基于MFC和OpenCV的摄像机定标与立体匹配测试程序(20140505更新)

最近整理了一下这两年一直在用的摄像机定标与立体匹配测试程序,将代码进行了重构,界面也做了调整,分享出来方便有需要的朋友使用。当然我的编程能力有限,程序可能还有各种bug,请大家多多包涵。相关问题欢迎留言或email联系讨论,谢谢! ==================================================================================源码

晨宇思远 5万+

js 懒加载 getBoundingClientRect

首先熟悉一下es5的一个APIRange.getBoundingClientRect()参考MDN兼容性: 返回一个 ClientRect 对象,该对象限定了选定的文档对象的内容,该方法返回了一个矩形,这个矩形包围了该文档对象中所有元素的边界矩形集合 比如一个html元素直接调用此API会得到这样的结果ClientRect{ bottom:3669, height: 523, left: 8,

可遇,好孩子 1410

lammps原子组速度的计算方法

在lammps摩擦、冲击、压痕等模拟过程中,涉及到某个原子组的整体移动,如果要输出这个原子组的整体移动速度,可以使用vcm()函数。下面是一个具体的使用案例,金刚石球在盒子内移动,输出移动过程中金刚石球在x方向的质心速度。vcm()是lammps自带的一个函数,返回原子组质心在设定方向的速度。其中,ID为group-ID,dim为方向,可设置x、y或者z方向。大家好,我是小马老师。

lammps_jiayou的博客 343

020、Sensor 供电设计:AVDD、DVDD、IOVDD 的上电时序与纹波要求

本文总结了图像传感器(Sensor)供电设计中的关键要点与常见问题:1. 三路供电特性差异:AVDD(模拟供电)对纹波最敏感(通常<30mVpp),DVDD需应对大电流瞬态变化,IOVDD需满足MIPI接口电压稳定要求。2. 上电时序至关重要,应遵循"模拟→数字→IO"的启动顺序,时序偏差可能导致初始化失败。3. 纹波控制需合理选择电容组合(如10μF+0.1μF),注意布局走线及电容ESR/ESL特性。4. 调试建议使用示波器多通道测量时序和纹波,重点关注传感器启动瞬间的电源特性。5. 经验教训包括预留设

sundong_81的博客 522

图片懒加载及其实现方式

懒加载-主要目的是作为服务器前端的优化,减少请求数或延迟请求数。也叫延迟加载,指在长网页中延迟加载图像,是一种很好的优化网页性能的方式。常适用于图片很多,页面很长的电商网站。

笑到根本停不下来的Kathy思的博客 2887

手把手教你学Simulink--基于飞行控制与稳定性的场景实例:固定翼无人机的自动起飞与降落控制

本文介绍了使用Simulink对固定翼无人机自动起飞与降落控制系统进行建模与仿真的完整流程。首先构建了包含飞行器动力学模型、控制系统、环境模拟等模块的系统结构,详细阐述了简化动力学方程的推导和实现。重点讲解了PID控制器设计,包括起飞阶段的速度控制和降落阶段的高度控制策略。通过添加环境干扰和输入信号,建立了完整的仿真模型,并利用输出显示模块评估系统性能。该实例为无人机自主控制系统的开发提供了有效的仿真验证方法,有助于优化参数提高飞行稳定性。

MHD0815的博客 4308

原生JS实现图片懒加载之一:Element.getBoundingClientRect()

实际项目开放中,特别是电商项目,由于有大量的图片加载必然会影响性能,所以实现图片的懒加载是非常有必要的。 实现图片懒加载的知识点 标签的data-属性 可视区域的监听 实现图片懒加载的原理 <img alt="loading..." data-src="images/1.jpg"> 当我们监听到图片进入可视区域后,就将data-src到值赋值给src属性 ...

weixin_34037173的博客 529

【2025最新版】ABAP 开发百科全书专栏文章目录(上)

本文汇总了一系列SAP ABAP技术文章,内容涵盖实用技巧合集、函数式编程实践(如Currying、reduce应用)、设计模式实现(如Visitor、Singleton)、动态代理与Mock技术、性能优化方案(如Lazy Loading)、日期处理与内存管理,以及ABAP与JavaScript的编程范式对比。还涉及CDS视图、Fiori字段追踪、单元测试优化等实战经验,深入剖析了ABAP底层机制(如Internal Session、Function Module实现原理),并提供了多种反模式改进方案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2462

手把手教你学Simulink实例:基于Simulink的超级电容器充放电仿真

超级电容器(Supercapacitor)是一种高容量电容器,具有快速充放电能力、长寿命和高功率密度等优点。它在能量存储系统、电动汽车、不间断电源(UPS)等领域有广泛应用。为了更好地理解和设计超级电容器的应用系统,通常需要进行详细的仿真分析。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证超级电容器充放电系统的控制策略。本教程将详细介绍如何使用 Simulink 进行超级电容器充放电的仿真实例。通过本教程,我们详细介绍了如何使用 Simulink 进行超级电容器充放电的仿真实例。

MHD0815的博客 581

浅析图片懒加载(三种实现方法与两种优化方式)

今天我们就来康康图片懒加载(中间会涉及到`节流`的优化问题) 你将了解到`图片懒加载`的实现的三种方法(整体位置比较和视图位置和`observe`) 和优化的两种方式(`节流`和`IntersectionObserver`)

あなたの可愛い41 9938

.Net如何使用Web API实现数据交互?

数据模型代表了要交互的数据结构。例如,假设我们要创建一个简单的图书管理系统,我们可以定义一个Book类作为数据模型。set;set;set;

Code365 257

图片懒加载的四种实现方案

懒加载:延迟加载,对于一个很长的页面,优先加载可视区域的内容,其他部分等进入可视区域时再加载。

前端工程师 · Vue 生态深耕者,专注多端与工程化 9929

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

hexo图片懒加载方案

文章目录配置 自从给hexo+next配置了背景图片之后,发现博客网站加载比较缓慢,就想着给图片添加上懒加载功能。 解决方案也很简单,就是通过依赖hexo-lazyload-image模块。 配置 新增hexo-lazyload-image模块 npm install hexo-lazyload-image --save 在站点配置文件_config.yml增加配置 lazyload:...

周子川的博客 3727

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

关于图片懒加载的几种方案

懒加载,顾名思义,在当前网页,滑动页面到能看到图片的时候再加载图片故问题拆分成两个:如何判断图片出现在了当前视口 (即如何判断我们能够看到图片)如何控制图片的加载本篇文章原文地址: 如何...

全栈修炼 1179

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

首页图片懒加载实现方案解析

图片懒加载技术方案对比 本文对比了5种图片懒加载实现方案:1) IntersectionObserver API(现代推荐方案),2) 传统滚动监听+getBoundingClientRect,3) offsetTop/scrollTop计算,4) CSS content-visibility,5) 第三方库方案。详细分析了各方案的实现原理、代码示例、优缺点及适用场景。推荐现代项目优先使用IntersectionObserver API,兼容性要求高的场景可采用传统滚动监听方案

qq_33254736的博客 1066

图片懒加载实战:两种高效方案对比

图片懒加载技术对比:滚动监听与IntersectionObserver两种实现方式 摘要: 本文详细介绍了图片懒加载技术,对比了滚动监听和IntersectionObserver两种实现方案。滚动监听通过监听scroll事件和计算元素位置实现,兼容性好但性能较低;IntersectionObserver利用浏览器原生API自动检测元素可见性,性能更优但仅支持现代浏览器。文章提供了两种方案的核心代码实现,并针对滚动监听方案给出了节流优化等性能建议。通过懒加载技术可显著提升网页性能,减少初始加载时间,优化用户体

qq_45304848的博客 1163

多种方案实现图片的懒加载

方案1:clientHeight、scrollTop、offsetTop 使用统一的占位图片,当页面滚动到元素的位置之后将默认图片替换掉。 <img src="template.png" data-src="http://cdn.shanguangshipin.com/v_m_v2/e1bad341970243bfb942cbe553b8cf6b.png" /> let img = document.getElementsByTagName("i

sxm666666的博客 169

JS | 详解图片懒加载的6种实现方案

要实现图片的懒加载,核心的方法包括:利用JavaScript监听滚动事件、通过getBoundingClientRect()判断图片是否进入可视区域、使用Intersection Observer API、结合data属性暂存图片地址。在现代浏览器中,推荐使用Intersection Observer API来实现图片的懒加载,因为它相比传统的事件监听方式更为高效且易于维护。

青春木鱼的博客 6110

图片懒加载实现方案

和方案2大同小异,只是浏览器提供了getBoundingClientRect这个方法,是的计算更加方便了。:元素相对于其父元素的顶部内边距的距离。:浏览器可视窗口的高度。:可视窗口滚动过的距离。上述方法的测试实例为。

程序媛的梦工厂 225

爬虫--图片懒加载解决方案

爬虫--图片懒加载解决方案

jcoiwenwfkowe的博客 348

vue图片懒加载插件vue-lazyload监听加载失败事件的解决方案

 对于vue项目而言,图片懒加载是一个常见的图片加载方案,可以优化用户体验,而vue-lazyload则是一个广泛使用的插件。  对于某些业务场景,我们需要监听图片加载失败事件,而后进行相应的处理,然而无论是官方文档还是网络上的解决方案都不直观甚至有错误,开发者不经过一番探索,很难知道如何处理,甚至怀疑该插件是否能监听加载失败事件。笔者经过一番探索,所幸的是,发现该问题终究是能够解决的,现将相关解决方案分享如下。 业务场景 试想这样的场景: 在img标签上,使用v-lazy绑定的图片的地址。图片的地址可能

u012443286的博客 5350

图片懒加载技术详解与多种实现方案

图片懒加载技术通过延迟加载非关键图片资源优化页面性能。核心原理是将真实图片URL存储在data-src属性中,当图片进入可视区域时才加载。实现方案包括:1)传统JavaScript方案,通过监听滚动事件和位置计算触发加载;2)现代Intersection Observer API方案,利用浏览器原生API更高效地监测元素可见性。两种方案都支持预加载、错误处理和性能优化,开发者可根据浏览器兼容性需求选择适合的方案。该技术能显著提升页面加载速度,减少不必要资源请求,改善用户体验。

LYFlied的博客 732

图片懒加载的方案

图片懒加载的方案

JackChan 1147
上一篇: 实现call/apply方法
下一篇: 前端常用设计模式
小蒋小蒋快乐成长
博客等级 码龄9年 2109粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值