頁面載入進度條實現原理:
將要載入的 js 動態的新增到 head 中,並根據每個是否載入完成,統計當前一共載入完成的個數。當每一項都載入完成,載入成功。設定載入失敗時間。當超過這個時間提示載入失敗。
一、實現邏輯與概念
先我們要知道的是,目前沒有任何瀏覽器可以直接獲取正在載入物件的大小。所以我們無法透過資料大小來實現 0-100% 的載入顯示過程。
因此我們需要透過 html 程式碼逐行載入的特性,在整頁程式碼的若干個跳躍行數中設定節點,進行大概的模糊進度反饋來實現進度載入的效果。大致意思是:頁面每載入到指定區域,則返回 (n)% 的進度結果,透過設定多個節點,來達到一步一步顯示載入進度的目的。
具體是如何設定呢?先我們將網頁分成若干區域,就以 frontopen 來說,網站的結構分為 head 區域、 mian 區域(文章主體部分)、 sidebar 側邊欄、 foot 腳部 四個部分。考慮做一個範圍粗獷一點 進度反饋效果。如下圖:
將進度反饋設定為四個部分:head 部分返回 30% 進度,main 部分返回 60% 進度,sidebar 部分返回 70% 進度,後 foot 載入完成後返回 100% 。
二、實現方法
1. 先我們需要在 html 頁面中,給進度條設定設定一個容器。例如本博的 body 下方會有一個 “
” 的 div 容器,這就是後面我們需要操作並顯示的進度條了,當然大家有興趣的話可以設定更多有個性的進度條。
2. 為 loading 容器設定樣式,以本博的進度條為例,樣式如下:
1
2
3
4
5
6
7
.loading{
background:#FF6100; //設定進度條的顏色
height:5px; //設定進度條的高度
position:fixed; //設定進度條跟隨螢幕滾動
top:0; //將進度條固定在頁面頂部
z-index:99999 //提高進度條的優先層級,避免被其他層遮擋
}
3. 透過 jquery 的 animate 動畫效果,來實現進度條的動畫載入過程。簡單的進行構思,決定使用由左向右的載入效果。終 animate 的執行程式碼為 “$(‘.loading’).animate({‘width’:’100%’},200);”
4. 思考需要設定幾個載入進度節點。上面透過構思,我們已經決定使用 30% 、 60% 、 70% 、 100% 四個進度節點,分別插入到對應的頁面位置。並結合上面的 animate 動畫程式碼,終確定四個進度節點的程式碼為:$(‘.loading’).animate({‘width’:’30%’},50) 、 $(‘.loading’).animate({‘width’:’60%’},50) 、 $(‘.loading’).animate({‘width’:’70%’},50) 、 $(‘.loading’).animate({‘width’:’100%’},50) 。 可能大家會問,為什麼速度變成了 50 毫秒?因為之前一步載入為 100% 的動畫被分成份,所以為了保證動畫的連貫性,將其每份切分成為 50 毫秒。
三、插入到頁面中的實際應用示例
以本博模板頁檔案 index.php 為例,給大家展示四個節點如何插入到對應的位置。當然這個示例只是為了更好的解釋上面的程式策劃結論,並不限於這種設定方法。大家在需要的地方可以發揮更多的想象,舉一反三創造出更絢麗的樣式。
index.php 檔案程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//引用模板的頭部 PHP 檔案
$('.loading').animate({'width':'33%'},50); //個進度節點
$('.loading').animate({'width':'55%'},50); //第二個節點
//引用 sidebar 模板 php 檔案
$('.loading').animate({'width':'78%'},50); //第三個節點
//引用 foot 模板 php 檔案
$('.loading').animate({'width':'100%'},50); //第四個節點
四、程式的補充完善與最佳化
透過上面三步、已經基本可以完成整個 loading 程式的執行。但是進度條載入完成後,無法自動消失?這當然是不行的了,因此我們需要使用另外一段程式碼,在檔案載入完成後將進度條隱藏。
程式碼如下:
1
2
3
$(document).ready(function(){
$(‘.loading’).fadeOut();
});
透過以上設定,即可當頁面 100% 載入完成後,執行 jquery 的 fadeOut 函式,將進度條隱藏,完成整個程式的收尾。