JQ图片预加载(无序加载and有序加载)

本文介绍了使用jQuery实现图片的无序和有序预加载方法,包括非插件写法和插件写法。无序加载不显示百分比进度,而有序加载则提供了进度显示。所有预加载方案共享同一个JS文件,提高了代码复用性。
摘要由CSDN通过智能技术生成

无序加载效果预览:

这里写图片描述

有序加载只是少了百分比显示效果一样

无序加载非插件写法:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>图片加载之无序加载</title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            html,body{
                height: 100%;
            }
            #img{
                width: 100%;
            }
            .box{
                width: 1200px;
                margin: 30px auto;
            }
            p{
                text-align: center;
                margin-top: 15px;
            }
            .btn{
                text-decoration: none;
                color: #000000;
                border: 1px solid #ccc;
                padding: 3px 8px;   
                margin-right: 20px;     
            }
            .loading{
                position: fixed;
                left: 0;
                top: 0;
                width: 100%;
                height: 100%;
                background-color: #CCCCCC;
                text-align: center;
                font-size: 30px;
            }
            .progress{
                margin-top: 300px;
            }
        </style>
    </head>
    <body>
        <div class="box">
            <img src="../img/1.jpg" alt="pic" id="img" />
            <p>
                <a href="javascript:;" class="btn" data-control="prev">上一张</a>
                <a href="javascript:;" class="btn" data-control="next">下一张</a>
            </p>
        </div>
        <div class="loading">
            <p class="progress">0%</p>
        </div>

        <script type="text/javascript" src="../jq/jquery-1.7.2.min.js"></script>
        <script type="text/javascript">
            //声明一直数组,并在数组内放置图片路径
            var imgs = [
                "../img/1.jpg",
                "../img/2.jpg",
                "../img/3.jpg",
                "../img/4.jpg",
                "../img/5.jpg",
                "../img/6.jpg"
            ];

            //获取数组长度,进度元素,设置页数,进度初始值
            var index = 0,
                len = imgs.length,
                count = 0,
                $progress = $(".progress");

                //遍历数组,获取数组内全部路径
                $.each(imgs, function(i,src) {

                    //声明一个图像对象
                    var imgObj = new Image();

                    //设置所有图片在加载中或者加载失败时触发时间
                    $(imgObj).on("load error",function(){

                        //设置进度显示数字(因为each会自动循环 每次都会用获得数组数量除以总数从而获得百分比)
                        $progress.html(Math.round((count + 1) / len * 100) + "%");

                        //如果循环次数等于数组长度 即代表全部图片加载完毕
                        if(count >= len - 1){

                            //图片全部加载完毕后隐藏百分比进度
                            $(".loading").hide();

                            //设置页面标题初始值
                            document.title = "1/" + len;
                        }

                        //每一次循环加1
                        count++;
                    });

                    //设置所有图片的路径等于数组内的路径
                    imgObj.src = src;
                });

                //设置上一张下一张触发事件
                $(".btn").on("click",function(){
                    if("prev" === $(this).data("control")){

                        //上一张index变量先-1再和0比较大小
                        index = Math.max(0,--index);

                        //可以选择三元或者上面的写法处理
//                      index = (--index<=0)?0:--index;
                    }else{

                        //下一张index变量先+1再和0比较大小
                        index = Math.min(len - 1, ++index);
                    }

                    //设置页面标题页数
                    document.title = (index + 1) + "/" + len;

                    //设置每一次点击获取对应图片路径
                    $("#img").attr("src",imgs[index]);
                });
        </script>
    </body>
</html>

