图片延迟加载也称懒加载,通常应用于图片比较多的网页,如果一个页面图片比较多,且页面高度或宽度有好几屏,页面初次加载时,只显示可视区 域的图片,当页面滚动的时候,图片进入了可视区域再进行加载,这样可以显著的提高页面的加载速度,更少的图片并发请求数也可以减轻服务器的压力。如果用户 仅仅在首屏停留,还可以节省流量。如果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
相关推荐
为了解决这个问题,开发人员引入了“图片延迟加载”技术,jQuery作为一款广泛使用的JavaScript库,提供了实现这一功能的强大工具。本文将深入探讨jQuery图片延迟加载的概念、优势以及实现方法。 **一、什么是图片...
jQuery.lazyload则是一个基于jQuery的插件,专门用于实现图片延迟加载。 **一、jQuery.lazyload的基本原理** jQuery.lazyload的工作原理是监听滚动事件,当用户滚动页面,即将或已经看到图片时,才开始加载图片。...
jQuery作为广泛使用的JavaScript库,提供了实现图片延迟加载的便利方法。 ### 一、什么是图片延迟加载? 图片延迟加载,也称为懒加载,是一种优化网页性能的技术。它使得图片在用户滚动到可视区域时才开始加载,而...
通过`$(window).lazyload()`方法,配合适当的配置选项,可以轻松实现图片延迟加载。 3. **Intersection Observer API**:这是一种现代浏览器原生支持的API,用于检测元素是否与视口相交。结合此API,可以创建一个...
图片延迟加载技术是一种优化...综上所述,图片延迟加载技术是通过jQuery等工具实现的一种网页优化策略,旨在提高页面加载速度和用户体验。通过合理的设计和实施,它可以有效减少不必要的数据传输,使网页加载更加高效。
在网页开发中,常见的实现图片延迟加载的方式有以下几种: 1. **Intersection Observer API**:这是现代浏览器提供的一种API,用于监听元素何时进入或离开视口。开发者可以通过这个API来判断图片是否在可视区域内,...
本特效没有使用专门的图片延迟加载插件,只需要一小段jQuery代码就实现了图片延迟加载,使用非常方便。在本文后面附有源码下载。 效果展示 源码下载 用到的加载中的图片: 代码如下: <!DOCTYPE html> <...
“图片延迟加载插件”通常是由JavaScript实现的,它可以监控用户的滚动行为,当图片进入视口时,动态地为图片元素插入`src`属性,从而触发图片的加载。这个过程涉及到以下几个关键知识点: 1. **视口检测**:插件...
通过理解并运用 jQuery.scrollLoading 插件,开发者可以轻松实现图片延迟加载,提升网页性能,为用户提供更流畅的浏览体验。在实际项目中,还可以结合其他前端性能优化策略,如合并CSS和JavaScript,压缩图片,利用...
这是一个基于jQuery的插件,实现了图片延迟加载的功能。jQuery是一个广泛使用的JavaScript库,简化了DOM操作、事件处理和Ajax交互。`jquery.lazyload.js`通过监听滚动事件,判断图片是否进入浏览器的可视区域,如果...
实现图片延迟加载有多种方法,其中一种常见的做法是使用JavaScript库,例如Lozad.js、Intersection Observer API或者jQuery插件。Lozad.js是一个轻量级的库,它利用Intersection Observer API来检测元素是否在视口中...
通过以上步骤,我们可以创建一个自定义的jQuery图片延迟加载插件,并将其应用于带有tab选项卡的页面,实现图片的异步加载。这不仅可以优化页面加载速度,还可以节省用户的网络流量,提升网页性能和用户体验。在实际...
晓甜雨之前给大家也推荐过一款图片延迟加载特效,原文链接如下:jquery实现图片延迟加载和ajax方式加载页面 今天再给大家介绍一款,两者的区别在于前者有个加载的过程,后者则是渐变显示,两者的区别再此,晓甜雨...
图片延迟加载是最常见的应用场景。默认情况下,图片的`src`属性为空或设置为占位符,当图片进入视口时,再用实际的URL替换`src`。jQuery LazyLoad插件就是这样工作的: ```html ``` ```javascript $(".lazy").lazy...
下面是一个简单的jQuery图片延迟加载实现步骤: 1. **设置数据源**:首先,将图片的实际URL存储在一个"data-src"属性中,而HTML的"src"属性则设置为一个占位符,如空字符串或小尺寸的预加载图片。 ```html ``` 2...
图片懒加载,也称为延迟加载或On-Demand Loading,是一种优化网页性能的策略,尤其在图像密集型网站中效果显著。这种技术的核心思想是只在用户滚动到图像时才加载它们,而不是一次性加载所有页面资源。这样可以减少...
jQuery.lazyload 是一个非常流行的 jQuery 插件,专门用于实现图片延迟加载功能。这个插件通过监听滚动事件来判断图片是否进入视口,一旦发现图片进入可视区域,它就会替换占位符,加载真实的图片资源。jQuery.lazy...
实现图片延迟加载通常涉及以下步骤: 1. **图片占位符**:首先,我们需要为每张图片设置一个较小的占位符,通常是与图片宽高比例相同的灰色背景,这将立即显示在页面上,代替实际图片。 2. **JavaScript监听滚动...
为了实现这种结合,可以首先预加载一部分重要图片,然后对其他图片应用延迟加载: ```javascript $(document).ready(function() { preloadImages(['path/to/image1.jpg', 'path/to/image2.jpg']); // 预加载关键...