Ich habe am Wochenende zufällig einen Artikel über das „Lazy Loading“ von Bildern geschrieben und mir wahrscheinlich den Code angeschaut, den ich zuvor geschrieben habe, und festgestellt, dass es viele Stellen gibt, die optimiert werden können.
Dieser Artikel kombiniert hauptsächlich den vorherigen Artikel „Beispiel zum verzögerten Laden von Javascript-Wasserfall-Flussbildern“ , um einen Blick auf einige Kenntnisse zum „verzögerten Laden“ von Bildern zu werfen.
Der Zweck des „Lazy Loading“ von Bildern:
Laden Sie Bilder nach Bedarf, was bedeutet, dass Bilder zur Anzeige dann geladen werden, wenn sie angezeigt werden müssen, wodurch der Netzwerkbandbreiten-Overhead durch einmaliges Laden reduziert wird.
Schauen wir uns zunächst einen Code an:
var conf = { 'loadfirst': true, 'loadimg': true }; for (var item in conf) { if (item in co) { conf.item = co.item; } }
Hier möchte ich hauptsächlich die Verschmelzung von Benutzerkonfiguration und Standardkonfiguration erreichen. Das Schreiben von Code wie diesem ist jetzt nicht sehr elegant. Der Code lautet wie folgt:
_this.setting = { "mobileHeight": 0, //扩展屏幕的高度,使第一屏加载个数可配置 "loadNum": 1 //滚动时,当前节点之后加载个数 }; $.extend(_this.setting, _this.getSetting());
Hier werde ich mich auf die beiden neu hinzugefügten Parameter mobileHeight und LoadNum konzentrieren
mobileHeight ist die Höhe des Standard-Clients. Je größer der Wert, desto mehr Bilder werden auf dem ersten Bildschirm geladen;
loadNum Wenn der aktuelle Knoten auf dem Bildschirm angezeigt wird, können mehrere Knoten nach dem aktuellen Knoten gleichzeitig geladen werden, was die Ladegeschwindigkeit von Bildern erhöhen kann;
Mein Code wurde vorher so geschrieben:
_this.loadFirstScreen = function() { if (conf.loadfirst) { lazyNode.each(function(i) { currentNodeTop = $(this).offset().top; //这里的800就是上面提到的mobileHeight if (currentNodeTop < mobileHeight + 800) { _this.replaceImgSrc($(this)); } }); } }; _this.loadImg = function() { if (conf.loadimg) { $(window).on('scroll', function() { var imgLazyList = $('[node-type=imglazy]', node); //这里的5就是上面提到的loadNum for (var i = 0; i < 5; i++) { _this.replaceImgSrc(imgLazyList.eq(i)); } }); } };
loadFirstSrceen: function() { // 加载首屏 var _this = this; var currentNodeTop; var imgNodeList = _this.imgNode; $(imgNodeList).each(function() { currentNodeTop = $(this).offset().top; if (currentNodeTop < _this.mobileHeight() + _this.setting.mobileHeight) { _this.replaceImgSrc($(this)); } }); }, scrollLoadImg: function() { //滚动的时候加载图片 var _this = this; var currentNodeTop; var scrollTop = $('body').scrollTop(); var imgLazyList = $('[node-type=imglazy]'); $(imgLazyList).each(function() { currentNodeTop = $(this).offset().top; if (currentNodeTop - scrollTop < _this.mobileHeight()) { //加载当前节点后的规定个数节点 for (var i = 0, len = _this.setting.loadNum; i < len; i++) { _this.replaceImgSrc($(imgLazyList).eq(i)); } return false; } }); }
;(function($) { var LoadImgLazy = function(imgNode) { var _this = this; _this.imgNode = imgNode; _this.setting = { "mobileHeight": 0, //扩展屏幕的高度,使第一屏加载个数可配置 "loadNum": 1 //滚动时,当前节点之后加载个数 }; $.extend(_this.setting, _this.getSetting()); _this.loadFirstSrceen(); $(window).on('scroll', function() { _this.scrollLoadImg(); }); }; LoadImgLazy.prototype = { mobileHeight: function() { return $(window).height(); }, loadFirstSrceen: function() { // 加载首屏 var _this = this; var currentNodeTop; var imgNodeList = _this.imgNode; $(imgNodeList).each(function() { currentNodeTop = $(this).offset().top; if (currentNodeTop < _this.mobileHeight() + _this.setting.mobileHeight) { _this.replaceImgSrc($(this)); } }); }, scrollLoadImg: function() { //滚动的时候加载图片 var _this = this; var currentNodeTop; var scrollTop = $('body').scrollTop(); var imgLazyList = $('[node-type=imglazy]'); $(imgLazyList).each(function() { currentNodeTop = $(this).offset().top; if (currentNodeTop - scrollTop < _this.mobileHeight()) { //加载当前节点后的规定个数节点 for (var i = 0, len = _this.setting.loadNum; i < len; i++) { _this.replaceImgSrc($(imgLazyList).eq(i)); } return false; } }); }, replaceImgSrc: function(loadImgNode) { //动态替换图片 var srcValue; var imgDataSrc; var _this = this; var imgUrlList = $(loadImgNode).find('img[data-lazysrc]'); if (imgUrlList.length > 0) { imgUrlList.each(function(i) { imgDataSrc = $(this).attr('data-lazysrc'); srcValue = $(this).attr('src'); if (srcValue === '#') { if (imgDataSrc) { $(this).attr('src', imgDataSrc); $(this).removeAttr('data-lazysrc'); } } }); //移除已经运行过懒加载节点的node-type 对性能提升 $(loadImgNode).removeAttr('node-type'); } }, getSetting: function() { var userSetting = $('[lazy-setting]').attr('lazy-setting'); if (userSetting && userSetting !== '') { return $.parseJSON(userSetting); } else { return {}; } }, destory: function() { //销毁方法区 $(window).off('scroll'); } }; LoadImgLazy.init = function(imgNode) { new this(imgNode); }; window.LoadImgLazy = LoadImgLazy; })(Zepto);