有序加载非插件写法:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>图片加载之无序加载</title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            #img{
                width: 100%;
            }
            .box{
                width: 1200px;
                margin: 30px auto;
            }
            p{
                text-align: center;
                margin-top: 15px;
            }
            .btn{
                text-decoration: none;
                color: #000000;
                border: 1px solid #ccc;
                padding: 3px 8px;   
                margin-right: 20px; 
            }
        </style>
    </head>
    <body>
        <div class="box">
            <img src="../img/1.jpg" alt="pic" id="img" />
            <p>
                <a href="javascript:;" class="btn" data-control="prev">上一张</a>
                <a href="javascript:;" class="btn" data-control="next">下一张</a>
            </p>
        </div>

        <script type="text/javascript" src="../jq/jquery-1.7.2.min.js"></script>
        <script type="text/javascript" src="js2.js"></script>
        <script type="text/javascript">
            //声明一直数组,并在数组内放置图片路径
            var imgs = [
                "../img/1.jpg",
                "../img/2.jpg",
                "../img/3.jpg",
                "../img/4.jpg",
                "../img/5.jpg",
                "../img/6.jpg"
            ];

            //获取数组长度,进度元素,设置页数
            var len = imgs.length,
                count = 0,
                index = 0;

                load();

                //有序预加载
                function load(){
                    var imgObj = new Image();

                    $(imgObj).on("load error",function(){
                        if(count >= len){
                            //所有图片已经加载完毕
                        }else{
                            load();
                        }

                        count++;
                    });

                    imgObj.src = imgs[count];
                }


                //设置上一张下一张触发事件
                $(".btn").on("click",function(){
                    if("prev" === $(this).data("control")){

                        //上一张index变量先-1再和0比较大小
                        index = Math.max(0,--index);

                        //可以选择三元或者上面的写法处理
//                      index = (--index<=0)?0:--index;
                    }else{

                        //下一张index变量先+1再和0比较大小
                        index = Math.min(len - 1, ++index);
                    }

                    //设置页面标题页数
                    document.title = (index + 1) + "/" + len;

                    //设置每一次点击获取对应图片路径
                    $("#img").attr("src",imgs[index]);
                });
        </script>       
    </body>
</html>

无序加载插件写法:(和有序加载调用共同JS文件)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>图片加载之无序加载</title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            html,body{
                height: 100%;
            }
            #img{
                width: 100%;
            }
            .box{
                width: 1200px;
                margin: 30px auto;
            }
            p{
                text-align: center;
                margin-top: 15px;
            }
            .btn{
                text-decoration: none;
                color: #000000;
                border: 1px solid #ccc;
                padding: 3px 8px;   
                margin-right: 20px; 
            }
            .loading{
                position: fixed;
                left: 0;
                top: 0;
                width: 100%;
                height: 100%;
                background-color: #CCCCCC;
                text-align: center;
                font-size: 30px;
            }
            .progress{
                margin-top: 300px;
            }
        </style>
    </head>
    <body>
        <div class="box">
            <img src="../img/1.jpg" alt="pic" id="img" />
            <p>
                <a href="javascript:;" class="btn" data-control="prev">上一张</a>
                <a href="javascript:;" class="btn" data-control="next">下一张</a>
            </p>
        </div>
        <div class="loading">
            <p class="progress">0%</p>
        </div>

        <script type="text/javascript" src="../jq/jquery-1.7.2.min.js"></script>
        <script type="text/javascript" src="js2.js"></script>
        <script type="text/javascript">
            //声明一直数组,并在数组内放置图片路径
            var imgs = [
                "../img/1.jpg",
                "../img/2.jpg",
                "../img/3.jpg",
                "../img/4.jpg",
                "../img/5.jpg",
                "../img/6.jpg"
            ];

            //获取数组长度,进度元素,设置页数
            var index = 0,
                len = imgs.length,
                $progress = $(".progress");

                //使用工具函数 调用插件方法
                $.preload(imgs,{

                    //每一张图片加载完毕后执行
                    each: function(count){
                        $progress.html(Math.round((count + 1) / len * 100) + "%");
                    },

                    //所有图片加载完毕后执行
                    all: function(){
                        //图片全部加载完毕后隐藏百分比进度
                        $(".loading").hide();

                        //设置页面标题初始值
                        document.title = "1/" + len;
                    }
                });

                //设置上一张下一张触发事件
                $(".btn").on("click",function(){
                    if("prev" === $(this).data("control")){

                        //上一张index变量先-1再和0比较大小
                        index = Math.max(0,--index);

                        //可以选择三元或者上面的写法处理
//                      index = (--index<=0)?0:--index;
                    }else{

                        //下一张index变量先+1再和0比较大小
                        index = Math.min(len - 1, ++index);
                    }

                    //设置页面标题页数
                    document.title = (index + 1) + "/" + len;

                    //设置每一次点击获取对应图片路径
                    $("#img").attr("src",imgs[index]);
                });
        </script>       
    </body>
</html>

