`

图片延迟加载的实现 32

阅读更多

转:http://stylechen.com/imglazyload2.html

图片延迟加载也称懒加载,通常应用于图片比较多的网页,如果一个页面图片比较多,且页面高度或宽度有好几屏,页面初次加载时,只显示可视区 域的图片,当页面滚动的时候,图片进入了可视区域再进行加载,这样可以显著的提高页面的加载速度,更少的图片并发请求数也可以减轻服务器的压力。如果用户 仅仅在首屏停留,还可以节省流量。如果TAB中的图片较多,也同样可以应用于TAB中,当触发TAB时再进行图片的加载。

图片延迟加载的原理比较简单,先将图片的真实地址缓存在一个自定义的属性(lazy-src)中,而src地址使用一个1×1的全透明的占位图片来代替,当然占位图片也可以是其他的图片。

1 <img src="images/placeholder.png"  lazy-src="images/realimg.jpg" />

因为是使用javascript来加载图片,如果用户禁用了javascript,可以设置一个替代的方案。

1 <img src="images/placeholder.png"  lazy-src="images/realimg.jpg" alt="" />
2 <noscript><img src="images/realimg.jpg"  alt="" /></noscript>

页面初次加载时获取图片在页面中的位置并缓存(每次取offset的值会引发页面的reflow),计算出可视区域,当图片的位置出现在可视区域中,将src的值替换成真实的地址,此时图片就开始加载了。

当页面滚动的时候,再判断图片已经缓存的位置值是否出现在可视区域内,进行替换src加载。当所有的图片都加载完之后,将相应的触发事件卸载,避免 重复操作引起的内存泄漏。将整个窗口看成是一个大容器,那么也可以在页面中设置一个小容器,在小容器中也同样可以实现图片的延迟加载。

下面是实现的代码,我写成了jQuery插件。

001 (function( $ ){
002 $.fn.imglazyload = function( options ){
003     var o = $.extend({
004                 attr        :   'lazy-src',
005                 container   :   window,
006                 event       :   'scroll',              
007                 fadeIn      :   false,         
008                 threshold   :   0, 
009                 vertical    :   true   
010             }, options ),
011  
012         event = o.event,
013         vertical = o.vertical,
014         container = $( o.container ),
015         threshold = o.threshold,   
016         // 将jQuery对象转换成DOM数组便于操作
017         elems = $.makeArray( $(this) ),    
018         dataName = 'imglazyload_offset',       
019         OFFSET = vertical ? 'top' : 'left',
020         SCROLL = vertical ? 'scrollTop' : 'scrollLeft',        
021         winSize = vertical ? container.height() : container.width(),
022         scrollCoord = container[ SCROLL ](),
023         docSize = winSize + scrollCoord;
024          
025     // 延迟加载的触发器
026     var trigger = {
027  
028         init : function( coord ){
029             return coord >= scrollCoord &&
030                             coord <= ( docSize + threshold );
031         },
032  
033         scroll : function( coord ){
034             var scrollCoord = container[ SCROLL ]();
035             return coord >= scrollCoord &&
036                     coord <= ( winSize + scrollCoord + threshold );
037         },
038          
039         resize : function( coord ){
040             var scrollCoord = container[ SCROLL ](),
041                 winSize = vertical ?
042                             container.height() :
043                             container.width();
044             return coord >= scrollCoord &&
045                    coord <= ( winSize + scrollCoord + threshold );
046         }
047     };
048          
049     var loader = function( triggerElem, event ){
050         var i = 0,
051             isCustom = false,
052             isTrigger, coord, elem, $elem, lazySrc;
053                  
054         // 自定义事件只要触发即可,无需再判断
055         if( event ){
056             if( event !== 'scroll' && event !== 'resize' ){
057                 isCustom = true;
058             }
059         }
060         else{
061             event = 'init';
062         }
063              
064         for( ; i < elems.length; i++ ){ 
065             isTrigger = false;
066             elem = elems[i];
067             $elem = $( elem );
068             lazySrc = $elem.attr( o.attr );
069              
070             if( !lazySrc || elem.src === lazySrc ){
071                 continue;
072             }
073             // 先从缓存获取offset值,缓存中没有才获取计算值,
074             // 将计算值缓存,避免重复获取引起的reflow
075             coord = $elem.data( dataName );
076              
077             if( coord === undefined ){
078                 coord = $elem.offset()[ OFFSET ];
079                 $elem.data( dataName, coord );
080             }
081  
082             isTrigger = isCustom || trigger[ event ]( coord );         
083  
084             if( isTrigger ){
085                 // 加载图片
086                 elem.src = lazySrc;
087                 if( o.fadeIn ){
088                     $elem.hide().fadeIn();
089                 }
090                 // 移除缓存
091                 $elem.removeData( dataName );
092                 // 从DOM数组中移除该DOM
093                 elems.splice( i--, 1 );
094             }
095         }
096  
097         // 所有的图片加载完后卸载触发事件
098         if( !elems.length ){
099             if( triggerElem ){
100                 triggerElem.unbind( event, fire );
101             }
102             else{
103                 container.unbind( o.event, fire );
104             }
105             $( window ).unbind( 'resize', fire );
106             elems = null;
107         }
108          
109     };
110      
111     var fire = function( e ){
112         loader( $(this), e.type );
113     };
114      
115     // 绑定事件
116     container = event === 'scroll' ? container : $( this );
117     container.bind( event, fire );
118     $( window ).bind( 'resize', fire );
119  
120     // 初始化
121     loader();
122  
123     return this;
124 };
125  
126 })( jQuery );

调用:

1 $( 'img' ).imglazyload({
2     event : 'scroll',
3     attr : 'lazy-src'
4 });

默认的调用可以省略所有参数。

1 $( 'img' ).imglazyload();

图片延迟加载的插件API说明:

  • attr string
  • 存放图片真实地址的属性名,与HTML对应,默认是lazy-src。
  • container dom & selector
  • 默认的容器为window,可自定义容器。
  • event stirng
  • 触发图片加载的事件类型,默认为window.onscroll事件
  • fadeIn boolean
  • 是否使用jQuery的fadeIn效果来显示,默认是false。
  • threshold number
  • 页面滚动到离图片还有指定距离的时候就进行加载,默认是0。
  • vertical boolean
  • 是否横向滚动,默认为true(纵向)。
  • loadScript(增强版的功能) boolean
  • 是否无阻塞加载javascript广告图片,默认为false。

图片延迟加载的插件下载地址:http://stylechen.com/wp-content/uploads/download/imglazyload.zip

原载于:雨夜带刀's Blog
本文链接:http://stylechen.com/imglazyload2.html
如需转载请以链接形式注明原载或原文地址。
分享到:
评论

相关推荐

    jquery图片延迟加载

    为了解决这个问题,开发人员引入了“图片延迟加载”技术,jQuery作为一款广泛使用的JavaScript库,提供了实现这一功能的强大工具。本文将深入探讨jQuery图片延迟加载的概念、优势以及实现方法。 **一、什么是图片...

    图片延迟加载的jq

    jQuery.lazyload则是一个基于jQuery的插件,专门用于实现图片延迟加载。 **一、jQuery.lazyload的基本原理** jQuery.lazyload的工作原理是监听滚动事件,当用户滚动页面,即将或已经看到图片时,才开始加载图片。...

    jquery 图片延迟加载

    jQuery作为广泛使用的JavaScript库,提供了实现图片延迟加载的便利方法。 ### 一、什么是图片延迟加载? 图片延迟加载,也称为懒加载,是一种优化网页性能的技术。它使得图片在用户滚动到可视区域时才开始加载,而...

    HTML延迟加载图片 html图片延迟加载技术大全.zip

    通过`$(window).lazyload()`方法,配合适当的配置选项,可以轻松实现图片延迟加载。 3. **Intersection Observer API**:这是一种现代浏览器原生支持的API,用于检测元素是否与视口相交。结合此API,可以创建一个...

    图片延迟加载技术

    图片延迟加载技术是一种优化...综上所述,图片延迟加载技术是通过jQuery等工具实现的一种网页优化策略,旨在提高页面加载速度和用户体验。通过合理的设计和实施,它可以有效减少不必要的数据传输,使网页加载更加高效。

    网页图片延迟加载插件

    在网页开发中,常见的实现图片延迟加载的方式有以下几种: 1. **Intersection Observer API**:这是现代浏览器提供的一种API,用于监听元素何时进入或离开视口。开发者可以通过这个API来判断图片是否在可视区域内,...

    jQuery实现鼠标滚动图片延迟加载效果附源码下载

    本特效没有使用专门的图片延迟加载插件,只需要一小段jQuery代码就实现了图片延迟加载,使用非常方便。在本文后面附有源码下载。 效果展示 源码下载 用到的加载中的图片: 代码如下: &lt;!DOCTYPE html&gt; &lt;...

    图片延迟加载插件

    “图片延迟加载插件”通常是由JavaScript实现的,它可以监控用户的滚动行为,当图片进入视口时,动态地为图片元素插入`src`属性,从而触发图片的加载。这个过程涉及到以下几个关键知识点: 1. **视口检测**:插件...

    jquery.scrollLoading图片延迟加载

    通过理解并运用 jQuery.scrollLoading 插件,开发者可以轻松实现图片延迟加载,提升网页性能,为用户提供更流畅的浏览体验。在实际项目中,还可以结合其他前端性能优化策略,如合并CSS和JavaScript,压缩图片,利用...

    Fish整理图片延迟加载技术

    这是一个基于jQuery的插件,实现了图片延迟加载的功能。jQuery是一个广泛使用的JavaScript库,简化了DOM操作、事件处理和Ajax交互。`jquery.lazyload.js`通过监听滚动事件,判断图片是否进入浏览器的可视区域,如果...

    图片延迟加载

    实现图片延迟加载有多种方法,其中一种常见的做法是使用JavaScript库,例如Lozad.js、Intersection Observer API或者jQuery插件。Lozad.js是一个轻量级的库,它利用Intersection Observer API来检测元素是否在视口中...

    jquery 图片延迟加载插件制作tab选项卡图片异步加载

    通过以上步骤,我们可以创建一个自定义的jQuery图片延迟加载插件,并将其应用于带有tab选项卡的页面,实现图片的异步加载。这不仅可以优化页面加载速度,还可以节省用户的网络流量,提升网页性能和用户体验。在实际...

    jquery实现图片延迟加载过程

    晓甜雨之前给大家也推荐过一款图片延迟加载特效,原文链接如下:jquery实现图片延迟加载和ajax方式加载页面 今天再给大家介绍一款,两者的区别在于前者有个加载的过程,后者则是渐变显示,两者的区别再此,晓甜雨...

    延迟加载js代码下载(包括页面延迟加载以及图片延迟加载)

    图片延迟加载是最常见的应用场景。默认情况下,图片的`src`属性为空或设置为占位符,当图片进入视口时,再用实际的URL替换`src`。jQuery LazyLoad插件就是这样工作的: ```html ``` ```javascript $(".lazy").lazy...

    jquery实现图片延迟加载过程.rar

    下面是一个简单的jQuery图片延迟加载实现步骤: 1. **设置数据源**:首先,将图片的实际URL存储在一个"data-src"属性中,而HTML的"src"属性则设置为一个占位符,如空字符串或小尺寸的预加载图片。 ```html ``` 2...

    图片懒加载(延迟加载)

    图片懒加载,也称为延迟加载或On-Demand Loading,是一种优化网页性能的策略,尤其在图像密集型网站中效果显著。这种技术的核心思想是只在用户滚动到图像时才加载它们,而不是一次性加载所有页面资源。这样可以减少...

    图片延迟加载 lazyload

    jQuery.lazyload 是一个非常流行的 jQuery 插件,专门用于实现图片延迟加载功能。这个插件通过监听滚动事件来判断图片是否进入视口,一旦发现图片进入可视区域,它就会替换占位符,加载真实的图片资源。jQuery.lazy...

    js页面图片延迟加载特效.zip

    实现图片延迟加载通常涉及以下步骤: 1. **图片占位符**:首先,我们需要为每张图片设置一个较小的占位符,通常是与图片宽高比例相同的灰色背景,这将立即显示在页面上,代替实际图片。 2. **JavaScript监听滚动...

    jquery图片预加载延迟加载

    为了实现这种结合,可以首先预加载一部分重要图片,然后对其他图片应用延迟加载: ```javascript $(document).ready(function() { preloadImages(['path/to/image1.jpg', 'path/to/image2.jpg']); // 预加载关键...

Global site tag (gtag.js) - Google Analytics