盗版aw的网页加载进度条

网页上的加载进度条

网页上的加载进度条

在换这个主题前我使用过 awflasherTES 主题,主题很优秀,特别是左上角的那个“正在加载”的进度条给我留下了比较深的印象。换上这个主题之后,有点念念不忘,所以就想着把这个效果再实现出来。

awflasher 早先发了一篇文章《给页面加上Loading效果最简单实用的办法》。然而这篇文章只是给页面左上角加了一个红色的提示块,在网页加载完成的时候消失,并没有进度显示功能。aw 在后来的 TES 主题中融入了此功能,可是文章却没有更新,我只好半是摸索半是学习地盗版了此功能。

首先要给网页加上进度条的代码。如 aw 所言,进度条的位置很重要。如果你的 <head> 部分要加载的东西太多,导致网页迟迟显示不出来,那进度条也没必要加了。用户可能等不及进度条显示出来就关闭页面了。针对这个问题,我作了手动的优化,让自己的页面在 <head> 部分只加载 CSS 和 favicon,至于 javascript 统统挪到后面。这样打开网页的时候就能迅速地显示出进度条,起到提示的作用。

HTML 代码我加在 <body> 的后面了,内容如下,这个“载入中”的提示也可以用 Javascript 输出(有利于SEO)

1
2
3
4
5
<div id="progressbar">
<span id="progressdone"></span>
<span id="progressing"></span>
<span id="progresstip">载入中&hellip;</span>
</div>

progressbar 用来包含内部的三个 span,并进行统一的定位。内部的三个 span 各司其职,progressdone 用来显示已完成的进度,progressing 用来显示进度条的底色,progresstip 则是载入中的文字提示。

接下来是三者的 CSS 样式,决定了这个进度条显示出来会是什么样子。

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
#progressbar{
top:0;
left:0;
position:fixed; /* 固定在浏览器窗口的左上角 */
border:none;
z-index:4;
}
#progressbar span{
position:absolute; /* 绝对定位 */
height:1.5em;
opacity:0.6;
}
#progressdone{
background:#888; /* 底色 */
width:100px; /* 进度条宽度 */
z-index:5;
}
#progressing{
background:#454545;  /* 进度的颜色 */
width:6px;  /* 初始宽度 6 */
z-index:5;
}
#progresstip{
font-size:12px;
font-weight:lighter;
text-align:center;
vertical-align:middle;
z-index:7;
width:100px;
color:#FFF;
}

接下来是用 Javascript 来动态地控制进度的显示。由于 js 中并没有一种完善的方法可以判断浏览器加载的情况,所以只好用土办法直接上了。

土办法就是在页面的不同位置加上不同的进度值。比如我的页面在文章显示完后显示为 50%,在评论加载完成后显示为 75%,最后的 25% 留给页面的侧边栏和底部。查看我的页面源代码就可以看到 jQuery 控制的进度值:

1
<script type="text/javascript">$('#progressing').width(25);</script>

没有 jQuery 库也可以直接用 javascript 来搞定

1
2
3
4
5
<script type="text/javascript">
// <![CDATA[
document.write('<style type="text/css">#progressing{width:25px;}</style>');
// ]]>
</script>

这样就实现了对进度的控制,在页面的不同地方放上不同的加载值,这要改一下主题的源文件。

最后在 <body> 前插入一段 js 代码来终止这个进度条的使命:

1
2
3
4
5
6
7
8
9
<script type="text/javascript">
$('#progressing').width(97);
$(document).ready(function(){ // document 加载完的时候
 $('#progressing').width(100);  // 宽度调整为 100px 
 $('#progresstip').html('100%');  // 进度字符显示 100%
 // 停顿 0.5 秒后,将进度条隐藏
 setTimeout(function(){$('#progressbar').hide();}, 500);
});
</script>

没有 jQuery 的版本要麻烦一点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script type="text/javascript">
//<![CDATA[
document.write('<style type="text/css">#progressing{width:97px;}</style>');
 
function hideProgressBar(){
 document.write('<style type="text/css">#progressbar{display:none;}</style>');
}
 
function finishMyProgress(){
 document.write('<style type="text/css">#progressing{width:100px;}</style>');
 document.getElementById('progresstip').innerHTML = '100%';
 setTimeout(hideProgressBar, 500);
}
document.body.onload = finishMyProgress;
//]]>
</script>

折腾完毕,Enjoy!

Close
May 14th, 2009 Add a comment
Home » 爱生活,爱折腾 » 盗版aw的网页加载进度条
Comments (8) Trackback Leave a comment
  1. May 17th, 2009 at 19:01 | #1

    哈哈~不错的小功能~ 有时间把他折腾上去~

  2. May 17th, 2009 at 20:47 | #2

    @吖Bee
    最好同时调整一下 HTML head 中的那些 script ,让这个进度条在第一时间显示出来,不然就没有意义了。

  3. June 28th, 2009 at 10:20 | #3

    要把JQuery调上来了~

  4. June 29th, 2009 at 04:19 | #4

    @吖Bee
    可以从 Google AJAX Library 中加载 jQuery,这样还可以减轻一点主机的压力,速度也有保障。 不过我在 head 部分没有加载任何 js 库,jQuery 还是在 body 部分显示了页面标题和导航部分以后载入的,这样网页的加载看起来会快一点 :-)

  5. October 15th, 2009 at 00:25 | #5

    额。。提交评论时mail没写。结果内容全没。建议最好实在当页提醒。不要转页面。内容就不会丢失了。

  6. October 15th, 2009 at 14:20 | #6

    最后一段关闭的代码后会把浏览器给关闭了。
    没有 jQuery 的版本的那个代码。
    IE6

  7. October 15th, 2009 at 22:04 | #7

    @sok
    多谢提醒~ 不过评论的时候写名字和 mail 在 Wordpress 中已经是惯例了……
    IE6的问题?我倒没测试过这段代码。 我看你的主页上是用 Flash 实现的? 这代价也太大了,而且不是所有的浏览器都支持 flash

  8. October 15th, 2009 at 22:15 | #8

    1.前面说错了。回复的时候也有填写mail。不过忘记加@后缀,这我经常忘记啦。。。然后就转跳到提示错误的界面了~

    2.能写一个范例HTML文件吗?不需要jQuery支持的。这样我也能参考着加到主题里去。

Comments rss
emoticons
提示: 回复作者请直接填写评论。要回复其它人,请点击此人评论右侧的“回复小箭头”,再继续填写评论。你的评论将会被自动发送给此人。
Allowed tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">
Trackbacks (0 ) Detail Trackback