有序加载插件写法:(和无序加载调用共同JS文件)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>图片加载之无序加载</title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            #img{
                width: 100%;
            }
            .box{
                width: 1200px;
                margin: 30px auto;
            }
            p{
                text-align: center;
                margin-top: 15px;
            }
            .btn{
                text-decoration: none;
                color: #000000;
                border: 1px solid #ccc;
                padding: 3px 8px;   
                margin-right: 20px; 
            }
        </style>
    </head>
    <body>
        <div class="box">
            <img src="../img/1.jpg" alt="pic" id="img" />
            <p>
                <a href="javascript:;" class="btn" data-control="prev">上一张</a>
                <a href="javascript:;" class="btn" data-control="next">下一张</a>
            </p>
        </div>

        <script type="text/javascript" src="../jq/jquery-1.7.2.min.js"></script>
        <script type="text/javascript" src="js2.js"></script>
        <script type="text/javascript">
            //声明一直数组,并在数组内放置图片路径
            var imgs = [
                "../img/1.jpg",
                "../img/2.jpg",
                "../img/3.jpg",
                "../img/4.jpg",
                "../img/5.jpg",
                "../img/6.jpg"
            ];

            //获取数组长度,设置页数
            var len = imgs.length,
                index = 0;

                //调用插件
                $.preload(imgs,{

                    //使用有序加载
                    order: "ordered"
                });

                //设置上一张下一张触发事件
                $(".btn").on("click",function(){
                    if("prev" === $(this).data("control")){

                        //上一张index变量先-1再和0比较大小
                        index = Math.max(0,--index);

                        //可以选择三元或者上面的写法处理
//                      index = (--index<=0)?0:--index;
                    }else{

                        //下一张index变量先+1再和0比较大小
                        index = Math.min(len - 1, ++index);
                    }

                    //设置页面标题页数
                    document.title = (index + 1) + "/" + len;

                    //设置每一次点击获取对应图片路径
                    $("#img").attr("src",imgs[index]);
                });
        </script>       
    </body>
</html>

有序and无序加载共同JS文件

//图片预加载
(function(){

    //imgs一般传递进来的都是一个数组
    function PreLoad(imgs,options){

        //如果imgs传递进来的是一个字符串 就将他包装成一个数组 否则就返回数组本身
        this.imgs = (typeof imgs === "string") ? [imgs] : imgs;

        //将options参数覆盖PreLoad.DEFAULTS,将融合后的内容组成一个新对象,并返回到参数中
        this.opts = $.extend({},PreLoad.DEFAULTS,options);

        //如果设置参数为有序加载则执行下面代码块
        if(this.opts.order === "ordered"){

            //执行有序加载的方法
            this._ordered();
        }else{

            //执行无序加载的方法
            this._unoredered();
        }
    }

    PreLoad.DEFAULTS = {
        order: "unordered",//无序预加载
        each: null,//每一张图片加载完毕后执行
        all: null//所有图片加载完毕后执行
    };

    //有序加载
    PreLoad.prototype._ordered = function(){

        //获取相关变量,并保存到局部变量中
        var opts = this.opts,
            imgs = this.imgs,
            len = imgs.length,
            count = 0;

        //执行有序加载方法函数    
        load();

        //有序预加载
        function load(){

            //实例化IMG对象
            var imgObj = new Image();

            $(imgObj).on("load error",function(){

                //检测opts.each是否存在
                opts.each && opts.each(count);

                if(count >= len){
                    //所有图片已经加载完毕
                    opts.all && opts.all();
                }else{
                    load();
                }

                count++;
            });

            //将图像路径保存的数组数据全部设置到IMG的 src中
            imgObj.src = imgs[count];
        }   
    }

    //无序加载
    PreLoad.prototype._unoredered = function(){

        //获取对象中的imgs属性(因为前面已经设置了返回的是数组,所以可以遍历其内容)
        var imgs = this.imgs,

            //获取对象中的opts属性,并返回到变量中
            opts = this.opts,

            //设置百分比显示数字执行的参数 和 获取数组长度(可浏览图片数量)
            count = 0,
            len = imgs.length;

        //遍历数组,获取数组内全部路径
        $.each(imgs, function(i,src) {

            //判断src传递进来的是否是一个字符串 如果是 就将他返回 下面的代码将不执行
            if(typeof src != "string") return;

            //声明一个图像对象
            var imgObj = new Image();

            //设置所有图片在加载中或者加载失败时触发时间
            $(imgObj).on("load error",function(){

                //检测opts.each属性是否存在
                opts.each && opts.each(count);

                //如果循环次数等于数组长度 即代表全部图片加载完毕
                if(count >= len - 1){

                    //图片全部加载完毕后隐藏百分比进度
                    $(".loading").hide();

                    //设置页面标题初始值
                    document.title = "1/" + len;
                }

                //每一次循环加1
                count++;
            });

            //设置所有图片的路径等于数组内的路径
            imgObj.src = src;
        });     
    };

    //将PreLoad构造函数实例化
    $.extend({
        preload: function(imgs,opts){
            new PreLoad(imgs,opts);
        }
    });

})(jQuery);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值