圖片預載入的那些事兒
阿新 • • 發佈:2019-02-05
前言:最近在給一個創業公司做一個官網,涉及到很多圖片,載入速度不給力,使用者體驗很差。因此自己這次就採用了圖片預處理,在網上也看了一些其他大佬的部落格,收穫很多,在這裡總結一下,分享給大家。
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