http://www.cnblogs.com/Wayou/p/3675822.html

.Net开发者一定熟悉下面这个画面:

这就是宇宙第一IDE Visual Studio的启动画面,学名叫Splash Screen(或者Splash Window)。同样,Javar们一定对Eclipse的启动画面不会陌生。不只是IDE,很多桌面程序都会有这个Splash 窗口,在程序进行初始化时显示。

这方面做得最赞的非Adobe旗下的设计类软件莫数了,毕竟是搞艺术出身的啊。博主从PS 8.0用起,每次升级新版本激动的不是新功能,首先是激动新的启动画面。下图是最新CC版PS的Splash Screen。视觉效果震撼的一逼。。张牙舞爪的,无出其右。

启动画面也不是桌面程序所独有,完全可以在我们的网页中实现。并且随着时间的推移,现在Web应用越来纷繁复杂,加载也是很费时的,一个Splash Screen就显得很有必要了不是么。

比如谷哥的Gmail,要是全屏运行,就一个原生App的感觉。

下面我们就来为我们的Web应用加上Gmail一样的Splash Screen。程序可以很渣,若表面功夫到位了同样可以显得高端大气上档次。

效果预览请点我   浏览代码请点我

进度的获取

展示静态图片还好,如果你的启动界面要显示程序进行的进度的话,一个很棘手的问题来了,如何获取进度。经过大量的调研(写过论文的同学都知道,类似 '经过大量实验表明…'的表述其实很有可能是只做了一次实验就开始写结论了)我发现,没有办法获取一个页面的实际下载进度!当然,不排除我孤陋寡闻,如果 你知道这样的方法请告诉我。

对于页面中的异步操作,倒是可以监听到进度的。但也得分情况。HTML5规范中,Ajax多了个progress事件,通过它可以获取异步操作的完成情况,但前提是event.lengthComputable属性为真是才管用。也就是说有些请求的结果我们是可以知道大小的,但更多时候服务器返回的内容的大小是不确定的,这种情况下即使你监听了progress事件也无法获取真实的操作进度。

既然如此,那我们就不要那么死磕,具体进行到百分之几意义不大,我们的目的是提高用户体验,在用户等待的这个过程中有东西可看,或者有一个活着的会 动的东西表明程序还在跑而不是出错了卡死了。所以给用户展示一个会动的进度条即可(我相信大多数带进度条的程序也是这么干的),直到页面全部加载完成时把 进度条托到100%。

插曲:在我探索如何获取页面真实下载进度的过程中,研究了pace.js的 代码,一个做得非常棒的页面加载进度插件,发现他内部也是这么干的,页面上显示的进度并不真实返回页面加载的实现进度,只是不断的增加而以,等页面加载完 了再拖到100%。当然该库写得比较完善,处理了各种情况比如ajax,web socket等。另外就是Gmail,经过大量(也有可能只有两三次,请不必太认真)的刷新页面尝试之后,我发现个规律,它的进度条会一路跑到一个点然后 停下来,然后再一路跑到终点!之前的结论。(不过谷歌拥有牛逼烘烘的工程师,不排除他用了啥高科技算法在里面能够精确地返回页面加载的进度。 Anyway, 如果我这里的结论错,请别太认真找我麻烦)

Nprogress

方便起见,这里使用nprogress这个JS库来显示动画。它提供了很方便的几个API可供我们使用。

NProgress.start() — 启动进度条

NProgress.set(0.4) — 将进度设置到具体的百分比位置

NProgress.inc() — 少量增加进度

NProgress.done() — 将进度条标为完成状态

定义我们的Splash Screen

好的,思路出来了下面我们就开始毫无技术含量的施工。

具体来说,首先页面只显示我们预先定义好的Splash Screen,它要占满整个屏幕且z-index设为页面中最高。

这里直接借用Juri 发表在他博客中的代码,不过我们使用我之前一篇博文《前端冷知识集锦》可提到的技巧,将HTML代码存放在一个script标签中。

<script type="text" id="splash-template"> <div class="splash card"> <div role="spinner"> <div class="spinner-icon"></div> </div> <p class="lead" style="text-align:center">不要回来,马上走开...</p> <div class="progress"> <div class="mybar" role="bar"> </div> </div> </div> </script>

