网站预加载进度条的实现

news/2024/5/21 1:16:12/文章来源:https://blog.csdn.net/weixin_30889885/article/details/95236542

我们经常会看到,一些站点在首次进入的时候会先显示一个进度条,等资源加载完毕后再呈现页面,大概像这样:

  \

  然后整个页面的操作就会非常流畅,因为之后没必要再等待加载资源了。尤其是在移动端,或者是页游中,这样做能避免页面出现白屏(等待加载图片),很大程度提升用户体验。那这种技术是如何实现的呢?其实非常简单,本文就来从基础细节探究一番。

为什么需要资源预加载

     大多时候,我们的页面并不是一次渲染完毕的,而是随着用户的操作,不断修改DOM节点,如果你动态插入了一个图片节点,那么浏览器要马上发一个http请求,把图片加载下来然后渲染在页面上,如果用户此时的网速不佳,那么加载这张图片可能就会消耗几秒钟时间,此时页面上什么都没有(白屏)。最坏的情况,如果你的应用图片很多,半天加载不出几张图,用户很可能就在白屏的那几秒跳走了。在游戏中更严重,主角的图片如果加载不出来,让用户玩空气去?

     除了在DOM中插入图片节点,其他凡是涉及到要展示一张新图片的操作,浏览器都得即时去请求图片。比如,为某个节点添加如下css类来增加背景图片:

