JS实现移动端图片延迟加载

时间:2023-03-08 16:36:26
JS实现移动端图片延迟加载

图片延迟加载常见的有,jquery.lazyload.js,原生JS实现的echo.js。但是都是必须给图片设置宽高。

因为项目是移动端,而且无法在加载前知道图片的宽高,所以,只好自己写了一个。

既然无法按照高度来计算是否在可视区内加载。那我就按照个数加载,每次加载X张图片,滚动到底部的时候再加载X张。如果图片高度比较小,X张加载后图片没有满屏,那么就再执行一次加载。

Example:http://www.yc.cn/app/commonweal/

使用方法

原生JS:
var lazyPhoto = new lazy(".photo-list img");

或者

var lazyPhoto = new lazy(".photo-list img", {
size: ,
attr: "data-original",
callback: function () {
//console.log("加载完了");
}
});

jQuery、Zepto:

$(".photo-list img").lazy({
size: ,
attr: "data-original",
callback: function () {
//console.log("加载完了");
}
});

20160122更新,添加jQuery、Zepto支持

/**
* lazy.js
* Version: 1.1
* 图片延迟加载
* Created by 赵小磊 on 2016/1/22.
*/ (function ($, window, document, undefined) {
var lazy = function (elem, options) {
var photos = typeof elem == "string" ? document.querySelectorAll(elem) : elem,
len = photos.length,
options = options || {},
size = options.size || ,
attr = options.attr || "data-original",
callback = options.callback || "",
page = ;
function loadPhoto() {
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop,
docHeight = document.body.scrollHeight,
winHeight = document.documentElement.clientHeight,
i = ,
sum = ;
if (scrollTop + winHeight >= docHeight - ) {
page++;
sum = size * page;
for (i; i < sum; i++) {
if (i < len) {
var photo = photos[i],
photoSrc = photo.getAttribute(attr);
if (photoSrc) {
photo.src = photoSrc;
photo.removeAttribute(attr);
if (i == sum - ) {
photo.onload = function () {
if (docHeight <= winHeight) {
loadPhoto();
}
}
}
if (callback && i == len - ) {
callback();
}
}
}
}
}
}
window.addEventListener("load", loadPhoto, false);
window.addEventListener("scroll", loadPhoto, false);
window.addEventListener("touchmove", loadPhoto, false);
};
window.lazy = lazy;
if (typeof $ != "undefined") {
$.fn.lazy = function(options) {
return lazy(this, options);
};
}
})(window.jQuery || window.Zepto, window, document);

2016/1/15上传1.0

/**
* lazy.js
* 图片延迟加载
* Created by 赵小磊 on 2016/1/15.
*/ (function (window, document) {
var lazy = function (elem, options) {
var photos = typeof elem == "string" ? document.querySelectorAll(elem) : elem,
len = photos.length,
options = options || {},
size = options.size || ,
attr = options.attr || "data-original",
callback = options.callback || "",
page = ;
function loadPhoto() {
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop,
docHeight = document.body.scrollHeight,
winHeight = document.documentElement.clientHeight,
i = ,
sum = ;
if (scrollTop + winHeight >= docHeight - ) {
page++;
sum = size * page;
for (i; i < sum; i++) {
if (i < len) {
var photo = photos[i],
photoSrc = photo.getAttribute(attr);
if (photoSrc) {
photo.src = photoSrc;
photo.removeAttribute(attr);
if (i == sum - ) {
photo.onload = function () {
if (docHeight <= winHeight) {
loadPhoto();
}
}
}
if (callback && i == len - ) {
callback();
}
}
}
}
}
}
window.addEventListener("load", loadPhoto, false);
window.addEventListener("scroll", loadPhoto, false);
window.addEventListener("touchmove", loadPhoto, false);
};
window.lazy = lazy;
})(window, document);