1. 程式人生 > >圖片預載入的那些事兒

圖片預載入的那些事兒

前言:最近在給一個創業公司做一個官網,涉及到很多圖片,載入速度不給力,使用者體驗很差。因此自己這次就採用了圖片預處理,在網上也看了一些其他大佬的部落格,收穫很多,在這裡總結一下,分享給大家。

1、什麼是圖片預載入

簡單的來說,圖片預載入就是我們在瀏覽到圖片之前,就已經載入好了,不用再擔心我們瀏覽圖片的時候,出現卡死或者白條的情況。其中圖片預載入也分為三種,第一種是無序載入,也就是載入不分順序,你給我載入完就行,我們在開啟有些網站的時候會遇到先轉幾圈再顯示,這裡就用到了無序載入。第二種就是有序載入,也就是按照先後順序來載入,這裡可以在有些翻頁的地方使用,我們從前向後一頁一頁的翻,圖片也就一頁一頁的預載入。第三種就是基於使用者行為的預載入,也就是我們去點選某個按鈕或者滾動的時候進行載入,首先我們來一個對照組,後面通過實驗組來進行對比。(下面程式碼複製可直接執行)

2、普通載入

通過下面程式碼,我們清空瀏覽器快取以後可以知道,當我們在點選下一頁或者上一頁的時候,才進行圖片載入,很容易出現白條或者卡死狀態。後面我們對其進行優化。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>普通載入</title>
    <style>
        .content{
            width: 800px;
            height: 400px;
            margin
: 0 auto
; }
img { width: 100%; height: 100%; } .btn-div { margin-top: 30px; text-align: center; } button { padding: 10px 20px; width: 100px; background-color: #cdcdcd; border
: none
; margin: 0 20px; outline: none; }
button:hover { color: white; cursor: pointer; background-color: orange; }
</style> </head> <body> <div class="content"> <img src="http://www.boyalibrary.com/dist/08fa276c6fcc523c9e134a6eeea56a39.jpg" /> </div> <div class="btn-div"> <button class="pre">上一頁</button> <button class="next">下一頁</button> </div> <script type="text/javascript"> window.onload = function() { // 定義需要遍歷的圖片陣列 var imgs = [ '08fa276c6fcc523c9e134a6eeea56a39.jpg', '15f913bf2a8158220dca1fda61e6fe82.jpg', '825bd9f1e267b7ebadff9b5e6fbd79f7.jpg', '86793912ba0e2872126b3717752a08dd.jpg', 'c835cc910976860779f38256b9f843f2.jpg', 'c5396d5ae4bf830fed68690c8e828f9c.jpg', 'ca8cc741192afe181d68a47092693b4c.jpg' ]; // 獲取上一頁的DOM var oPre = document.querySelector(".pre"); // 獲取下一頁的DOM var oNext = document.querySelector(".next"); // 獲取圖片的DOM var oImg = document.getElementsByTagName("img")[0]; // 定義當前是第幾張 var currentIndex = 0; var imgLength = imgs.length; // 上一頁點選事件 oPre.onclick = function() { currentIndex = currentIndex === 0 ? imgLength-1 : --currentIndex; // 更換圖片的src tab(currentIndex); }; // 下一頁點選事件 oNext.onclick = function() { currentIndex = currentIndex === imgLength-1 ? 0 : ++currentIndex; tab(currentIndex); }; // 更換圖片的src函式 function tab(currentIndex) { console.log(currentIndex); oImg.src = "http://www.boyalibrary.com/dist/"+imgs[currentIndex]; document.title = "第" + (currentIndex+1) + "張"; } } </script> </body> </html>

3、無序載入

通過下面程式碼,我們可以知道圖片目前載入的程序,並且可以當所有圖片載入完成以後再顯示。
這裡寫圖片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>無序載入</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body,html {
            height: 100%;
        }
        .content {
            width: 800px;
            height: 400px;
            margin: 0 auto;
        }
        img {
            width: 100%;
            height: 100%;
        }
        .btn-div {
            margin-top: 30px;
            text-align: center;
        }
        button {
            padding: 10px 20px;
            width: 100px;
            background-color: #cdcdcd;
            border: none;
            margin: 0 20px;
            outline: none;
        }
        button:hover {
            color: white;
            cursor: pointer;
            background-color: orange;
        }
        .mask {
            position: fixed;
            font-size: 50px;
            text-align: center;
            width: 100%;    
            height: 100%;
            background-color: #cdcdcd;
        }
        p {
            margin-top: 200px;
        }
    </style>
</head>
<body>
    <div class="mask">
        <p class="progress">0 %</p>
    </div>
    <div class="content">
        <img src="http://www.boyalibrary.com/dist/08fa276c6fcc523c9e134a6eeea56a39.jpg" />
    </div>
    <div class="btn-div">
        <button class="pre">上一頁</button>
        <button class="next">下一頁</button>
    </div>
    <script type="text/javascript">
        window.onload = function() {
            var imgs = [
                '08fa276c6fcc523c9e134a6eeea56a39.jpg',
                '15f913bf2a8158220dca1fda61e6fe82.jpg',
                '825bd9f1e267b7ebadff9b5e6fbd79f7.jpg',
                '86793912ba0e2872126b3717752a08dd.jpg',
                'c835cc910976860779f38256b9f843f2.jpg',
                'c5396d5ae4bf830fed68690c8e828f9c.jpg',
                'ca8cc741192afe181d68a47092693b4c.jpg'
            ];
            var oMask = document.querySelector(".mask");
            var oProcess = oMask.querySelector(".progress");
            var imgLength = imgs.length;
            var count = 0;
            //圖片預載入核心程式碼
            for(var i=0; i<imgLength; i++) {
                var imgObj = new Image();
                imgObj.error=imgObj.onload = function() {
                    oProcess.innerHTML = '已載入'+Math.round((++count/(imgLength))*100) + ' %';
                    // 載入完成
                    if(count === imgLength){
                        oMask.style.display = 'none';
                    }
                }
                imgObj.src = "http://www.boyalibrary.com/dist/"+imgs[i];
            }

            // 獲取上一頁的DOM
            var oPre = document.querySelector(".pre");
            // 獲取下一頁的DOM
            var oNext = document.querySelector(".next");
            // 獲取圖片的DOM
            var oImg = document.getElementsByTagName("img")[0];
            // 定義當前是第幾張
            var currentIndex = 0;
            // 上一頁點選事件
            oPre.onclick = function() {
                currentIndex = currentIndex === 0 ? imgLength-1 : --currentIndex;
                // 更換圖片的src
                tab(currentIndex);
            };
            // 下一頁點選事件
            oNext.onclick = function() {
                currentIndex = currentIndex === imgLength-1 ? 0 : ++currentIndex;               
                tab(currentIndex);
            };
            // 更換圖片的src函式
            function tab(currentIndex) {
                console.log(currentIndex);
                oImg.src = "http://www.boyalibrary.com/dist/"+imgs[currentIndex];
                document.title = "第" + (currentIndex+1) + "張";
            }
        }
    </script>
</body>
</html>

4、有序載入

通過圖片載入程序圖,我們可以知道圖片載入是很有順序的,在很多場景這是很實用的
這裡寫圖片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>有序載入</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body,html {
            height: 100%;
        }
        .content {
            width: 800px;
            height: 400px;
            margin: 0 auto;
        }
        img {
            width: 100%;
            height: 100%;
        }
        .btn-div {
            margin-top: 30px;
            text-align: center;
        }
        button {
            padding: 10px 20px;
            width: 100px;
            background-color: #cdcdcd;
            border: none;
            margin: 0 20px;
            outline: none;
        }
        button:hover {
            color: white;
            cursor: pointer;
            background-color: orange;
        }
    </style>
</head>
<body>
    <div class="content">
        <img src="http://www.boyalibrary.com/dist/08fa276c6fcc523c9e134a6eeea56a39.jpg" />
    </div>
    <div class="btn-div">
        <button class="pre">上一頁</button>
        <button class="next">下一頁</button>
    </div>
    <script type="text/javascript">
        window.onload = function() {
            var imgs = [
                '08fa276c6fcc523c9e134a6eeea56a39.jpg',
                '15f913bf2a8158220dca1fda61e6fe82.jpg',
                '825bd9f1e267b7ebadff9b5e6fbd79f7.jpg',
                '86793912ba0e2872126b3717752a08dd.jpg',
                'c835cc910976860779f38256b9f843f2.jpg',
                'c5396d5ae4bf830fed68690c8e828f9c.jpg',
                'ca8cc741192afe181d68a47092693b4c.jpg'
            ];
            var imgLength = imgs.length;
            var count = 0;
            load();
            function load() {
                var imgObj = new Image();
                imgObj.onload = imgObj.onerror = function() {
                    if(count < imgLength) {
                        load();
                    }
                    count++;
                }
                imgObj.src = "http://www.boyalibrary.com/dist/"+imgs[count];
            }

            // 獲取上一頁的DOM
            var oPre = document.querySelector(".pre");
            // 獲取下一頁的DOM
            var oNext = document.querySelector(".next");
            // 獲取圖片的DOM
            var oImg = document.getElementsByTagName("img")[0];
            // 定義當前是第幾張
            var currentIndex = 0;
            // 上一頁點選事件
            oPre.onclick = function() {
                currentIndex = currentIndex === 0 ? imgLength-1 : --currentIndex;
                // 更換圖片的src
                tab(currentIndex);
            };
            // 下一頁點選事件
            oNext.onclick = function() {
                currentIndex = currentIndex === imgLength-1 ? 0 : ++currentIndex;               
                tab(currentIndex);
            };
            // 更換圖片的src函式
            function tab(currentIndex) {
                console.log(currentIndex);
                oImg.src = "http://www.boyalibrary.com/dist/"+imgs[currentIndex];
                document.title = "第" + (currentIndex+1) + "張";
            }
        }
    </script>
</body>
</html>

4、基於使用者行為的載入

當我們將滑鼠移動上去的時候進行載入,這樣的主要好處是為伺服器減輕壓力,如果使用者不點選檢視,我們就不載入了。
這裡寫圖片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>基於使用者行為的載入</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body,html {
            height: 100%;
        }
        .img {
            width: 800px;
            height: 400px;
            margin: 0 auto;
        }
        img {
            width: 100%;
            height: 100%;
        }
        .btn-div {
            margin-top: 30px;
            text-align: center;
        }
        button {
            padding: 10px 20px;
            width: 100px;
            background-color: #cdcdcd;
            border: none;
            margin: 0 20px;
            outline: none;
        }
        button:hover {
            color: white;
            cursor: pointer;
            background-color: orange;
        }
    </style>
</head>
<body>
    <div class="img">
        <img src="http://www.boyalibrary.com/dist/08fa276c6fcc523c9e134a6eeea56a39.jpg" />
    </div>
    <div class="btn-div">
        <button class="pre">上一頁</button>
        <button class="next">下一頁</button>
    </div>
    <script type="text/javascript">
        window.onload = function() {
            var imgs = [
                '08fa276c6fcc523c9e134a6eeea56a39.jpg',
                '15f913bf2a8158220dca1fda61e6fe82.jpg',
                '825bd9f1e267b7ebadff9b5e6fbd79f7.jpg',
                '86793912ba0e2872126b3717752a08dd.jpg',
                'c835cc910976860779f38256b9f843f2.jpg',
                'c5396d5ae4bf830fed68690c8e828f9c.jpg',
                'ca8cc741192afe181d68a47092693b4c.jpg'
            ];
            // 獲取上一頁的DOM
            var oPre = document.querySelector(".pre");
            // 獲取下一頁的DOM
            var oNext = document.querySelector(".next");
            var imgLength = imgs.length;
            var loadIndex = 0;
            function load(loadIndex) {
                var imgObj = new Image();
                imgObj.src = "http://www.boyalibrary.com/dist/"+imgs[loadIndex];
            }
            oPre.onmouseover = function() {
                loadIndex = loadIndex === 0 ? imgLength-1 : --loadIndex;
                load(loadIndex);
            }
            oNext.onmouseover = function() {
                loadIndex = loadIndex === imgLength-1 ? 0 : ++loadIndex;
                load(loadIndex);
            }

            // 定義當前是第幾張
            var currentIndex = 0;
            // 獲取圖片的DOM
            var oImg = document.getElementsByTagName("img")[0];
            // 上一頁點選事件
            oPre.onclick = function() {
                currentIndex = currentIndex === 0 ? imgLength-1 : --currentIndex;
                // 更換圖片的src
                tab(currentIndex);
            };
            // 下一頁點選事件
            oNext.onclick = function() {
                currentIndex = currentIndex === imgLength-1 ? 0 : ++currentIndex;               
                tab(currentIndex);
            };
            // 更換圖片的src函式
            function tab(currentIndex) {
                console.log(currentIndex);
                oImg.src = "http://www.boyalibrary.com/dist/"+imgs[currentIndex];
                document.title = "第" + (currentIndex+1) + "張";
            }
        }
    </script>
</body>
</html>

(完)寫於2017/11/17 0:33