Le chargement paresseux des images est parfois utilisé dans les projets, alors quels sont les avantages du chargement paresseux ?
Je pense qu'il y a deux points principaux. Le premier est que retarder le chargement des images dans de longues pages contenant de nombreuses images volumineuses peut accélérer le chargement des pages ; le second est de contribuer à réduire la charge sur le serveur ;
Ce qui suit présente le plug-in de chargement paresseux jquery.lazyload.js couramment utilisé et comment implémenter un plug-in de chargement paresseux.
1 : plug-in jquery.lazyload.js
lazyload est un plug-in de chargement paresseux écrit par jQuery. Les images en dehors de la zone visible du navigateur ne seront pas chargées tant que le. l'utilisateur fait défiler la page là où il se trouve. C'est exactement le contraire de la façon dont le préchargement de l'image est géré.
Principe de mise en œuvre
Premièrement, l'élément img sélectionné est lié à un événement d'apparition (traitement de l'img pour afficher l'adresse réelle de l'image), afin que l'événement puisse être déclenché lorsque les conditions sont remplies. à l'avenir ;
Il existe une configuration d'attribut de conteneur dans l'objet de configuration, qui est par défaut window. Si l'élément img est dans la fenêtre d'affichage du conteneur, l'événement d'apparition est déclenché ; Afin de déterminer si l'élément img se trouve dans la plage de la fenêtre d'affichage du conteneur, il existe les quatre méthodes suivantes :
$.belowthefold = function(element, settings) {}; // 在视口下方$.rightoffold = function(element, settings) {}; // 在视口右方$.abovethetop = function(element, settings) {}; // 在视口上方$.leftofbegin = function(element, settings) {}; // 在视口左方 Copier après la connexion
Utilisation spécifique
1.
Puisque lazyload repose sur jquery, toutes les pages Vous devez introduire jquery, comme suit :
<script src="jquery.js?1.1.11"></script><script src="jquery.lazyload.js?1.1.11"></script> Copier après la connexion
Méthode d'écriture de base :
<img class="lazy" data-original="img/example.jpg" width="640" height="480">$(function() {
$("img.lazy").lazyload();
}); Copier après la connexion
L'attribut data-original stocke le véritable chemin de l'URL de l'image.
Conseils : Vous devez définir la largeur ou la hauteur de l'image en CSS, sinon le plugin risque de ne pas fonctionner correctement.
Définir le seuil
Par défaut, l'image sera chargée lorsqu'elle apparaît à l'écran. Si vous souhaitez charger l'image à l'avance, vous pouvez définir l'option de seuil, définir le. seuil à 200 pour que l'image soit à 200 de l'écran. Les pixels sont chargés à l'avance.
$("img.lazy").lazyload({
threshold : 200}); Copier après la connexion
Définir l'événement pour déclencher le chargement
L'événement peut être n'importe quel événement jQuery, tel que : clic et survol de la souris. Vous pouvez également utiliser des événements personnalisés, tels que. : sportif et foobar Par défaut, ils attendent que l'utilisateur fasse défiler jusqu'à l'emplacement de l'image dans la fenêtre. Pour empêcher le chargement de l'image jusqu'à ce que l'image d'espace réservé grise soit cliquée, vous pouvez faire ceci :
<.>
Bien sûr, vous pouvez également utiliser la méthode suivante pour implémenter le chargement paresseux :
$("img.lazy").lazyload({
event : "click"}); Copier après la connexion
C'est-à-dire 5 secondes après le chargement de la page, paresseux le chargement de l’image sera effectué.
$(function() {
$("img.lazy").lazyload({
event : "sporty"});
});
$(window).bind("load", function() {var timeout = setTimeout(function() {
$("img.lazy").trigger("sporty")
}, 5000);
}); Copier après la connexion
Effet de chargement paresseux
Lorsque l'image est complètement chargée, le plug-in utilise la méthode show() par défaut pour afficher l'image. En fait, vous pouvez utiliser tous les effets spéciaux que vous souhaitez. à traiter. Ci-dessous Le code utilise l'effet FadeIn :
Comment utiliser les navigateurs qui ne prennent pas en charge JavaScript
$("img.lazy").lazyload({
effect : "fadeIn"}); Copier après la connexion
JavaScript est activé dans presque tous les navigateurs. vous pouvez toujours espérer pouvoir afficher des images réelles sur des clients qui ne prennent pas en charge JavaScript. Pour dégrader correctement lorsque le navigateur ne prend pas en charge JavaScript, vous pouvez écrire le fragment d'image réel dans la balise
.
Les espaces réservés peuvent être masqués via CSS :
<img class="lazy" data-original="img/example.jpg" width="640" heigh="480"><noscript><img src="img/example.jpg" width="640" heigh="480"></noscript> Copier après la connexion
Dans les navigateurs prenant en charge JavaScript, vous devez afficher l'espace réservé lorsqu'il est prêt , ce qui peut être fait en même temps que l'initialisation du plugin.
.lazy {
display: none;
} Copier après la connexion
Configurer un conteneur d'images chargé paresseusement
$("img.lazy").show().lazyload(); Copier après la connexion
Vous pouvez utiliser le plugin sur les images dans des conteneurs déroulants, tels que les éléments DIV avec des barres de défilement dont vous avez besoin. Il vous suffit de définir le conteneur comme un objet jQuery et de le transmettre en paramètre à la méthode d'initialisation :
Lorsque les images ne sont pas disposées dans l'ordre
#container {
height: 600px;
overflow: scroll;
}
$("img.lazy").lazyload({
container: $("#container")
}); Copier après la connexion
Lorsque la page défile, Lazy Load parcourra les images chargées. Dans la boucle, il est vérifié si l'image est dans la zone visible. Par défaut, la boucle s'arrête lorsque la première image n'est pas dans la zone visible. est trouvé. L'image est considérée comme distribuée en continu et l'image est dans la page. L'ordre est le même que dans le code HTML. Mais dans certaines mises en page, cette hypothèse n'est pas vraie. Cependant, vous pouvez contrôler le chargement. comportement via l’option faillimit.
Définissez la limite d'échec sur 10 afin que le plug-in arrête la recherche uniquement lorsqu'il trouve 10 images qui ne sont pas dans la zone visible. Si vous avez une mise en page misérable, veuillez définir ce paramètre plus haut.
$("img.lazy").lazyload({
failure_limit : 10}); Copier après la connexion
Configurer pour charger les images cachées
Il peut y avoir de nombreuses images cachées enfouies sur votre page. Par exemple, le plug-in est utilisé pour filtrer la liste, et vous pouvez modifier à tout moment l'affichage des images. chaque élément de la liste. Pour améliorer les performances, Lazy Load ignore les images cachées par défaut. Si vous souhaitez charger des images cachées, définissez skip_invisible sur false.
Code source
$("img.lazy").lazyload({
skip_invisible : true}); Copier après la connexion
Adresse officielle du site Web :
Deux : écriture manuscrite d'un simple plug-in de chargement paresseux -in
/*!
* Lazy Load - jQuery plugin for lazy loading images
*
* Copyright (c) 2007-2015 Mika Tuupola
*
* Licensed under the MIT license:
*
*
* Project home:
*
*
* Version: 1.9.7
* */
(function($, window, document, undefined) {var $window = $(window);
$.fn.lazyload = function(options) {var elements = this;var $container;var settings = {
threshold : 0,
failure_limit : 0,
event : "scroll",
effect : "show",
container : window,
data_attribute : "original",
skip_invisible : false,
appear : null,
load : null,
placeholder : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"}; function update() {var counter = 0;
elements.each(function() {var $this = $(this);if (settings.skip_invisible && !$this.is(":visible")) {return;
}if ($.abovethetop(this, settings) ||$.leftofbegin(this, settings)) {/* Nothing. */} else if (!$.belowthefold(this, settings) &&
!$.rightoffold(this, settings)) {
$this.trigger("appear");/* if we found an image we'll load, reset the counter */counter = 0;
} else {if (++counter > settings.failure_limit) {return false;
}
}
});
} if(options) {/* Maintain BC for a couple of versions. */if (undefined !== options.failurelimit) {
options.failure_limit = options.failurelimit;delete options.failurelimit;
}if (undefined !== options.effectspeed) {
options.effect_speed = options.effectspeed;delete options.effectspeed;
}
$.extend(settings, options);
} /* Cache container as jQuery as object. */$container = (settings.container === undefined || settings.container === window) ? $window : $(settings.container); /* Fire one scroll event per scroll. Not one scroll event per image. */if (0 === settings.event.indexOf("scroll")) {
$container.bind(settings.event, function() {return update();
});
} this.each(function() {var self = this;var $self = $(self);
self.loaded = false; /* If no src attribute given use data:uri. */if ($self.attr("src") === undefined || $self.attr("src") === false) {if ($self.is("img")) {
$self.attr("src", settings.placeholder);
}
} /* When appear is triggered load original image. */$self.one("appear", function() {if (!this.loaded) {if (settings.appear) {var elements_left = elements.length;
settings.appear.call(self, elements_left, settings);
}
$("<img />")
.bind("load", function() { var original = $self.attr("data-" + settings.data_attribute);
$self.hide();if ($self.is("img")) {
$self.attr("src", original);
} else {
$self.css("background-image", "url('" + original + "')");
}
$self[settings.effect](settings.effect_speed);
self.loaded = true; /* Remove image from array so it is not looped next time. */var temp = $.grep(elements, function(element) {return !element.loaded;
});
elements = $(temp); if (settings.load) {var elements_left = elements.length;
settings.load.call(self, elements_left, settings);
}
})
.attr("src", $self.attr("data-" + settings.data_attribute));
}
}); /* When wanted event is triggered load original image *//* by triggering appear. */if (0 !== settings.event.indexOf("scroll")) {
$self.bind(settings.event, function() {if (!self.loaded) {
$self.trigger("appear");
}
});
}
}); /* Check if something appears when window is resized. */$window.bind("resize", function() {
update();
}); /* With IOS5 force loading images when navigating with back button. *//* Non optimal workaround. */if ((/(?:iphone|ipod|ipad).*os 5/gi).test(navigator.appVersion)) {
$window.bind("pageshow", function(event) {if (event.originalEvent && event.originalEvent.persisted) {
elements.each(function() {
$(this).trigger("appear");
});
}
});
} /* Force initial check if images should appear. */$(document).ready(function() {
update();
}); return this;
}; /* Convenience methods in jQuery namespace. *//* Use as $.belowthefold(element, {threshold : 100, container : window}) */
$.belowthefold = function(element, settings) {var fold; if (settings.container === undefined || settings.container === window) {
fold = (window.innerHeight ? window.innerHeight : $window.height()) + $window.scrollTop();
} else {
fold = $(settings.container).offset().top + $(settings.container).height();
} return fold <= $(element).offset().top - settings.threshold;
};
$.rightoffold = function(element, settings) {var fold; if (settings.container === undefined || settings.container === window) {
fold = $window.width() + $window.scrollLeft();
} else {
fold = $(settings.container).offset().left + $(settings.container).width();
} return fold <= $(element).offset().left - settings.threshold;
};
$.abovethetop = function(element, settings) {var fold; if (settings.container === undefined || settings.container === window) {
fold = $window.scrollTop();
} else {
fold = $(settings.container).offset().top;
} return fold >= $(element).offset().top + settings.threshold + $(element).height();
};
$.leftofbegin = function(element, settings) {var fold; if (settings.container === undefined || settings.container === window) {
fold = $window.scrollLeft();
} else {
fold = $(settings.container).offset().left;
} return fold >= $(element).offset().left + settings.threshold + $(element).width();
};
$.inviewport = function(element, settings) { return !$.rightoffold(element, settings) && !$.leftofbegin(element, settings) &&
!$.belowthefold(element, settings) && !$.abovethetop(element, settings);
}; /* Custom selectors for your convenience. *//* Use as $("img:below-the-fold").something() or *//* $("img").filter(":below-the-fold").something() which is faster */
$.extend($.expr[":"], {"below-the-fold" : function(a) { return $.belowthefold(a, {threshold : 0}); },"above-the-top" : function(a) { return !$.belowthefold(a, {threshold : 0}); },"right-of-screen": function(a) { return $.rightoffold(a, {threshold : 0}); },"left-of-screen" : function(a) { return !$.rightoffold(a, {threshold : 0}); },"in-viewport" : function(a) { return $.inviewport(a, {threshold : 0}); },/* Maintain BC for couple of versions. */"above-the-fold" : function(a) { return !$.belowthefold(a, {threshold : 0}); },"right-of-fold" : function(a) { return $.rightoffold(a, {threshold : 0}); },"left-of-fold" : function(a) { return !$.rightoffold(a, {threshold : 0}); }
});
})(jQuery, window, document); Copier après la connexion
code js
Méthode d'appel :
window.smallDelay = (function(window, document, undefined) {'use strict';var store = [],poll;var settings = {
offset:0, //离可视区域多少像素的图片可以被加载throttle: 250 //图片延时多少毫秒加载 } var _inView = function(el) {var coords = el.getBoundingClientRect();return ((coords.top >= 0 && coords.left >= 0) && coords.top <= ((window.innerHeight || document.documentElement.clientHeight) + parseInt(settings.offset)));
};var _pollImages = function() {for (var i = store.length; i--;) {var self = store[i];if (_inView(self)) {
self.src = self.getAttribute('data-delay');
store.splice(i, 1);
}
}
};var _throttle = function() {
clearTimeout(poll);
poll = setTimeout(_pollImages, settings.throttle);
};var init = function(obj) {var nodes = document.querySelectorAll('[data-delay]');var opts = obj || {};
settings.offset = opts.offset || settings.offset;
settings.throttle = opts.throttle || settings.throttle;for (var i = 0; i < nodes.length; i++) {
store.push(nodes[i]);
}
_throttle(); //滚动监听执行图片懒加载if (document.addEventListener) {
window.addEventListener('scroll', _throttle, false);
} else {
window.attachEvent('onscroll', _throttle);
} //返回该对象进行链式操作return this;
};return {
init: init,
render: _throttle
};
})(window, document); Copier après la connexion
code html :
smallDelay.init({
offset: 0,//离可视区域多少像素的图片可以被加载 throttle: 0 //图片延时多少毫秒加载}); Copier après la connexion
三:根据lazyload插件实现一个不依赖jQuery的懒加载插件 实现内容 1、增加了图片预加载可选
2、修改了图片本身就在可视范围的时候直接显示而不需要滚动条触发
3、修改了Splice删除数组的时候,会跳过下一张图片BUG
4、浏览器窗口resize的时候图片出现也会加载
5、判断图片父层包裹顶部或者底部出现在可视范围内即可显示图片
实现源码 var Lazy = {
$:function(arg,context){var tagAll,n,eles=[],i,sub = arg.substring(1);
context = context|| document;if(typeof arg =='string'){switch(arg.charAt(0)){case '#':return document.getElementById(sub);break;case '.':if(context.getElementsByClassName) return context.getElementsByClassName(sub);
tagAll = Lazy.$('*');
n = tagAll.length;for(i = 0;i<n;i++){if(tagAll[i].className.indexOf(sub) > -1) eles.push(tagAll[i]);
}return eles;break;default:return context.getElementsByTagName(arg);break;
}
}
},
getPos:function (node) {var scrollx = document.documentElement.scrollLeft || document.body.scrollLeft,
scrollt = document.documentElement.scrollTop || document.body.scrollTop;var pos = node.getBoundingClientRect();return {top:pos.top + scrollt, right:pos.right + scrollx, bottom:pos.bottom + scrollt, left:pos.left + scrollx }
},
bind:function(node,type,handler){
node.addEventListener?node.addEventListener(type, handler, false):node.attachEvent('on'+ type, handler);
},
unbind:function(node,type,handler){
node.removeEventListener?node.removeEventListener(type, handler, false):node.detachEvent('on'+ type, handler);
},
toArray:function(eles){var arr = [];for(var i=0,n=eles.length;i<n;i++){
arr.push(eles[i]);
}return arr;
}
};function imgLazyLoad(){var timer,screenHeight = document.documentElement.clientHeight;// 选择所有图片var allimg = Lazy.$('img');// 筛选CLASS为lazyload的图片var elems = Lazy.$('.lazyload',allimg);// 转换为真正的数组elems = Lazy.toArray(elems);if(!elems.length) return;// 没有发生滚动事件时如果图片在可视范围之内,也显示for(var i = 0;i < elems.length;i++){// 获取图像的父元素即包裹图像的元素,判断图像是否在可视区域即直接判断父元素是否可视var parent = elems[i].parentNode;var pos = Lazy.getPos(parent);var posT = pos.top;var posB = pos.bottom;// 没有滚动条情况如果距离顶部的距离小于屏幕的高度则赋值SRCif(posT < screenHeight){
elems[i].src = elems[i].getAttribute('data-img');// 移除后,数组的长度减一,下一个下标需减一elems.splice(i--,1);
}
}// 绑定scroll事件Lazy.bind(window,'scroll',loading);
Lazy.bind(window,'resize',loading);function loading(){
timer && clearTimeout(timer);
timer = setTimeout(function(){var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
screenHeight = document.documentElement.clientHeight;for(var i = 0;i < elems.length;i++){var parent = elems[i].parentNode;var pos = Lazy.getPos(parent);var posT = pos.top;var posB = pos.bottom;var screenTop = screenHeight+scrollTop;// 元素顶部出现在可视区 或者 元素底部出现在可视区if((posT > scrollTop && posT < screenTop) || (posB > scrollTop && posB < screenTop)){
elems[i].src = elems[i].getAttribute('data-img');
elems.splice(i--,1);
}else{// 去掉以下注释开启图片预加载// new Image().src = elems[i].getAttribute('data-img'); }
}if(!elems.length){
Lazy.unbind(window,'scroll',loading);
Lazy.unbind(window,'resize',loading);
}
},300);
}
}
imgLazyLoad(); Copier après la connexion
使用方法 1、在图片上增加lazyload的类(class='lazyload')
2、把真实的图片地址放入自定义属性data-img 中,把图片的SRC属性设置为一个一像素的透明图片,图片需要设置width,height属性,以免布局混乱
如下:
<img data-img="a.jpg" src="loading.gif" width="640" height="480" class='lazyload'> Copier après la connexion
3、在需要延迟加载的页面调用imgLazyLoad()函数;
该原生js实现的懒加载转载地址:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!