zoukankan      html  css  js  c++  java
  • 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: 3,
        attr: "data-original",
        callback: function () {
            //console.log("加载完了");
        }
    });

    jQuery、Zepto:

    $(".photo-list img").lazy({
        size: 3,
        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 || 5,
                attr = options.attr || "data-original",
                callback = options.callback || "",
                page = 0;
            function loadPhoto() {
                var scrollTop = document.body.scrollTop || document.documentElement.scrollTop,
                    docHeight = document.body.scrollHeight,
                    winHeight = document.documentElement.clientHeight,
                    i = 0,
                    sum = 0;
                if (scrollTop + winHeight >= docHeight - 50) {
                    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 - 1) {
                                    photo.onload = function () {
                                        if (docHeight <= winHeight) {
                                            loadPhoto();
                                        }
                                    }
                                }
                                if (callback && i == len - 1) {
                                    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 || 5,
                attr = options.attr || "data-original",
                callback = options.callback || "",
                page = 0;
            function loadPhoto() {
                var scrollTop = document.body.scrollTop || document.documentElement.scrollTop,
                    docHeight = document.body.scrollHeight,
                    winHeight = document.documentElement.clientHeight,
                    i = 0,
                    sum = 0;
                if (scrollTop + winHeight >= docHeight - 50) {
                    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 - 1) {
                                    photo.onload = function () {
                                        if (docHeight <= winHeight) {
                                            loadPhoto();
                                        }
                                    }
                                }
                                if (callback && i == len - 1) {
                                    callback();
                                }
                            }
                        }
                    }
                }
            }
            window.addEventListener("load", loadPhoto, false);
            window.addEventListener("scroll", loadPhoto, false);
            window.addEventListener("touchmove", loadPhoto, false);
        };
        window.lazy = lazy;
    })(window, document);
  • 相关阅读:
    结构化思考力
    对象序列化解析
    单元测试的规范
    关于CefSharp的坎坷之路
    构建基于Chromium的应用程序
    C# 面向切面编程(AOP)--监控日志记录方案
    CefSharp 中断点 已达到中断点
    用批处理命令实现激活office2016
    Winform开发中的困境及解决方案
    VUE+Element 前端应用开发框架功能介绍
  • 原文地址:https://www.cnblogs.com/huanlei/p/5144678.html
Copyright © 2011-2022 走看看