view sourceprint?
1..bg1{
2.background: url(http://p2.qhimg.com/t01ed1438874f940dc0.jpg);
3.}

  或者是动态修改了src属性、在canvas绘制图片等,这些都会即时请求新资源。

     那么,资源预加载为什么能解决上述问题呢?

     我们预加载的资源,浏览器会缓存下来,再次使用的时候,浏览器会检查是不是已经在缓存中,如果在,则直接用缓存的资源,不发送请求,或者由服务端返回304 not modified(304只带请求头信息,不传输资源)。这样使用一张图片的时间会大大缩减,我们的页面看起来会非常流畅,妈妈再也不用担心用户会跳走了~

     也就是说,预加载的资源我们并不需要手动保存,由浏览器自动放到缓存了。

资源预加载的场景

     什么样的项目需要预加载资源呢?

    范围应该锁定单页面应用,SPA的视图一般都是一步一步来呈现的,各种资源通过异步请求来获取,为了追求原生app般的流畅体验,可以把一些资源预加载下来。当然对于一些业务相关的图片资源,也可考虑延迟加载,但延迟加载不是本文讨论的范畴。

     视图/图片较多的专题页面,或者是需要逐帧图片来完成的动画效果,最好都要做预加载。

     HTML5游戏,图片一般都比较多,而且很多逐帧动画,必须要预加载,事实上一些游戏引擎都会提供相应功能。

     哪些资源需要预加载呢?

     web中包含的资源有很多种,图片、音视频之类的媒体文件,另外就是js、css文件,这些都需要发送请求来获取。那这些资源难道我们都预加载?

     当然不是了,预加载也是需要消耗时间的,总不能让用户等你加载个几十秒钟吧。具体预加载哪些资源,需要基于具体的考虑,也跟你的项目相关。以下是一些我的想法:

     js、css文件不需进行预加载。现在写js基本都用requirejs之类的加载器,而且最后都会进行压缩合并,将请求数降到最低,最终只有一个文件,有些团队甚至还将压缩后的代码直接放在行内,这样一个多余的请求都没有了。

     那么需要预加载的就是媒体文件了,图片、音视频之类。这类资源也得根据实际情况来选择哪些需要预加载。比如大多数页面装饰性图片就需要预加载,而由业务动态获取的图片则无法预加载(预先不知道地址)。用作音效、小动画的音视频可以预加载,一个半小时长的视频就不能预加载了。

预加载的原理与加载进度的获取

     上面都是纸上谈兵的一些观点,下面我们该从技术的角度来思考一下预加载该如何实现。

     原理其实也相当简单,就是维护一个资源列表,挨个去加载列表中的资源,然后在每个资源加载完成的回调函数中更新进度即可。

     以图片为例,大致的代码应该是这样:

view sourceprint?
1.var image = new Image();
2.image.onload = function(){};
3.image.onerror = function(){};
4.image.src = url;

     这样就OK啦,图片已经进缓存,留着以后使用吧。

     再说进度,这个进度严格来讲并不是文件加载的实时进度,因为我们只能在每个文件加载完成的时候执行回调,无法像timeline中那样拿到文件加载的实时进度。

     计算方法就很简单了,当前加载完的资源个数/资源总数*100,就是加载进度的百分比了。

资源预加载小插件:resLoader.js介绍

     本文的重点终于来了。。。额

     根据上面的原理,我写了一个插件,用来做资源预加载。

     具备的特征如下:

         1. 自定义资源列表,用于预加载

         2. 自定义onProgress,想展示成进度条还是百分比数字还是个性的设计都可

         3. 开始和结束可配置回调函数

         4. 只支持图片的预加载

         5. 支持amd、cmd加载器加载,同时支持直接用<script>标签引入使用

         6. 不依赖其他库

     用法如下:

view sourceprint?
01.var loader = new resLoader({
02.resources : [
03.'http://p2.qhimg.com/t01ed1438874f940dc0.jpg',
04.'http://p9.qhimg.com/t01b4ff03b72c7dc6c7.jpg',
05.'http://p2.qhimg.com/t01dd90dfbec92074d0.jpg',
06.'http://p7.qhimg.com/t01cfec6d87cde457c5.jpg',
07.'http://p9.qhimg.com/t01943ced462da67833.jpg',
08.'http://p0.qhimg.com/t01943ced462da67833.jpg',
09.'http://p6.qhimg.com/t01aa15a7ba7ccb49a7.jpg',
10.'http://p8.qhimg.com/t010f1e8badf1134376.jpg',
11.'http://p8.qhimg.com/t01cf37ea915533a032.jpg',
12.'http://p3.qhimg.com/t0193d8a3963e1803e9.jpg',
13.'http://p3.qhimg.com/t01cd6a4d4b4bd4457b.jpg'
14.],
15.onStart : function(total){
16.console.log('start:'+total);
17.},
18.onProgress : function(current, total){
19.console.log(current+'/'+total);
20.var percent = current/total*100;
21.$('.progressbar').css('width', percent+'%');
22.$('.progresstext .current').text(current);
23.$('.progresstext .total').text(total);
24.},
25.onComplete : function(total){
26.alert('加载完毕:'+total+'个资源');
27.}
28.});
29. 
30.loader.start();

  各项参数都直接明了,不再多说了。在上面的例子中,我自己定义onProgress函数,做了一个简单的进度条,你也可以做其他实现。函数为你传入了current和total,分别表示当前完成的资源个数和资源总个数,可用于计算进度。

  效果可看在线demo:点击这里

  另外附上下载地址,感兴趣的朋友可以拿去使用:http://files.cnblogs.com/files/lvdabao/resLoader.zip

再多说两句,关于xhr2新特性

     前边的废话貌似有点多。。。想直接用插件的下载下去用就好,有问题在此留言讨论。

     这里想多说的东西是关于加载进度的,我上面说了我们只能获取到的是进度其实是离散的点,不是连续的。其实利用HTML5的xhr2的新特性我们也可以尝试获取更加精确的进度。因为xhr2新增了一个非常有趣的特性:可以从服务端获取文件数据。我们以前从服务端返回的数据都是字符串,现在可以直接返回Blob类型的文件。那么在这里做一个猜想,能不能利用此特性,做更加精确的进度计算呢?我在此处只是提出一种可能性,还未做实践。我们知道xhr2新增的upload属性可以让我们获取到文件上传的进度信息,但对于返回的数据,却无法直接提供进度信息,所以要想依靠它来实现还得做其他工作。

转载于:https://www.cnblogs.com/lee-my/p/loader.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_702015.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ai字体素材网站_4个网站,涵盖几乎所有素材,字体、设计、图片各种资源管够...

最近发现了几个优质的网址导航&#xff0c;收录了各类素材网站&#xff0c;提供各类字体素材、高清图片、在线设计网站&#xff0c;还有很多办公小工具。01字体酷站https://www.fonturl.com/ 全球最大的字体网址导航网站网站收录了大量优质字体素材&#xff0c;左侧为各种字体相…

关于移动端架构的好的学习网站

1、这个主要讲IM SDK架构的设计&#xff1a; http://tech.youzan.com/you-zan-im-sdk-ke-hu-duan-she-ji/ 2、这个http://casatwy.com 关于IOS应用架构的内容比较多哦&#xff0c;而且很不错哦。 转载于:https://www.cnblogs.com/goodboy-heyang/p/4675814.html

对学校公开课信息网站一次渗透测试

首先在班群里看见有公开课报名链接&#xff0c;于是打算随意试试。毕竟看到网站试运行&#xff0c;嘿嘿嘿。 打开网站&#xff0c;是这样的&#xff1a; 看到有上传信息的网页&#xff1a; 点击后页面信息如下&#xff1a; 看到查看信息的按钮&#xff0c;说明这里有数据库交互…

wordpress网站后台打开速度很卡很慢解决方法?

为什么80%的码农都做不了架构师&#xff1f;>>> wordpress网站后台打开速度很慢的原因&#xff1a; wordpress使用了Open Sana字体&#xff0c;该字体的文件存放在美国Google的服务器上。当你打开网站的时&#xff0c;左下角会一直加载fonts.googleapis.com信息&am…

PageAdmin CMS网站建设教程:如何实现信息的定时发布

PageAdmin Cms发布文章时候有一个上线时间设置和下线时间设置&#xff0c;网站编辑人员可以利用这个功能来实现定时发布&#xff0c;在信息发布界面&#xff0c;如下图&#xff1a; 设置后就会自动加入定时任务中&#xff0c;注意这个功能需要再系统设置>>自动任务执行间…

html中 主标题与副标题,wordpress首页SEO:让主标题+副标题作为页面title

很喜欢用wordpress&#xff0c;主要原因还是在于网络上有无穷无尽的模板主题。但有的时候&#xff0c;很多模板主题设置后&#xff0c;网站首页的title只显示网站的名称&#xff0c;这对于品牌站来说&#xff0c;也许正合适&#xff0c;但对于小站来说&#xff0c;却不太适合SE…

使用varnish + nginx + lua搭建网站的降级系统

前言通常一个网站数据库挂掉后&#xff0c;后果将是非常严重的。基本上整个网站基本不可用了。对于一些网站来说&#xff0c;当数据库挂掉后&#xff0c;如果能提供基本的浏览服务&#xff0c;也是不错的。本文将尝试使用 varnish nginx lua 搭建网站降级系统来实现整个目标。…

一个好的网站,应该用什么样的空间or服务器?建站基础知识普及

今天就针对服务器这块给大家普及这块知识&#xff0c;记得分享哦~定义服务器指一个管理资源并为用户提供服务的计算机软件&#xff0c;通常分为文件服务器、数据库服务器和应用程序服务器。运行以上软件的计算机或计算机系统也被称为服务器。一般俗称的“网站空间”就是专业名词…

读书笔记-大型网站技术架构(核心原理与案例分析)

一、大型网站架构演化 1.1 大型网站软件系统的特点 高并发、大流量&#xff1b;高可用&#xff1b;海量数据&#xff1b;用户分布广泛&#xff0c;网络情况复杂&#xff1b;安全环境恶劣&#xff1b;需求快速变更&#xff0c;发布频繁&#xff1b;渐进式发展&#xff1b; 1.2 大…

利用requests库访问网站

1、关于requests库 函数 Response对象包含服务器返回的所有信息&#xff0c;也包含请求的Request信息。 访问百度二十次 import requests def getHTMLText(url):try:rrequests.get(url,timeout30)r.raise_for_status()r.encodingutf-8return r.status_codeexcept:return"&…

夺命雷公狗---微信开发57----微网站之jquery_mobile之入门案例

这节课我们主要用到到jquery_mobile来实现一个点电影播放网站 jquery_mobile&#xff08;简称JQM&#xff09;其实就是基于jquery开发出来的一套移动端框架&#xff0c;适应移动用户端市场对浏览与体验从而进一步的提升 jquery_mobile控件介绍 jquery_mobile的语法将各个控件(w…

关于大型网站技术演进的思考(一)--存储的瓶颈(1)

前不久公司请来了位互联网界的技术大牛跟我们做了一次大型网站架构的培训&#xff0c;两天12个小时信息量非常大&#xff0c;知识的广度和难度也非常大&#xff0c;培训完后我很难完整理出全部听到的知识&#xff0c;今天我换了个思路是回味这次培训&#xff0c;这个思路就是通…

wordpress网站后台打开速度很慢解决方法?

今天就和朋友们分享下&#xff0c;wordpress网站后台最近打开速度很慢的原因及解决方法。推荐第三种方法 方法/步骤 1、安装插件&#xff1a;在插件中搜索 Disable Google Fonts&#xff0c;选择安装&#xff0c;然后启用&#xff0c;这样就可以禁止Google字体的加载&#xff0…

二级域名怎么设置_怎么建设自己的网站?看完这四个步骤你就明白了

1.前期调研前面我们说过了&#xff0c;市面上有很多第三方建站工具可选择。但是&#xff0c;其实这些建站工具鱼龙混杂&#xff0c;很多都又丑又难用&#xff0c;审美也不到位&#xff0c;导致网站显得很乱。所以一定要选择一个靠谱的建站平台&#xff0c;这样才能节省时间&…

通过a标签在页面上显示视频网站中的视频

1、把视频传到优酷、腾讯等视频网站中 <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title></title><style>*{margin:0;padding:0;}.video .mask{display:none;}.video{width:100%;position:r…

php实现中英文网站插件,多语言网站方案

我的网站目前是中文网站&#xff0c;现在想建一个英文的网站、日文网站、德语网站等等1、创建站点创建站点之后切换到这个站点2、创建对应的语言文件目录复制目录:/api/language/zh-cn/ 到 /api/language/en/再把里面文件的中文翻译成英文在打开文件api/language/en/ueditor.js…

JavaWeb-网站在线用户信息、网站访问量以及管理踢出用户实例

转载请注明出处&#xff1a; http://blog.csdn.net/qq_26525215 本文源自【大学之旅_谙忆的博客】 这个稍微比上个版本做得完善了一点&#xff0c;用了JavaBean来封装用户信息&#xff0c;添加了一个管理踢用户的功能。 上一个的用户访问量是通过监听request来统计的&#xff…

iptables的conntrack表满了导致访问网站很慢

iptables的conntrack表满了导致访问网站很慢 转载自&#xff1a;https://my.oschina.net/jean/blog/189935 检查系统conntrack表是否满 现象&#xff1a;突然发现访问网站很慢&#xff0c;服务器的cpu、内存和磁盘使用率都正常分析过程及解决方案&#xff1a;查询/var/log/mess…

angular2-baidu-map网站中使用百度地图

效果图 1、安装 npm install angular2-baidu-map --save 2、在主模块中注册 app.module.ts import {BaiduMap} from "angular2-baidu-map";组件中导入 declarations: [BaiduMap ] 3、创建组件使用地图 baidu.component.ts import {Component, OnInit} from angular/c…

学生成绩管理网站之——课程视频分享实现

2019独角兽企业重金招聘Python工程师标准>>> 参考网页&#xff1a; https://owncloud.org/https://bitnami.com/stack/lamp/modules#owncloud一、引言 之前使用 xampp 跟其他工具&#xff0c;总是不能愉快的一起干活。时间过去了两年多&#xff0c;竟然有了 modules…