js开发:原生js实现图片延迟加载

JS实现图片延迟加载 在一些图片比较多的网站,往往会出现这样的问题:由于页面中的图片资源多,加上网速的不给力,导致页面的图片迟迟加载不出来,或者所有的图都是加载到半张的样子,让人非常不爽,这种情况导致了非常差的用户体验,最终会让用户失去耐心,使得该网站的流量流失,现在我们就来探讨一下如何解决这个问题。 阅读详情

js实现图片延迟加载方法一:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
<html>
  <head>
   <title>lazyImage2.html</title>
   <meta http-equiv= "keywords" content= "keyword1,keyword2,keyword3" >
   <meta http-equiv= "description" content= "this is my page" >
   <meta http-equiv= "content-type" content= "text/html; charset=UTF-8" >
   <!--<link rel= "stylesheet" type= "text/css" href= "./styles.css" mce_href= "styles.css" >-->
  </head>
  <body style= "text-align:center" mce_style= "text-align:center" >
  <p>  </p><p> </p><p> </p><p> </p><p> </p>
   <div style= "height:1290px;width:800px;border:1px;background:gray;" ></div>
   <div style= "height:150px;width:800px;border:1px;background:green;" ></div>
   <img class= "lazy" src= "images/sprite.gif" mce_src= "images/sprite.gif" alt= "images/lazyloadImg.jpg" />
   <script type= "text/javascript" ><!--
       var temp = -1; //用来判断是否是向下滚动(向上滚动就不需要判断延迟加载图片了)
       window.onscroll = function () {
       var imgElements = document.getElementsByTagName( "img" );
       var lazyImgArr = new Array();
       var j = 0;
       for ( var i=0; i<imgElements.length; i++) {
        if (imgElements[i].className == "lazy" ){
         lazyImgArr[j++] = imgElements[i];
        }
       }
               var scrollHeight = document.body.scrollTop; //滚动的高度
       var bodyHeight = document.body.offsetHeight; //body(页面)可见区域的总高度
       if (temp < scrollHeight) { //为true表示是向下滚动,否则是向上滚动,不需要执行动作。
        for ( var k=0; k<lazyImgArr.length; k++) {
        var imgTop = lazyImgArr[k].offsetTop; //1305(图片纵坐标)
        if ((imgTop - scrollHeight) <= bodyHeight) {
         lazyImgArr[k].src = lazyImgArr[k].alt;
         lazyImgArr[k].className = "notlazy"
                }
       }
       temp = scrollHeight;
      }
     };
// --></script>
  </body>
</html>

js实现网页图片延时加载方法二:

再没贴代码之前先给大家讲下js实现图片延时加载的原理。

实现原理:

把所有需要延时加载的图片改成如下的格式:

?
1
<img lazy_src= "图片路径" border= "0" />

然后在页面加载时,把所有使用了lazy_src的图片都保存到数组里,然后在滚动时计算可视区域的top,然后把延时加载的图片中top小于当前可视区域(即图片出现在可视区域内)的图片的src的值用lazy_src的来替换(加载图片):

