1. 程式人生 > >前端loading效果的實現

前端loading效果的實現

說到頁面loading效果,現在各種PC端和移動端的應用使用loading都十分的廣泛,這是因為頁面的載入時需要時間的,如果頁面載入很快,loading的作用可能還不是特別能夠體現,但是如果當頁面載入速度不是很快甚至很慢的時候,頁面就會出現白屏的狀況,如果沒有使用loading來和使用者進行互動,使用者並不知道應用到底是出現什麼問題(卡死、出錯或者在載入)那麼就會十分的影響使用者體驗,頁面載入所需要時間越長,那麼可能損失的使用者量就會多。所以在恰當的時候使用loading是解決網頁載入緩慢時與使用者互動的最好解決方案。下面就說一說筆者本人如何實現頁面loading效果的。如有大家更好的解決方案,也可以分享出來。

簡單loading效果的實現

loading直譯就是正在載入中的意思,也就是在頁面載入的時候loading效果要出現,頁面載入完成的時候讓其消失。那麼以什麼來判斷頁面載入完成為節點去取消loading效果很重要,DOM元素載入完成,還是頁面中的所有關聯檔案(包括圖片),jquery給出了兩個函式來判斷這兩個節點,$(document).ready()是在頁面上所有DOM元素載入完畢後才執行$(window).load();方法是在網頁中所有的元素(包括元素的關聯檔案)完全載入到瀏覽器後才執行,如何選擇則看實際情況去選擇,筆者使用的是$(window).load()方法,因為頁面上一般來說圖片的載入最耗費時間,弄清楚這個的話,實現起來就不復雜了,在頁面<body>標籤的頂部來新增loading層,以為DOM元素的載入時從上往下的,放在最頂部可以保證loading效果會最早出現。
<div id="loading">
  <img src="photos/loading/2.gif" class="img-responsive">
</div><pre name="code" class="css">
#loading
{
	position:fixed;
	top:40%;
	left:45%;
	z-index:999;
}
載入的動態圖可以自己定義,但是越小越好,以為頁面中圖片的載入時無序的,動態圖太大,可能載入不出來,導致效果無法實現。loading效果出現後,在頁面載入完成後,就要讓其消失。
$(window).load(function(){
	//適當延遲隱藏,提高loading效果
	//$('#loading_all').delay(1000).hide(0);
	$('#loading_bottom').hide(0);
});
到這裡一個簡單的loading效果就完成了,如果不想在每個頁面中都加入loading層,那麼可以寫一個通用的方法,在頁面初始化的時候,向頁面中插入loading層。
var str = "";	
str+="<div id=\"loading\">";
str+="   <img src=\"${ctx}photos/loading/2.gif\" class=\"img-responsive\">";
str+="</div>";
var htmldata = str;
$ ('body *:first').before(htmldata);
下面提供一種針對ajax請求loading效果實現的方法,僅供參考。
$(window).load(function(){
	//為ajax繫結loading_bottom
	$(document).ajaxStart(function(){
		$("#loading").show();//在ajax請求開始的時候啟用loading
	}).ajaxStop(function(){
		$('#loading').hide(0);//在ajax請求結束後隱藏loading
	});
});

仿部分原生APPloading效果的實現

大家可以看到部分原生APP的loading效果是在載入的時候好像先進入一個loading頁面,在目標頁面載入完成後,才跳轉到另一個頁面,在載入過程中你是看不到需要載入的頁面情況的。那麼這個效果應該如何實現?

首先想到的就是在頁面頂部加入一個loading層,這個層的高度和寬度和頁面的高度和寬度應該一樣,並且遮蓋著這個頁面,在這個層的中間加入loading圖或者CSS3寫的loading效果,簡單的思路成型了。

<div id="loading_all">
         <div>
             <img src="photos/loading/1.gif" class="img-responsive">
         </div>
</div>
#loading_all
{        width:100%;
        height:100%;
        position:fixed;
        z-index:999;
        background-color:white;
}
#loading_all div
{
      position:absolute;
    width:60px;
    height:60px;
    top:50%;
    margin-top:-60px;
    left:50%;
    margin-left:-30px;
}
在頁面頂部加入loading層之後,那麼整個真實載入的頁面就被遮蓋了,但是如果下層的頁面高度是高於整個螢幕的高度,那麼就會出現滾動條,使用者在載入的時候是可以拖動滾動條的,雖然loading層的定位是使用fixed,但是還是會影響一些效果,那麼這個時候我們就需要在頁面載入的時候禁用滾動條,然後再頁面載入完成,取消loading效果的時候再恢復滾動條。禁用滾動條就在<body>標籤上加上class="scoll_dis"
/*滾動條禁用*/
.scoll_dis
{
	overflow:scroll;
	overflow-y:hidden;
}

頁面載入完成後恢復滾動條。

$(window).load(function(){
	$('#loading_all').delay(300).hide(0);
	setTimeout(function(){
		$('body').removeClass("scoll_dis");
	},300);
});
PC端的loading效果就完成了,為什麼說PC端,是因為以上禁用滾動條的方法在移動端是無效的,螢幕還是可以被拖動。所以針對移動端,在頁面載入時要禁止螢幕的觸控事件,載入完成後要恢復觸控事件。
//阻止觸控事件
document.addEventListener("touchmove", myFunction);
function myFunction(e) {
	e.preventDefault(); 
}
//解除觸控鎖定
document.removeEventListener("touchmove", myFunction);
這樣一個相容移動端的效果就實現了。