图片预加载

Author:Helene

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自Helene的博客

一、图片预加载简介

图片资源很丰富一方面带给大家更好体验的同时,也降低了我们的性能,减慢了我们的加载速度

图片的预加载效果展示:

(1)网站的loading页面

(2)局部图片的加载–表情插件

(3)漫画网站

图片预加载的特点:

(1)提前加载所需要图片

(2)更好的用户体验

图片预加载分类:

1.无序预加载

不关心图片加载顺序,因为要在所有图片加载之后一次性显示出来就可以了

2.有序预加载

像那种漫画网站就是有序预加载的

二、图片预加载之无序预加载

首先看一下没使用预加载的时候的代码:

<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>图片预加载之无序加载</title>
    <style>
        a {
            text-decoration: none;
        }
        .box {
            text-align: center;
        }
        .btn {
            display: inline-block;
            height: 30px;
            line-height: 30px;
            border: 1px solid #ddd;
            background-color: #fff;
            padding: 0 10px;
            margin-right: 40px;
            color: #2a485d;
        }
        .btn:hover {
            background-color: #4cae4c;
        }
    </style>
</head>
<body>
    <div class="box">
        <img src="http://img07.tooopen.com/images/20170811/tooopen_sy_219898696246.jpg" alt="pic" id="img" width="300">
        <p>
            <a href="javascript:;" class="btn" data-control="prev">上一页</a>
            <a href="javascript:;" class="btn" data-control="next">下一页</a>
        </p>
    </div>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script>

    //图片数组
    var imgs = [
        'http://img07.tooopen.com/images/20170811/tooopen_sy_219898696246.jpg',
        'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=810896649,3751303857&fm=11&gp=0.jpg',
        'https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3549496778,2425390027&fm=200&gp=0.jpg',
        'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=2129473072,572477714&fm=200&gp=0.jpg',
        'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1933690442,1976994698&fm=11&gp=0.jpg'
    ];

    var index = 0,
        len = imgs.length

    $('.btn').on('click',function () {
        if($(this).attr('data-control') === 'prev') {
            //上一张
            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>

上面的图片在点击下一页的时候有可能出现假死的状况,用户体验很不好

那我们使用图片预加载方式来加载我们的图片,图片预加载其实是利用了img对象通过new Image()来实例化img对象,img对象是有两个事件的,一个是当我们的图片正常被加载完成之后会 触发load事件,那如果图片没有正常完成加载呢就会触发error事件,就是报一个错误

上图片预加载代码:

<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>图片预加载之无序加载</title>
    <style>
        html,body {
            height: 100%;
        }
        a {
            text-decoration: none;
        }
        .box {
            text-align: center;
        }
        .btn {
            display: inline-block;
            height: 30px;
            line-height: 30px;
            border: 1px solid #ddd;
            background-color: #fff;
            padding: 0 10px;
            margin-right: 40px;
            color: #2a485d;
        }
        .btn:hover {
            background-color: #4cae4c;
        }
        .loading {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-color: #ddd;
            text-align: center;
            font-size: 30px;
            color: white;
        }
        .progress {
            margin-top: 300px;
        }
    </style>
</head>
<body>
    <div class="box">
        <img src="http://img07.tooopen.com/images/20170811/tooopen_sy_219898696246.jpg" alt="pic" id="img" width="300">
        <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 src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script>

    //图片数组
    var imgs = [
        'http://img07.tooopen.com/images/20170811/tooopen_sy_219898696246.jpg',
        'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=810896649,3751303857&fm=11&gp=0.jpg',
        'https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3549496778,2425390027&fm=200&gp=0.jpg',
        'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=2129473072,572477714&fm=200&gp=0.jpg',
        'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1933690442,1976994698&fm=11&gp=0.jpg'
    ];

    var index = 0,
        len = imgs.length,
        count = 0,
        progress = $('.progress');

    $.each(imgs,function (i,src) {
        var imgObj = new Image();

        imgObj.src = src;

        $(imgObj).on('load err',function () {
            progress.html(Math.round((count + 1) / len * 100) + '%');

            if(count >= len -1){
                $('.loading').hide();
                document.title = '1/' + len
            }

            count++;
        })
    })

    $('.btn').on('click',function () {
        if($(this).attr('data-control') === 'prev') {
            //上一张
            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>

注意:

var imgObj = new Image();

imgObj.src = src;

$(imgObj).on(‘load err‘,function () {

为什么要把err也放进去了呢,因为当我们如果err了,不放进去的话就不会再执行loading进度,那么那个进度条将一直显示

将无序预加载写成jQuery插件

上面代码虽然能够解决当前实例的问题,但是并不具备复用性,因此接下来进行整理和优化,写成jqeury 插件,方便以后的复用