JS代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
lazyLoad = ( function () {
   var map_element = {};
   var element_obj = [];
   var download_count = 0;
   var last_offset = -1;
   var doc_body;
   var doc_element;
   var lazy_load_tag;
   function initVar(tags) {
     doc_body = document.body;
     doc_element = document.compatMode == 'BackCompat' ? doc_body : document.documentElement;
     lazy_load_tag = tags || [ "img" , "iframe" ];
   };
   function initElementMap() {
     var all_element = [];
     //从所有相关元素中找出需要延时加载的元素
     for ( var i = 0,
len = lazy_load_tag.length; i < len; i++) {
       var el = document.getElementsByTagName(lazy_load_tag[i]);
       for ( var j = 0,
len2 = el.length; j < len2; j++) {
         if ( typeof (el[j]) == "object" && el[j].getAttribute( "lazy_src" )) {
           element_obj.push(all_element[key]);
         }
       }
     }
     for ( var i = 0,
len = element_obj.length; i < len; i++) {
       var o_img = element_obj[i];
       var t_index = getAbsoluteTop(o_img); //得到图片相对document的距上距离
       if (map_element[t_index]) {
         map_element[t_index].push(i);
       } else {
         //按距上距离保存一个队列
         var t_array = [];
         t_array[0] = i;
         map_element[t_index] = t_array;
         download_count++; //需要延时加载的图片数量
       }
     }
   };
   function initDownloadListen() {
     if (!download_count) return ;
     var offset = (window.MessageEvent && !document.getBoxObjectFor) ? doc_body.scrollTop : doc_element.scrollTop;
     //可视化区域的offtset=document的高+
     var visio_offset = offset + doc_element.clientHeight;
     if (last_offset == visio_offset) {
       setTimeout(initDownloadListen, 200);
       return ;
     }
     last_offset = visio_offset;
     var visio_height = doc_element.clientHeight;
     var img_show_height = visio_height + offset;
     for ( var key in map_element) {
       if (img_show_height > key) {
         var t_o = map_element[key];
         var img_vl = t_o.length;
         for ( var l = 0; l < img_vl; l++) {
           element_obj[t_o[l]].src = element_obj[t_o[l]].getAttribute( "lazy_src" );
         }
         delete map_element[key];
         download_count--;
       }
     }
     setTimeout(initDownloadListen, 200);
   };
   function getAbsoluteTop(element) {
     if (arguments.length != 1 || element == null ) {
       return null ;
     }
     var offsetTop = element.offsetTop;
     while (element = element.offsetParent) {
       offsetTop += element.offsetTop;
     }
     return offsetTop;
   }
   function init(tags) {
     initVar(tags);
     initElementMap();
     initDownloadListen();
   };
   return {
     init: init
   }
})();

使用方法:把页面上需要延时加载的图片src改成为lazy_src,然后把上面的js放到body最后面,然后调用:lazyLoad.init();
调戏的方法可以使用firebug来查看一时图片是否是延时加载。

另外:

如果你的页面上存在有内容切换的栏目的话,可能在切换时切换的内容里的图片可能会不显示,处理的方法是在内容时单独图片加载处理,如:

?
1
2
3
4
5
///切换内容的代码…
chlid.find( "img[init_src]" ).each( function (){
   $( this ).attr( "src" ,$( this ).attr( "init_src" ));
   $( this ).removeAttr( "init_src" );
  });

