zoukankan      html  css  js  c++  java
  • 图片预加载

    一、未使用预加载技术前

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>图片预加载之无序加载</title>
        <style>
            .box {
                text-align: center;
            }
    
            .btn {
                display: inline-block;
                height: 30px;
                line-height: 30px;
                border: 1px solid #ccc;
                background: #fff;
                padding: 0 10px;
                margin-right: 50px;
                color: #333;
            }
    
            a {
                text-decoration: none;
            }
    
            .btn:hover {
                background-color: #b5b5b5;
            }
    
        </style>
        <script
                src="js/jquery-3.2.1.js"></script>
    </head>
    <body>
    <div class="box">
        <img src="http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbOIb6JqABF4o12gc_AAAH9HgF1sh0AEXi7441.jpg"
             alt="pic" id="img" width="900"/>
    
        <p>
            <a href="javascript:;" class="btn" data-control="prev">上一页</a>
            <a href="javascript:;" class="btn" data-control="next">下一页</a>
    
    
        </p>
    </div>
    
    <script>
        var imgs = [
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbOIb6JqABF4o12gc_AAAH9HgF1sh0AEXi7441.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJ1auzbKIS8d1ABmgDYbGTm4AAH9HgDVQJkAGaAl653.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbKIYXwYAA3k8MKqRbcAAH9HgDu4L4ADeUI140.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJ1auzbKIHSPXABHf7cWFpNwAAH9HgD8xcYAEeAF788.png",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbKIeIlZAAnxiXety0IAAH9HgEOpcsACfGh744.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJ1auzbKIX4p4ABNtzPOq83gAAH9HgEYl2wAE23k650.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJ1auzbKIdDRhABqMJC8YI_sAAH9HgEsBVAAGow8388.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbOIF7dTABn5-3IG-s8AAH9HgFGkYwAGfoT769.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbOIadTUABUmZqHccD0AAH9HgFgi58AFSZ-104.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/08/0A/ChMkJ1i9XJmIJnFtABXosJGWaOkAAae8QGrHE8AFejI057.jpg"
    
        ];
        var index = 0,
                len = imgs.length;
        $('.btn').on("click", function () {
            if ('prev' === $(this).data('control')) {//上一张
                index = Math.max(0, --index);
            } else {//下一张
                index = Math.min(len - 1, ++index);
            }
            document.title = (index + 1) + '/' + len;
            $("#img").attr('src', imgs[index]);
        })
    
    
    </script>
    </body>
    </html>
    View Code

    二、使用图片的无序预加载技术

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>图片预加载之无序加载</title>
        <style>
            html, body {
                height: 100%;
            }
    
            .box {
                text-align: center;
            }
    
            .btn {
                display: inline-block;
                height: 30px;
                line-height: 30px;
                border: 1px solid #ccc;
                background: #fff;
                padding: 0 10px;
                margin-right: 50px;
                color: #333;
            }
    
            a {
                text-decoration: none;
            }
    
            .btn:hover {
                background-color: #b5b5b5;
            }
    
            .loading {
                position: fixed;
                left: 0;
                top: 0;
                 100%;
                height: 100%;
                background-color: #eee;
                text-align: center;
                font-size: 30px;
                font-weight: 700;
            }
    
            .progress {
                margin-top: 300px;
            }
        </style>
        <script
                src="js/jquery-3.2.1.js"></script>
    </head>
    <body>
    <!--加载页-->
    <div class="loading">
        <p class="progress">0%</p>
    </div>
    <div class="box">
        <img src="http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbOIb6JqABF4o12gc_AAAH9HgF1sh0AEXi7441.jpg"
             alt="pic" id="img" width="900"/>
    
        <p>
            <a href="javascript:;" class="btn" data-control="prev">上一页</a>
            <a href="javascript:;" class="btn" data-control="next">下一页</a>
    
    
        </p>
    </div>
    
    <script>
        var imgs = [
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbOIb6JqABF4o12gc_AAAH9HgF1sh0AEXi7441.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJ1auzbKIS8d1ABmgDYbGTm4AAH9HgDVQJkAGaAl653.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbKIYXwYAA3k8MKqRbcAAH9HgDu4L4ADeUI140.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJ1auzbKIHSPXABHf7cWFpNwAAH9HgD8xcYAEeAF788.png",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbKIeIlZAAnxiXety0IAAH9HgEOpcsACfGh744.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJ1auzbKIX4p4ABNtzPOq83gAAH9HgEYl2wAE23k650.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJ1auzbKIdDRhABqMJC8YI_sAAH9HgEsBVAAGow8388.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbOIF7dTABn5-3IG-s8AAH9HgFGkYwAGfoT769.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbOIadTUABUmZqHccD0AAH9HgFgi58AFSZ-104.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/08/0A/ChMkJ1i9XJmIJnFtABXosJGWaOkAAae8QGrHE8AFejI057.jpg"
    
        ];
        /**
         * 按钮点击响应
         */
        var index = 0,
                len = imgs.length,
                count = 0,//记录加载了几张图片
                $progress = $(".progress"),
                $loading = $(".loading");
        $('.btn').on("click", function () {
            if ('prev' === $(this).data('control')) {//上一张
                index = Math.max(0, --index);
            } else {//下一张
                index = Math.min(len - 1, ++index);
            }
            document.title = (index + 1) + '/' + len;
            $("#img").attr('src', imgs[index]);
        })
        /*预加载遍历*/
        /*注意这里用count计算来判断图片是否加载完,而不用i变量,因为每张图片加载完成时间不一样*/
        $.each(imgs, function (i, item) {
            var imgObj = new Image();
            $(imgObj).on("load error", function () { //图片没有正常加载页可以正确处理
                //每加载完一张图片需要做的处理
                count++;
                $progress.html(Math.round(count / len) * 100 + "%");//Math.round四舍五入转为整数
                console.log(count);
                //图片全部加载完需要做的处理
                if (count >= len) {
                    $loading.hide();
                    document.title = '1/' + len; //表示当前是第一张
    
                }
            });
            $(imgObj).attr("src", item);
        })
    </script>
    </body>
    </html>

    三、把无序预加载写成jQuery插件

    写成插件让其具备复用性

    preload.js

    /**
     * Created by xiaoyanliu on 2017/5/17.
     */
    /**
     * 图片预加载
     */
    (function ($) {
        /**
         * 用OOP的构造函数来写
         * @constructor
         */
        function Preload(imgs, options) {
            /*第一步:初始化*/
            this.imgs = (typeof imgs === "string") ? [imgs] : imgs;//如果有一张图片可以传入字符串,将它包装成数组
            /*opts是传入的options和默认值DEFAULTS的融合,若传入使用传入的值,没有传入使用默认值*/
            /*将后一个覆盖前一个的内容,形成一个新的对象,将新对象返回给this.opts保存下来*/
            this.opts = $.extend({}, Preload.DEFAULTS, options);
            /*第二步:执行无序加载的方法*/
            this._unordered();//这个方法只在内部使用,不在外部调用
    
        }
    
        /*默认参数*/
        Preload.DEFAULTS = {
            each: null,//每一张图片加载完毕后执行
            all: null//全部图片加载完毕后执行
        }
        /*第三步:写方法*/
        /**
         * 方法都写在原型上,这样多次多次实例化可以共用一份
         */
        Preload.prototype._unordered = function () {//无序加载
            console.log("调用无序加载");
            var imgs = this.imgs,
                opts = this.opts,
                count = 0,
                len = imgs.length;
            /*预加载遍历*/
            /*注意这里用count计算来判断图片是否加载完,而不用i变量,因为每张图片加载完成时间不一样*/
            $.each(imgs, function (i, item) {
                if (typeof item != 'string') return;//图片地址不是字符串,就不处理
                var imgObj = new Image();
                $(imgObj).on("load error", function () { //图片没有正常加载页可以正确处理
                    //每加载完一张图片需要做的处理
                    count++;
                    opts.each && opts.each(count);
                    //图片全部加载完需要做的处理
                    if (count >= len) {
                        opts.all && opts.all();
                    }
                });
                $(imgObj).attr("src", item);
    
    
            })
        }
        $.extend({
            preload: function (imgs, opts) {
                new Preload(imgs, opts);
            }
        });
    
    })(jQuery);
    View Code

    调用插件实现功能:

        /*调用插件实现预加载*/
        $.preload(imgs, {
            each: function (count) {
                $progress.html(Math.round(count / len) * 100 + "%");//Math.round四舍五入转为整数
            },
            all: function () {
                $loading.hide();
                document.title = '1/' + len; //表示当前是第一张
            }
        });

    完整html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>图片预加载之无序加载</title>
        <style>
            html, body {
                height: 100%;
            }
    
            .box {
                text-align: center;
            }
    
            .btn {
                display: inline-block;
                height: 30px;
                line-height: 30px;
                border: 1px solid #ccc;
                background: #fff;
                padding: 0 10px;
                margin-right: 50px;
                color: #333;
            }
    
            a {
                text-decoration: none;
            }
    
            .btn:hover {
                background-color: #b5b5b5;
            }
    
            .loading {
                position: fixed;
                left: 0;
                top: 0;
                width: 100%;
                height: 100%;
                background-color: #eee;
                text-align: center;
                font-size: 30px;
                font-weight: 700;
            }
    
            .progress {
                margin-top: 300px;
            }
        </style>
        <script src="js/jquery-3.2.1.js"></script>
        <script src="js/preload.js"></script>
    </head>
    <body>
    <!--加载页-->
    <div class="loading">
        <p class="progress">0%</p>
    </div>
    <div class="box">
        <img src="http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbOIb6JqABF4o12gc_AAAH9HgF1sh0AEXi7441.jpg"
             alt="pic" id="img" width="900"/>
    
        <p>
            <a href="javascript:;" class="btn" data-control="prev">上一页</a>
            <a href="javascript:;" class="btn" data-control="next">下一页</a>
    
    
        </p>
    </div>
    
    <script>
        var imgs = [
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbOIb6JqABF4o12gc_AAAH9HgF1sh0AEXi7441.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJ1auzbKIS8d1ABmgDYbGTm4AAH9HgDVQJkAGaAl653.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbKIYXwYAA3k8MKqRbcAAH9HgDu4L4ADeUI140.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJ1auzbKIHSPXABHf7cWFpNwAAH9HgD8xcYAEeAF788.png",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbKIeIlZAAnxiXety0IAAH9HgEOpcsACfGh744.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJ1auzbKIX4p4ABNtzPOq83gAAH9HgEYl2wAE23k650.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJ1auzbKIdDRhABqMJC8YI_sAAH9HgEsBVAAGow8388.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbOIF7dTABn5-3IG-s8AAH9HgFGkYwAGfoT769.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/0F/09/ChMkJlauzbOIadTUABUmZqHccD0AAH9HgFgi58AFSZ-104.jpg",
            "http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/08/0A/ChMkJ1i9XJmIJnFtABXosJGWaOkAAae8QGrHE8AFejI057.jpg"
    
        ];
        /**
         * 按钮点击响应
         */
        var index = 0,
                len = imgs.length,
                count = 0,//记录加载了几张图片
                $progress = $(".progress"),
                $loading = $(".loading");
        $('.btn').on("click", function () {
            if ('prev' === $(this).data('control')) {//上一张
                index = Math.max(0, --index);
            } else {//下一张
                index = Math.min(len - 1, ++index);
            }
            document.title = (index + 1) + '/' + len;
            $("#img").attr('src', imgs[index]);
        })
        /*调用插件实现预加载*/
        $.preload(imgs, {
            each: function (count) {
                $progress.html(Math.round(count / len) * 100 + "%");//Math.round四舍五入转为整数
            },
            all: function () {
                $loading.hide();
                document.title = '1/' + len; //表示当前是第一张
            }
        });
    </script>
    </body>
    </html>
    View Code

    四、有序加载

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>图片预加载之有序加载</title>
        <style>
            body {
                background-color: #eee;
            }
    
            .box {
                text-align: center;
            }
    
            .btn {
                display: inline-block;
                height: 30px;
                line-height: 30px;
                border: 1px solid #ccc;
                background: #fff;
                padding: 0 10px;
                margin-right: 50px;
                color: #333;
            }
    
            a {
                text-decoration: none;
            }
    
            .btn:hover {
                background-color: #b5b5b5;
            }
        </style>
        <script src="js/jquery-3.2.1.js"></script>
        <script src="js/preload.js"></script>
    </head>
    <body>
    <div class="box">
        <img src="images/order/1.jpg" alt="pic" id="img" width="900"/>
    
        <p>
            <a href="javascript:;" class="btn" data-control="prev">上一页</a>
            <a href="javascript:;" class="btn" data-control="next">下一页</a>
        </p>
    </div>
    
    <script>
        /*技巧*/
        var imgs = [];
        for (var i = 0; i < 6; i++) {
            imgs[i] = 'images/order/' + (i + 1) + '.jpg';
        }
        /**
         * 按钮点击响应
         */
        var len = imgs.length,
                index = 0,//按钮点击当前第几张
                count = 0;//记录加载了几张图片
    
        /*递归实现有序加载*/
        function load() {
            var imgObj = new Image();
            $(imgObj).on("load error", function () {
                if (count >= len) {
                    //所有图片已经加载完毕
                } else {
                    load();
                    count++;
                }
            });
            imgObj.src = imgs[count];
        }
        ;
        load();
    
    
        $('.btn').on("click", function () {
            if ('prev' === $(this).data('control')) {//上一张
                index = Math.max(0, --index);
            } else {//下一张
                index = Math.min(len - 1, ++index);
            }
            document.title = (index + 1) + '/' + len;
            $("#img").attr('src', imgs[index]);
        })
    
    
    </script>
    </body>
    </html>
    View Code

    五、将有序加载加入到插件中

    最终包含了有序加载和无序加载的插件

    /**
     * Created by xiaoyanliu on 2017/5/17.
     */
    /**
     * 图片预加载
     */
    (function ($) {
        /**
         * 用OOP的构造函数来写
         * @constructor
         */
        function Preload(imgs, options) {
            /*第一步:初始化*/
            this.imgs = (typeof imgs === "string") ? [imgs] : imgs;//如果有一张图片可以传入字符串,将它包装成数组
            /*opts是传入的options和默认值DEFAULTS的融合,若传入使用传入的值,没有传入使用默认值*/
            /*将后一个覆盖前一个的内容,形成一个新的对象,将新对象返回给this.opts保存下来*/
            this.opts = $.extend({}, Preload.DEFAULTS, options);
            /*第二步:通过判断执行无序加载的方法*/
            if (this.opts.order === "ordered") {//执行有序预加载
                this._ordered();
            } else {
                this._unordered();//这个方法只在内部使用,不在外部调用
            }
    
        }
    
        /*默认参数*/
        Preload.DEFAULTS = {
            order: 'unordered',//默认情况使用无序加载
            each: null,//每一张图片加载完毕后执行
            all: null//全部图片加载完毕后执行
        }
        /*第三步:写方法*/
        /**
         * 方法都写在原型上,这样多次多次实例化可以共用一份
         */
        Preload.prototype._ordered = function () {//有序预加载
            var imgs = this.imgs,
                opts = this.opts,
                count = 0,
                len = imgs.length;
            load();
            /*递归实现有序加载*/
            function load() {
                var imgObj = new Image();
                $(imgObj).on("load error", function () {
                    opts.each && opts.each(count);
                    if (count >= len) {
                        //所有图片已经加载完毕
                        opts.all && opts.all();
                    } else {
                        load();
                        count++;
                    }
                });
                imgObj.src = imgs[count];
            };
        },
    
    
            Preload.prototype._unordered = function () {//无序加载
                console.log("调用无序加载");
                var imgs = this.imgs,
                    opts = this.opts,
                    count = 0,
                    len = imgs.length;
                /*预加载遍历*/
                /*注意这里用count计算来判断图片是否加载完,而不用i变量,因为每张图片加载完成时间不一样*/
                $.each(imgs, function (i, item) {
                    if (typeof item != 'string') return;//图片地址不是字符串,就不处理
                    var imgObj = new Image();
                    $(imgObj).on("load error", function () { //图片没有正常加载页可以正确处理
                        //每加载完一张图片需要做的处理
                        count++;
                        opts.each && opts.each(count);
                        //图片全部加载完需要做的处理
                        if (count >= len) {
                            opts.all && opts.all();
                        }
                    });
                    $(imgObj).attr("src", item);
    
    
                })
            }
        $.extend({
            preload: function (imgs, opts) {
                new Preload(imgs, opts);
            }
        });
    
    })(jQuery);

    调用有序加载

     /*使用插件*/
        $.preload(imgs,{
            order:'ordered'
        });

    本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/6866523.html有问题欢迎与我讨论,共同进步。

  • 相关阅读:
    【转帖】C#索引器
    .NET Framework升级的挑战
    【我翻译的文章】CodeSmith发布代替和扩展LINQ to SQL的工具——PLINQO
    升级到VS2008后的一些疑惑
    【我翻译的文章】你还需要数据层吗?
    Db4Objects发布Db4o 7.0,支持透明激活
    迎接游戏开发新世界——Zune Game和Micro Game
    20071223成都俱乐部活动
    db4o发布7.2,出现.NET 3.5版本,支持LINQ
    微软推出SCE SDK及其示例MSDN Reader
  • 原文地址:https://www.cnblogs.com/starof/p/6866523.html
Copyright © 2011-2022 走看看