`
sskhnje
  • 浏览: 16386 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
文章分类
社区版块
存档分类
最新评论

(转)为你的Web程序加个启动画面

 
阅读更多
转自:http://developer.51cto.com/art/201404/436336.htm

2014-04-21 16:24 @刘哇勇 博客园 字号:T | T
一键收藏,随时查看,分享好友!
启动画面也不是桌面程序所独有,完全可以在我们的网页中实现。并且随着时间的推移,现在Web应用越来纷繁复杂,加载也是很费时的,一个Splash Screen就显得很有必要了不是么。
AD:51CTO学院:IT精品课程在线看!
.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
分享到:
评论

相关推荐

    为你的Web程序加个启动画面

    综上所述,为Web程序添加启动画面是通过模拟进度条和动态更新视觉元素来提高用户体验的一种方法。虽然无法获取确切的页面加载进度,但我们可以通过创建动态的、模拟的进度条来让用户感受到程序的运行状态,从而提升...

    一个带启动画面的小程序

    标题中的“一个带启动画面的小程序”指的是一个计算机应用程序,它在启动时会显示一个短暂的界面,通常称为启动画面或加载屏幕。这种画面在软件启动过程中为用户提供反馈,表明程序正在准备运行,同时也可以展示品牌...

    zinemaker模板编辑器制作启动画面密码

    启动画面(splash screen)是指应用程序启动时首先展示给用户的界面。通常情况下,启动画面会包含应用的品牌标识、logo或者一段简短的动画。对于数字出版物而言,一个吸引人的启动画面不仅能增强用户体验,还能有效...

    .NET WEB应用程序打包过程指导

    在本篇文章中,我们将详细介绍如何将.NET Web应用程序打包为安装文件,并设置安装过程是否新建数据库,以程序安装的方式替代部署的过程。 一、建立安装包 首先,打开需要部署的Web应用程序,右键单击解决方案:...

    .net web影城程序打包成安装文件

    标题中的".net web影城程序打包成安装文件"是指使用.NET框架开发的Web应用程序,为了方便用户安装和部署,将其打包成一个可执行的安装文件。这个过程涉及到多个步骤,包括创建安装包、添加应用程序、设置安装包名称...

    简易方法淡入淡出启动画面.zip

    在IT领域,淡入淡出启动画面是一种常见的用户体验设计,特别是在移动设备和应用程序中,它为用户提供了平滑且引人入胜的启动过程。这个压缩包“简易方法淡入淡出启动画面.zip”可能包含了一套实现这种效果的资源和...

    MyPWAs:安装其他渐进式Web应用程序的渐进式Web应用程序

    2. **添加到主屏幕**:通过Web App Manifest文件,PWA可以设置自定义图标、启动画面和应用元数据,使得用户可以像原生应用一样将其添加到手机或桌面的主屏幕。 3. **安全**:PWA通常需要通过HTTPS协议提供服务,以...

    SplashUpdate:显示更新程序的启动画面

    在程序启动时,先显示这个Form,然后在后台执行更新检查和下载任务,当更新完成后再关闭启动画面并打开主应用程序。 2. **WPF**:如果你需要更丰富的视觉效果和动画,WPF提供了更多的可能性。WPF允许使用XAML语言来...

    用VC++实现FLASH的UI启动画面

    通过使用 ActiveX 控件在 VC++ 应用程序中的使用方法,实现了 FLASH 的 UI 启动画面,开发了一套友好美观的应用程序界面。 一、VC++ 和 MFC VC++ 是 Microsoft 的一个非常好用的 C++ 编程工具,它的最大优势就是有...

    unity3d调用web窗体 跟windows窗体 .exe

    这行代码将启动一个名为 `WindowsFormsApplication4.exe` 的外部应用程序。 2. `Process.Start("IExplore.exe","http://127.0.0.1/phpinfo.php");` 这行代码将启动 Internet Explorer 并打开指定的网页。 使用 C# ...

    LabVIEW Web Server 设计

    LabVIEW Web Server 设计是一种利用LabVIEW开发的强大功能,使得用户可以通过Web浏览器远程监控和控制运行在服务器端的LabVIEW应用程序。这一特性使得用户无需在服务器端直接操作,即可实现远程的数据采集、分析和...

    模仿UC等软件启动画面加载时闪烁点的样式

    "模仿UC等软件启动画面加载时闪烁点的样式"是一个典型的UI动画设计案例,这种效果常见于许多应用的启动过程中,用于提升用户体验并展示加载进度。通过闪烁的点阵,用户可以感知到应用程序正在后台初始化和加载资源,...

    Java文档编辑器,学习Java界面,启动画面

    启动画面(Splash Screen)是程序启动时显示的临时窗口,通常包含应用程序的logo和加载进度。在Java中实现启动画面,可以使用`java.awt.SplashScreen`类,它允许开发者自定义图像和动画,提供更好的用户体验。正确...

    web2splash:使用 HTML 文档作为模板的 PhoneGap 启动画面生成器

    Web2Splash 将为每个 PhoneGap 平台生成每个启动画面。 启动画面是在您的 PhoneGap 应用程序加载时显示的启动图像。 由于图像需要匹配设备的屏幕尺寸,您通常需要为每个平台创建多个图像。 更令人讨厌的是,大多数...

    WinCC Web Navigator的发布步骤.docx

    WinCC Web Navigator 是 Siemens 公司基于 WinCC 软件平台开发的一款 Web 应用程序,可以将控制画面转换为 Web 页面,通过浏览器进行监控。下面是 WinCC Web Navigator 的发布步骤: Step 1: 转换画面 在发布之前,...

    icongenie:用于为Quasar应用程序生成所有图标和启动画面的CLI工具

    移至Quasar的核心仓库: :Quasar Framework图标精灵一个Quasar工具,用于生成所有Quasar App的图标和启动画面什么是Icon Genie 该节点模块从原始的1240x1240正方形图标输出一组SQUARE图标,web图标,pwa图标和电子...

    splashr:一个React组件,无需花很多功夫即可将启动画面添加到您的Web应用程序中

    一个React组件,无需花很多功夫即可将启动画面添加到您的Web应用程序中。 :red_heart: 它? :star: 可以在或上它。 版本0.3.x中的新功能 支持和组件的延迟加载(有关详细信息,请参见下文)! 安装 $ npm i ...

    CIMPLICITY 的Webspace 配置步骤

    - 选择的启动画面应为CIMPLICITY工程中已存在的画面。 - 该画面将成为Web访问时的初始界面。 ##### 4. 创建并定义HTML文件 - 点击“Browse Page”按钮创建并定义一个用于WEB发布的HTML文件。 - 假设创建的HTML...

    基于PLC的web服务的局域网远程控制

    在 Web 服务应用中,用户可以通过网络来远距离控制或检查 PLC 的故障情况,还可以做画面和 HMI 有着像似性,方便了维护人员,提高了工作效率。这项技术有很大的应用空间。 知识点八:PLC 编程 在 PLC 编程中,需要...

    大华摄像头直连插件webplugin.exe

    其中,"webplugin" 是这个组件的名字,它是一个可执行文件,可能基于Windows操作系统设计,能够集成到浏览器或其他应用程序中,提供视频流的处理和显示。 描述中提到的功能细节进一步揭示了webplugin.exe的实用性和...

Global site tag (gtag.js) - Google Analytics