原生态js实现图片延时加载方法三:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<!doctype html>
<html>
<head>
<meta http-equiv= "Content-Type" content= "text/html; charset=utf-8" />
<title>通过原生js延迟加载图片</title>
<style type= "text/css" >
     div{width:100px;height:100px;background: #F00;margin-bottom:30px}
</style>
</head>
<body>
   " src= "a.gif" /></div>
   " src= "a.gif" /></div>
   " src= "a.gif" /></div>
   " src= "a.gif" /></div>
</body>
//以上图片测试时可用复制多点
<script type= "text/javascript" >
     ( function (){
         //common
         function tagName(tagName){
             return document.getElementsByTagName(tagName);
         }
         function $(id){
             return document.getElementById(id);
         }
         function addEvent(obj,type,func){
             if (obj.addEventListener){
                 obj.addEventListener(type,func, false );   
             } else if (obj.attachEvent){
                 obj.attachEvent( 'on' +type,func);
             }
         }
         //这里可以按照需要配置些参数
         var v={
             eleGroup: null ,
             eleTop: null ,
             eleHeight: null ,
             screenHeight: null ,
             visibleHeight: null ,
             scrollHeight: null ,
             scrolloverHeight: null ,
             limitHeight: null
         }
         //对数据进行初始化
         function init(element){
             v.eleGroup=tagName(element)
             screenHeight=document.documentElement.clientHeight;
             scrolloverHeight=document.body.scrollTop;
             for ( var i=0,j=v.eleGroup.length;i<j;i++){
                 if (v.eleGroup[i].offsetTop<=screenHeight && v.eleGroup[i].getAttribute( 'data-url' )){
                     v.eleGroup[i].setAttribute( 'src' ,v.eleGroup[i].getAttribute( 'data-url' ));
                     v.eleGroup[i].removeAttribute( 'data-url' )
                 }   
             }
         }
         function lazyLoad(){
             if (document.body.scrollTop == 0){
                 limitHeight=document.documentElement.scrollTop+document.documentElement.clientHeight;
             } else {
                 limitHeight=document.body.scrollTop+document.documentElement.clientHeight;
             }
             for ( var i=0,j=v.eleGroup.length;i<j;i++){
                 if (v.eleGroup[i].offsetTop<=limitHeight && v.eleGroup[i].getAttribute( 'data-url' )){
                     v.eleGroup[i].src=v.eleGroup[i].getAttribute( 'data-url' );
                     v.eleGroup[i].removeAttribute( 'data-url' )
                 }   
             }
         }
         init( 'img' )
         addEvent(window, 'scroll' ,lazyLoad);
     })()        
</script>
</html>
原生JS实现炫酷弹性相册动画效果 随着移动端和响应式设计的普及,用户对网页交互体验的要求日益提升。弹性相册作为一种视觉与交互兼具的展示形式,广泛应用于摄影网站、社交平台和个人博客中。本文采用HTML5、CSS3与原生JavaScript构建一个高性能、可扩展的弹性相册系统,充分发挥现代浏览器在动画、布局与事件处理方面的优势。通过模块化开发思路与性能优化策略,实现图片的弹性缩放、流畅交互与多设备适配,为开发者提供一套完整、可复用的解决方案。 阅读详情

相关推荐

JS实现图片延迟加载(缓冲),非常实用

JS实现图片延迟加载(缓冲),非常实用.注意:页面上如果有滑动门等元素,可能显示不全。因情况需要调一下。总体来说不错!

使用jquery插件实现图片延迟加载技术

<br />有时我们看到一些大型网站,页面如果有很多图片的时候,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页面加载的速度,对于比较长的页面来说,这个方案是比较好的。<br />这里推荐使用 jquery图片延迟 加载插件jquery.lazyload实现图片延迟 加载提高网站打开速度<br />下载地址:http://www.appelsiini.net/download/jquery.lazyload.js<br

662

原生js延迟加载

原生js面向对象写的延迟加载效果,自动播放轮播图,无缝滚动三个效果页面。

JS实现图片延迟加载(图片懒加载)

1

Rossbort的博客 1293

ads传统功放设计笔记(3)

传统功放设计的流程一般包括以下这些步骤: 1、明确设计目标 2、选择功放管子 3、确定静态工作点 4、设计偏置电路 5、判断稳定性 6、负载与源牵引 7、输入输出阻抗匹配 8、原理图优化 9、大信号仿真 10、版图设计 11、版图联合仿真 12、pcb设计 第二节我们设计仿真了功放的原理图。之后我们需要对版图进行设计和仿真。 10、版图设计 首先将S参数控件都打叉,还要去掉电源、源负载阻抗、地、芯片、电容。在原先电容和芯片的位置加上gap,设置好长度和间隔。之后在电源引脚、输入输出引脚和隔离的两端加上端口。

qq_40995480的博客 6025

Amos实战:如何用Bootstrap法检验中介效应?附完整操作步骤

本文详细介绍了如何使用Amos软件通过Bootstrap法检验中介效应,包括模型设定、参数配置和结果解读。Bootstrap方法因其不依赖正态分布假设、统计功效高等优势,成为中介效应分析的首选方法。文章提供了完整的操作步骤和实用建议,帮助研究者准确评估变量间的中介作用机制。

zz67890的博客 1438

js实现图片的延迟加载

      项目进展得差不多了,闲得蛋疼。开始关注各种高性能WEB技术。看到一篇博客说土豆网的图片是延迟加载的。原理是这样:页面可见区域以下的图片先不加载,等到用户向下滚动到图片位置时,再进行加载。这样做的好处在哪里?——当页面有好几屏内容时,有可能用户只看前几屏的内容,这样我们就可以只加载用户需要看的图片,减少服务器向用户浏览器发送图片文件所产生的负荷。于是我打开了土豆网,没发现它的这种功能。但是一想,这确实是挺有意思的。这跟人人网的分批加载新鲜事的有异曲同工之妙,于是想自己coding实现一下。以下是偶

im110的专栏 1万+

第1.1节 构网型 vs. 跟网型:根本区别与技术原理

构网型与跟网型变流器的本质区别在于控制哲学与等效模型。跟网型变流器采用"电压跟随,电流注入"策略,等效为受控电流源,依赖电网电压作为参考,在弱电网下存在稳定性问题。构网型变流器采用"自主同步,电压构建"策略,等效为受控电压源,能主动构建电压和频率,具备自主运行、黑启动和电网支撑能力。两者的核心差异体现在同步机制、电网依赖性、故障行为和系统支撑等方面。构网型变流器更适合高比例新能源、弱电网和微电网场景,是未来电力系统的重要发展方向。

技术工作者 1394

JS 实现图片延迟加载(懒加载)

实现原理 结构中,我们使用一个盒子包裹着图片(图片不显示的时候,可以先占据着这个位置,并且设置默认背景图或背景颜色) 最开始,img 的 src 设置默认背景图,并把图片真实地址放到自定义属性中(比如:data-src ) 当 JS 监听到该图片元素进入可视窗口时,将自定义属性中的地址放到 src 属性中,达到懒加载效果 作用: 防止页面一次性向服务器发送大量请求,导致页面卡顿 全部加载会耗费大量流量 预备知识: clientHeight:当前盒子可视区域的高度(height+上下padding

雪急飞绪博客 1466

R语言实战:Scheirer–Ray–Hare检验在非正态重复测量数据分析中的应用

本文详细介绍了当重复测量数据不满足正态分布假设时,如何利用R语言中的Scheirer–Ray–Hare检验进行数据分析。该检验作为非参数方法,无需数据服从正态分布或方差齐性,适用于分析组间差异、时间效应及其交互作用。文章通过实战案例,从环境搭建、数据准备、检验执行到结果解读与可视化,提供了完整的操作指南,帮助研究者有效处理心理学、医学等领域的复杂实验数据。

salt9的博客 780

SAP PP模块 MRP配置实战:5步完成工厂级物料需求计划激活

本文详细介绍了SAP PP模块中物料需求计划(MRP)的工厂级配置实战,通过5个关键步骤从基础环境准备到最终激活。内容涵盖SPRO后台配置、MRP控制者定义、主数据设置及核心参数调整,帮助顾问快速掌握MRP配置清单的完整流程,确保物料需求计划的高效运行。

weixin_30431445的博客 340

js图片延迟加载

什么是图片延迟加载? 也叫懒加载。 当页面有多屏的时候,页面中的图片比较多。 那么,在页面载入完毕的时候,并不会把所有的图片都加载进来。 而是当用户拖动滚动条的时候,图片要进入用户的视野了,才开始加载对应位置的图片。 有什么用? 主要是为了提升网站的性能,节省流量(网站和用户)。 如何实现 如果的开发的时候,实现的方式其实有很多相应的插件。 原

土家稀哥 775

奇迹mu服务端DATA文件解析:从基础配置到高级玩法

本文深入解析奇迹MU服务端DATA文件的核心配置与高级玩法,涵盖基础设置、怪物AI系统、技能战斗机制、副本事件管理及物品商城定制。通过详细示例和实用技巧,帮助开发者掌握从经验倍率调整到动态事件触发的全方位配置方法,实现个性化的私服搭建与运营。

weixin_29254673的博客 529

98JS原生:多图片延迟加载

有时一个网页很长,如果用户一打开网页,我们就把所有图片给他加载下来,那么如果用户看不到底就关闭了这个网页,那么就会造成性能的浪费。因此,用户下拉到哪个位置,我们就下载到哪个位置,这就是延迟加载。本实例:当图片所在位置的1/3以上暴露在窗口时,才加载这张图片。```html:run<!DOCTYPE html><html lang="en"><head> &...

weixin_30446613的博客 186

Unity 实战项目 ☀️| 只用一个脚本做一个 刮刮乐 案例,一不小心刮出来一个女朋友!【学习娱乐一下】

只用一个脚本做一个刮刮乐,一不小心刮出来一个女朋友!【学习娱乐一下!】

努力前行,总会成为自己心中的那道光 23万+

CAPL学习之路-关键字

在capl中,关键字具有特殊的含义和用途,因此,不得将关键字用作变量或函数的名称 声明数据类型的关键字 可以用不同的关键字,声明或引用不同类型的数据 byte 声明一个字节的变量 word 声明两个字节的变量 dword 声明四个字节的变量 int 声明两个字节的整数 long 声明四个字节的变量 qword 声明八个字节的变量 char 声明一个字符串 float 声明一个浮点数,8个字节 double 声明一个浮点数,8个字节 定义一个结构体或枚举类型 struct struct Data { .

jasonj333 6107

JavaScript中实现延迟加载的技术

在JavaScript中,可以通过不同的方法实现延迟加载。然而,两种广泛使用的技术是使用Intersection Observer API来延迟加载图像,以及在滚动事件中实现内容的延迟加载。

u013951056的专栏 667

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

基于原生js的图片延迟加载

当页面图片比较多的时候,我们通常会做一个延迟加载,避免页面打开时一下子的请求数太多,加载过慢影响用户体验。 如果项目用了jquery框架,则可以直接用 jquery.lazyload.可在jquery官网下载到。 如果项目是基于原生js的,可以参考以下: &lt;!doctype html&gt; &lt;html lang="en"&gt; &lt;head&gt; &l...

weixin_34377065的博客 104

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

多图片网页实现延迟加载图片

多图片页面的延迟加载 *{ padding:0; margin:0; } img{ width: 300px; height: 200px; display: block; } //原生JS方法 var test={};

sonnylight的博客 3874

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

img加载本地图片_图像延迟加载

做了个图片素材网站,需要用到瀑布流展示加延时加载展示,当图片进入可视区域的时候才进行加载,这样可以提升网页的加载速度,还能节省服务器的网络带宽来改善用户体验。什么时延时加载?延迟加载图像是指Web和应用程序开发中的一组技术,这些技术可将页面上图像的加载推迟到以后的某个时间点(当实际需要这些图像时),而不是预先加载它们,可以称它们为非关键资源,就图像来说,“非关键”通常是指“屏幕外”的内容。为什么要...

weixin_39655993的博客 1252

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

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

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

如何用原生JavaScript实现懒加载?这5种方法你必须掌握

掌握JavaScript懒加载实现技巧,提升网页性能与用户体验。本文介绍5种原生JS实现方式,涵盖图片延迟加载、Intersection Observer应用及兼容方案,适用于长页面和移动端开发,有效减少资源消耗,值得收藏。

CompiTide的博客 784

progressive-image.js与原生懒加载对比:哪个更适合你的项目?

progressive-image.js是一款实现渐进式图片加载效果的轻量级工具,类似于Facebook和Medium上常见的图片加载方式。它通过先显示极小的模糊图片,当元素滚动到视图中时再替换为高分辨率图片,为用户提供流畅的视觉体验。而原生懒加载则是现代浏览器内置的图片延迟加载功能,无需额外JavaScript即可实现。本文将深入对比这两种方案的优缺点,帮助你为项目做出最佳选择。 ## 🚀

gitblog_01032的博客 833

【前端】实现页面截图详解:原生 JS + Vue/React/Angular 实现方案

本文详细介绍了前端实现页面截图的技术方案,涵盖了原生JS和主流框架(Vue/React/Angular)的实现方法。核心技术原理是通过html2canvas或dom-to-image库将DOM元素转换为Canvas或图片。文中提供了完整代码示例,包括HTML+JS原生实现、Vue组合式API组件、React函数组件和Angular服务注入方式,并解释了核心API的使用方法。此外还介绍了截图功能的应用场景、设计原则和最佳实践,如兼容性处理、性能优化和样式还原等。这些方案能满足生成分享图、报告导出、用户反馈等。

silverclayz的技术分享 1580

纯原生JS图片懒加载分享

概念 什么是懒加载 懒加载顾名思义突出一个“懒”字,懒字就是拖延的意思,说白就是延迟加载。比如我们进入一个新的页面进行加载的时候,这个页面很长超过了屏幕可视区域的时候,那么懒加载就会优先加载我们可视区域可见的内容,剩余部分是当进入到可视区域之后再进行加载。 为什么要懒加载? 懒加载是一种优化网页性能的一种方式,它极大的提高了用户的体验。举个栗子:就拿图片来说,一个网站,单个网页的页面上“图片”是构成页面主体的一个极大部分,但是在现在一张图片的大小超过几兆是一件很正常的事,那么就需要注意

qq_45335911的博客 206

原生Js页面滚动延迟加载图片 - dtdxrk

原帖地址:http://www.cnblogs.com/dtdxrk/p/3151001.html原理和过程1.页面滚动加载事件2.获取元素在页面里的top值 根据滚动条的位置 判断何时显示图片3.获取元素集合 加载过的图片从集合里删除 效果预览:http://jsfiddle.net/dtdxrk/SkYNq/embedded/result/ 1 &lt;!DOCTYPE html&gt;...

我的技术资料收集库 159
上一篇: js开发:正则实例详解
下一篇: css3开发:px em rem详解
Generon
博客等级 码龄11年 135粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值