这个splash screen会在HTML加载好之后第一时间显示。接下来就可以这样做了,在页面最开始调用 Nprogress.start()启 动进度条,而在这个splash screen下方遮住的页面中,继续我们程序的初始化,做其他一些非常耗时的操作等。比如你想象一下Gmail,最开始可能页面只有显示进度条那些基本的 HTML和JS代码,然后需要向服务器请求大量的邮件信息,数据接收完后,再组织成HTML生成邮件列表append到页面,但这个过程因为被进度条挡住了,所以我们看不见。等一切就绪,再调用Nprogress.done()将进度条隐藏。这时你看到的就是一个完整的页面了。

事件的顺序

window.onload事件是在整个页面加载完成,包括其中所有图片,iframe等。所以,可以确定在这个事件里面把进度搞到100%是没有问题且逻辑正确的。

确定了何时结束再来看何时开始。既然我们一开始就要显示Splash Window且操作之前定义好的splash screen模板,意思就是说再怎么早开始也得等我们splash screen部分的HTML加载完成之后再进行吧。所以,得到的结论就是把进度条开始的代码放在这部分HTML代码之后,但这种HTML中插JS的做法很 不好,所以最后决定还是放在$(document).ready()里面,因为这个事件是在页面HTML加载完后触发的,但只是DOM,不包括其他比如上面提到的图片,iframe等,所以它是比window.onload先触发的。

所以在页面的head标签里面加入以下代码:

$(function() {NProgress.configure({ template: $('#splash-template').html() }); NProgress.start(); }); $(window).load(function() { NProgress.done(); })

实际应用中更科学的做法其实应该是这样的,页面只有关于进度条的代码,程序的内容全部通过Ajax填充到页面,然后在页面中监视所有Ajax的返回情况。

模拟耗时的操作

一切就绪了,但需要解决一个事情就是如何模拟耗时的操作。我们现在弄的这个例子它不费时,无法看到缓慢的加载效果,并且本地测试,放上几十张图片都会很快就完事。

当然可以用setTimeout来达到目的,但不太科学吧,还是要弄得真实点。于是我们在页面放一个iframe,从其他网站引用页面,这样多少会有些加载的时间。

所以这个例子最后的代码差不多是这样的了:

HTML:

<!doctype html>
<html><head><meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="description" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>splash screen example</title> <link rel="stylesheet" href="nprogress.css"> <link rel="stylesheet" href="main.css"> <script src="jquery.min.js"></script> <script src="nprogress.js"></script> <script type="text/javascript"> $(function(){ NProgress.configure({ template: $('#splash-template').html() }); NProgress.start(); }); $(window).load(function(){ NProgress.done(); }) </script> </head> <body> <script type="text" id="splash-template"> <div class="splash card"> <div role="spinner"> <div class="spinner-icon"></div> </div> <p class="lead" style="text-align:center">不要回来,马上走开...</p> <div class="progress"> <div class="mybar" role="bar"> </div> </div> </div> </script> <iframe id="iframe" style="width: 100%; height: 660px;" src="http://wayou.github.io/SlipHover/" frameborder="0"></iframe> </body> </html>

加入些美化的样式:

CSS:

html,body,iframe{margin: 0; padding: 0; } #nprogress{ position: fixed; top: 0; right: 0; bottom: 0; left: 0; background-color: #f7f7f7; z-index: 999; } .spinner-icon{ display: none!important; } .splash { position:absolute; top:40%; left:0; right:0; margin: auto; } .splash img { display: block; margin-left: auto; margin-right: auto; height: 100px; width: 100px; } .card { background-color: #f7f7f7; padding: 20px 25px 15px; margin: 0 auto 25px; width: 380px; } .mybar { background: #29d; height:10px; } .progress { height: 10px; overflow: hidden; }

现在可以运行页面查看效果了。好了,就这么多。效果预览请点我

Reference

  • Intercept Page Load: https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/Intercepting_Page_Loads
  • Gmail-style progress bar when page is loading http://stackoverflow.com/questions/8020929/gmail-style-progress-bar-when-page-is-loading
  • http://www.gayadesign.com/scripts/queryLoader/
  • https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Monitoring_progress
  • http://api.jquery.com/jQuery.ajax/
  • http://stackoverflow.com/questions/15328275/show-progressbar-while-loading-pages-using-jquery-ajax-in-single-page-website
  • http://www.dave-bond.com/blog/2010/01/JQuery-ajax-progress-HMTL5/
  • http://github.hubspot.com/pace/
  • http://onextrapixel.com/examples/youtube-like-ajax-loading-bar/

Feel free to repost but keep the link to this page please!

