原生JS實(shí)現(xiàn)首頁進(jìn)度加載動畫
js進(jìn)度加載動畫程序是本人的個人作品,寫的不好,可以參考,但未經(jīng)本人允許,請不要用于其它用途!
早上寫了個首頁進(jìn)度加載動畫,本想在我的博客里用上,測試發(fā)現(xiàn)博客園加載太快,根本看不到動畫效果,直接就加載‘Complete'了,算了,還是不要把博客搞得太臃腫了!
于是我就寫了個演示頁面,在body里加了個iframe來加載大一點(diǎn)的網(wǎng)站,這樣就看出效果了!
用Safari打開貌似CSS動畫的播放時間變成同步了,不知道什么原因,本地測試又沒問題(請大神指點(diǎn)?。?,用Chrome、Firefox倒是沒問題,而IE我沒測試過
加載時間統(tǒng)計我用了Windows對象的performance屬性,它是專門用來來計算精確時間的方法,這是MDN關(guān)于performance屬性的描述
本實(shí)例的實(shí)現(xiàn)原理比較簡單,不過不是真正的按文件大小來顯示加載進(jìn)度的,只是在觸發(fā)document.onreadystatechange事件時,根據(jù)document.readyState的狀態(tài)來改變顯示進(jìn)度的。其實(shí)還有一種靠譜一點(diǎn)的方法,用XMLHttpRequest對象的實(shí)例的progress事件,詳細(xì)解讀XMLHttpRequest,如:
var request = new XMLHttpRequest();
request.onprogress = function (e) {
if(e.lengthComputable){ //lengthComputable是指文件是否有大小,值為true、false
progress.innerHTML = Math.round(100* e.loaded/ e.total) + \'%\'; //loaded、total表示已經(jīng)加載的大小和總大小
}
}
用以上方法實(shí)現(xiàn)起來也挺麻煩,而且也不能實(shí)現(xiàn)100%的真實(shí)加載進(jìn)度,所以我索性就假一點(diǎn)了,不用他了!
本實(shí)例還用到了document.styleSheets[0].insertRule()方法,這里有我對它的總結(jié):用原生JS讀寫CSS樣式的方法總結(jié)
關(guān)于CSS動畫的實(shí)現(xiàn),大家自己看代碼吧,很簡單的代碼,如果看的吃力,建議去補(bǔ)補(bǔ)CSS基礎(chǔ)了,介紹個干貨,CSS中文參考手冊網(wǎng)站,我表達(dá)能力有限,就不在這里嚼口舌了
下面是完整代碼+演示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>蘇福的作品</title>
<script>
document.onreadystatechange = function () {
function $id(id){return document.getElementById(id)}
var width = 0,id,
preloader_line = $id('preloader_line').firstElementChild,
preloader = $id('preloader'),
preloader_center = $id('preloader_center'),
preloader_btn = $id('preloader_btn'),
preloader_loading = $id('preloader_loading');
if (document.readyState == "interactive") {
loading(1,110,50);
}
if (document.readyState == "complete") {
loading(5,120,16.7);
preloader_loading.id = 'preloader_loaded';
preloader_loading.innerHTML = 'Loading Complete'+'<br/>'+'Using: '+performance.now().toFixed(3)+' ms';
preloader_btn.innerHTML = 'E N T E R';
preloader_btn.style.borderBottom = '4px solid green';
preloader_btn.style.fontStyle = 'inherit';
preloader_btn.style.fontSize = '24px';
if(document.styleSheets[0].insertRule){
document.styleSheets[0].insertRule('#preloader_btn:hover{border-bottom: 4px solid green;border-radius: 60px;color: red;}',0);
}else{//兼容IE9以下
document.styleSheets[0].addRule('#preloader_btn:hover{border-bottom: 4px solid green;border-radius: 60px;color: red;}',0);
}
preloader_btn.onclick = function () {
var opacity = 1,id;
function hide(){
if(opacity<=0){
clearTimeout(id);
preloader.style.display = 'none';
document.body.style.overflow = 'auto';
return;
}
opacity -= 0.1;
preloader.style.opacity = opacity;
id = setTimeout(function(){
hide();
},50);
}
hide();
};
}
function loading(step,max,time){
if(width>=max){
clearTimeout(id);
if(max >= 120){
preloader_line.parentNode.style.display = 'none';
}
return;
}
width += step;
preloader_line.style.width = width+'px';
id = setTimeout(function(){
loading(step,max,time);
},time);
}
};
</script>
<style>
body{
overflow: hidden;
}
#preloader{
position: absolute;
width: 100%;
height: 100%;
background-color: white;
z-index: 999;
}
#preloader_center{
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
width: 150px;
height: 75px;
margin:auto;
}
#preloader_loading{
position: absolute;
left: 0;
right: 0;
top: 45px;
margin: auto;
width: 96px;
height: 30px;
}
#preloader_loaded{
position: absolute;
left: 0;
right: 0;
top: 45px;
margin: auto;
font-size: 12px;
text-align: center;
line-height: 30px;
}
#preloader_loading span{
position: absolute;
width: 10px;
height: 2px;
top: 0;
bottom: 0;
margin:auto;
background-color: #9b59b6;
animation: loading 1.5s infinite ease-in-out ;
}
#preloader_loading span:nth-child(2){
left: 12px;
animation-delay: .1s;
}
#preloader_loading span:nth-child(3){
left: 24px;
animation-delay: .2s;
}
#preloader_loading span:nth-child(4){
left: 36px;
animation-delay: .3s;
}
#preloader_loading span:nth-child(5){
left: 48px;
animation-delay: .4s;
}
#preloader_loading span:nth-child(6){
left: 50px;
animation-delay: .5s;
}
#preloader_loading span:nth-child(7){
left: 62px;
animation-delay: .6s;
}
#preloader_loading span:nth-child(8){
left: 74px;
animation-delay: .7s;
}
#preloader_loading span:nth-child(9){
left: 86px;
animation-delay: .8s;
}
@keyframes loading {
0%{height: 2px;background:#9b59b6;}
15%{height: 20px;background:#3498db;}
50%{height: 2px;background:#9b59b6;}
100%{height: 2px;background:#9b59b6;}
}
iframe{width: 100%;height: 1000px;}
#preloader_btn{
position: absolute;
left: 0;
right: 0;
top: 0;
margin:auto;
display: block;
width: 122px;
height: 40px;
font-size: 14px;
text-align: center;
line-height: 40px;
cursor: pointer;
color: #9b59b6;
font-style: italic;
-webkit-transition: all .5s;
-moz-transition: all .5s;
-ms-transition: all .5s;
-o-transition: all .5s;
transition: all .5s;
}
#preloader_line{
position: absolute;
left: 0;
right: 0;
top: 40px;
margin:auto;
width: 120px;
height: 2px;
border: 1px solid green;
}
#preloader_line span{
display: block;
height: 2px;
width: 0;
background-color: green;
}
</style>
</head>
<body>
<div id="preloader">
<div id="preloader_center">
<span id="preloader_btn">Loading...</span>
<span id="preloader_line">
<span></span>
</span>
<div id="preloader_loading">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</div>
</div>
<iframe src="http://jd.com"></iframe>
</body>
</html>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JavaScript canvas實(shí)現(xiàn)加載圖片
- js+HTML5 canvas 實(shí)現(xiàn)簡單的加載條(進(jìn)度條)功能示例
- JS實(shí)現(xiàn)預(yù)加載視頻音頻/視頻獲取截圖(返回canvas截圖)
- JS Canvas定時器模擬動態(tài)加載動畫
- JavaScript實(shí)現(xiàn)網(wǎng)頁加載進(jìn)度條代碼超簡單
- javascript實(shí)現(xiàn)一個網(wǎng)頁加載進(jìn)度loading
- 簡單實(shí)現(xiàn)js進(jìn)度條加載效果
- pace.js頁面加載進(jìn)度條插件
- javascript 實(shí)現(xiàn)頁面加載進(jìn)度條代碼
- JavaScript?canvas實(shí)現(xiàn)水球加載動畫
相關(guān)文章
JSON 數(shù)據(jù)詳解及實(shí)例代碼分析
這篇文章主要介紹了JSON 數(shù)據(jù)詳解及實(shí)例代碼分析的相關(guān)資料,需要的朋友可以參考下2017-01-01
JS防抖節(jié)流函數(shù)的實(shí)現(xiàn)與使用場景
在行走江湖的過程中,會出現(xiàn)很多性能優(yōu)化的問題來讓你手足無措,那么這篇文章主要給大家介紹了關(guān)于JS防抖節(jié)流函數(shù)的實(shí)現(xiàn)與使用場景,針對這兩個問題來為你答疑解惑,需要的朋友可以參考下2021-07-07
javascript數(shù)字?jǐn)?shù)組去重復(fù)項的實(shí)現(xiàn)代碼
console.log 不支持ie,下面的代碼需要在火狐中測試,不然會有問題。2010-12-12