为你的Web程序加个启动画面相关推荐

  1. 西门子S7-1200控制5轴伺服程序加维纶触摸屏画面案例

    西门子S7-1200控制5轴伺服程序加维纶触摸屏画面案例. 1.PTO伺服轴脉冲定位控制功能应用+速度模式应用+扭矩模式应用. 2.程序为结构化编程,每一功能为模块化设计,具有一个项目都有的功能:自动 ...

  2. iphone 应用程序图标、启动画面、itune图标等设置

    转自:http://blog.csdn.net/bl1988530/article/details/6698120 先说说应用程序图标,一般有下面几种: Icon.png(57x57) - Homes ...

  3. 通过uwsgi+nginx启动flask的python web程序

    通过uwsgi+nginx启动flask的python web程序 一般我们启动python web程序的时候都是通过python直接启动主文件,测试的时候是可以的,当访问量大的时候就会出问题 pyt ...

  4. QT5.9学习笔记之——程序启动画面

    多数大型应用程序启动时都会在程序完全启动前显示一个启动画面,在程序完全启动后消失.程序启动画面可以显示相关产品的一些信息,使用户在等待程序启动的同了解相关产品的功能,这也是一个宣传的方式.Qt中提供的 ...

  5. Android启动画面实现

    在应用程序中经常用到启动画面,会启动一个后台线程为主程序的运行准备资源. Android要实现启动画面可以这样做: 这是splash.xml布局文件的代码[code]<LinearLayout ...

  6. 从SplashScreen深度探讨App启动画面的前世今生

    /   今日科技快讯   / 近日,特斯拉公布了2021年第四季度以及全年汽车销售和交付数据.数据表示,特斯拉2021年第四季度交付了30.86万辆电动汽车,打破了之前的单季度纪录.就全年而言,特斯拉 ...

  7. Qt启动画面(类似Office)

    #include <QPixmap> #include <QSplashScreen>int main(int argc, char *argv[]) {QApplicatio ...

  8. web应用程序和web网站_Web应用程序和移动应用程序的基本启动清单

    web应用程序和web网站 by Ben Cheng 通过本诚 Web应用程序和移动应用程序的基本启动清单 (The Essential Launch Checklist for Web Apps a ...

  9. oracle 找不到程序单元,Oracle Web ADI 加载时错误:ORA-06508: PL/SQL: 无法在调用之前找到程序单元...

    Oracle EBS 的Web ADI给批量导入数据提供一个不错的解决方案.但是,Web ADI开发比较麻,主要缺点如: 1.集成器设置好以后不能修改,必须要事先考虑包的存储过程或函数的参数.则否,存 ...

最新文章

  1. Structs2 ModelDriven使用方法介绍
  2. Core Data数据操作
  3. C++中1LL避免强制转换
  4. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_06-CMS需求分析-静态门户工程搭建...
  5. matlab画坐标系,Matlab如何绘制十字坐标系??
  6. axure6.5汉化
  7. 最优算法-LQR-离散时间有限边界
  8. 色环在线计算机,多功能电子计算软件(eTools)
  9. JDO持久 (jdbc ejb)
  10. 【oracle】查询===Oracle数据库 子查询(嵌套查询)简单例子
  11. 广告公司到底干什么的?欣奥诚分享
  12. 计算机多系统启动光盘制作,多系统U盘启动盘制作方法图文介绍
  13. Java使用阿里邮箱生成excle邮件附件发送
  14. “国家自主贡献亚洲交通倡议项目-中国部分”启动:实现交通运输零排放,中国至关重要...
  15. pigz 快速压缩命令详解
  16. 网课脚本教程 【基础】(3) 使用 jq 制作简单脚本
  17. 『学了就忘』Linux基础 — UNIX系统介绍
  18. 人性的弱点(卡耐基)读书笔记
  19. html文本框提示文字设置
  20. windows软件跑到最左边无法操作_苹果起头之后,Windows 电脑会投入 ARM 阵营吗?...

热门文章

  1. 学习笔记:App-V测试错误代码4505CD-1690150A-20000194
  2. 【java集合框架源码剖析系列】java源码剖析之ArrayList
  3. 制作U盘启动的并可保持更改更新和设置的BT4最终版完全手册
  4. Windows Installer 3.1
  5. 《『若水新闻』客户端开发教程》——17.软件自动更新
  6. 基于注解的Spring MVC与JPA如何解决实体的延时加载问题
  7. 易天ETU-link 100G QSFP28光模块系列资料
  8. Hexo 搭建个人博客指南
  9. linux查看tomcat安装路径
  10. ONVIFclient搜索设备获取rtsp地址开发笔记(精华篇)