以前在 Vue 的项目用了 nprogress 这个插件,一直对于其如何得知加载进度充满好奇,最近又看到了「前端如何实现页面加载进度条」这个问题,今天周六恰好一探究竟。以下仅为一家之言,如有异议,欢迎指出。

前端的页面加载进度条有两种

首先不得不说,前端的页面加载进度条其实有两种,所以你得先搞清楚说的是哪一种。

第一种,进度条显示的是 前端静态资源 的加载。比如你打开一个页面,页面需要加载 js、css、img 等静态资源,那么每加载完一个资源(监听 onload 事件或者类似事件),进度条就向前滚动一下,直到加载完所有,进度条到头。

实际操作中,如果不做前置静态资源配置,基本不可能实现,因为你很难在代码中获取页面加载所需要的 js、css、img 资源,假设可以获取,还需要监听它们的 onload 事件,即使能实现这个进度条,也是一件 性价比很低 的事情,除非一个情况。

没错,这个特殊情况就是 游戏资源的加载。我们在写游戏的时候,通常需要把静态资源项目都列出来到配置中,而且,这个资源请求,一般比较耗时,这个时候,我们就需要这样一个进度条,因为前置条件也已经满足(资源已经列出),而如果只是写一个普通的页面,我们一般不会手动去列出静态资源。(具体实现我没有研究过,实际可能更加复杂,详见 这个回答)

第二种情况,也是我们现在通常说的进度条加载,举个简单的例子,GitHub 中就有用到。先打开我的 GitHub 主页 https://github.com/hanzichi,然后点击 tab 中的 Stars 标签,这个时候 url 会变成 https://github.com/hanzichi?tab=stars,进度条开始加载,当页面内容切换过去的时候,进度条结束。

以上实现,其实就是 pjax 的实现,忽略掉 "p" 的部分,其实就是一个普通的 ajax。当页面发起 ajax 请求的时候,显示进度条,ajax 结束的时候,进度条到头,从而实现整个页面加载。这种情况,其实通常都会搭档 SPA 出现。

NProgress

以上第二种情况,业界有个成熟的插件 NProgress。它的 API 非常简单,NProgress.start() 表示进度条开始,NProgress.done() 表示进度条结束。

如果搭配 pjax,可以这样用:

$(document).on('pjax:start', function() { NProgress.start(); });
$(document).on('pjax:end',   function() { NProgress.done();  });

在 Vue 中,可以这样用:

router.beforeEach((to, from, next) => {NProgress.start()next()
})router.afterEach(() => {NProgress.done() // 结束 Progress
})

甚至,普通的页面中也可以用,页面开始的时候 NProgress.start(),window.onload 的回调中运行 NProgress.done()

NProgress.start()NProgress.done() 过程中,进度条会不断加载,时快时慢,这个速度的控制,依赖的是什么?答案是,进度条的进度其实是假的,进度是 NProgress 自己在代码中控制的

我们可以看下 源码,调用 NProgress.start 后,会持续调用 NProgress.inc 方法,我们看下这个方法实现:

NProgress.inc = function(amount) {var n = NProgress.status;if (!n) {return NProgress.start();} else if(n > 1) {return;} else {if (typeof amount !== 'number') {if (n >= 0 && n < 0.2) { amount = 0.1; }else if (n >= 0.2 && n < 0.5) { amount = 0.04; }else if (n >= 0.5 && n < 0.8) { amount = 0.02; }else if (n >= 0.8 && n < 0.99) { amount = 0.005; }else { amount = 0; }}n = clamp(n + amount, 0, 0.994);return NProgress.set(n);}
};

代码中的 amount 就是进度条增量(0 为进度条起始值,1 为进度条终止值),可以从数值上判断,进度条增长速度是越来越慢。当进度条增长到 99.4% 的时候,就停止了,直到调用 NProgress.done() 方法。

其实,某些场景,想获取真实进度也是可以的,xhr2 其实是可以获取进度的,用 ajax 上传文件就可以持续获取进度进行展示,本文就不展开讨论了。

本文的结论是,绝大多数情况下看到的前端页面进度条展示,都是假的,只是特效 ...

浅谈前端实现页面加载进度条以及 nprogress.js 的实现相关推荐

  1. Vue项目实战06:nprogress页面加载进度条

    博客: https://lvsige.top/ nprogress页面加载进度条 前言 很多时候在访问网页的时候我们总是看到页面在加载中,可以却不知道要加载多久,无期限的等待总是让人烦躁不安,所以我们 ...

  2. js网页顶部线性页面加载进度条,jquery头部线性进度条总结

    前言 网页顶部加载进度条,近年来很流行,很多网站都采用了这种加载方式.网上也有这样类似的插件,今天我们总结一下网页顶部线性页面加载进度条. 头部LoadingBar线性进度条总结 上面的代码只是静态效 ...

  3. php+页面加载进度,基于jQuery实现模拟页面加载进度条_jquery

    因为我们无法通过任何方法获取整个页面的大小和当前加载了多少,所以想制作一个加载进度条的唯一办法就是模拟.那要怎么模拟呢? 我们知道,页面是从上往下执行的,也就是说我们可以大致估算出在页面的某个位置加载 ...

  4. jquery实现页面加载进度条(转)

    实现原理: 根据页面执行js的顺序将遮罩层和loading图片最先显示出来,等到页面加载完成后,用js控制图片消失.既在网页的头部放置一个文字或者图片的 loading 状态,然后页尾载入一段 JS ...

  5. Vue:页面加载进度条

    这段时间在踩Ant design pro Vue的坑,发现了个在手机端页面上经常出现的,加载进度条,效果蛮不错的!记录下来. cnpm install --save nprogress import ...

  6. jquery ajax加载页面进度条,基于jQuery实现模拟页面加载进度条

    因为我们无法通过任何方法获取整个页面的大小和当前加载了多少,所以想制作一个加载进度条的唯一办法就是模拟.那要怎么模拟呢? 我们知道,页面是从上往下执行的,也就是说我们可以大致估算出在页面的某个位置加载 ...

  7. 页面加载进度条改进版

    html部分: <div id="loadingbg"></div> <div id="test"><div>& ...

  8. vue 判断页面加载完成_Vue实战040:nprogress页面加载进度条

    前言 很多时候在访问网页的时候我们总是看到页面在加载中,可以却不知道要加载多久,无期限的等待总是让人烦躁不安,所以我们希望能知道网页加载的进度,这样我们就能做到心中有数是否继续等待页面加载.这个功能我 ...

  9. 浅谈《MediaPlayer》加载进度定时刷新

    这是我在CSDN的第一篇博客,也是我第一次写博客,当我踏进"码农"的世界的时候,我就要坚持往下走,学习更多的东西,废话不多说,开始进入正题. 由于才开始从入门到进阶的学习阶段,存在 ...

最新文章

  1. 音频编辑软件_Audacity2.12版
  2. 4'.deploy.prototxt
  3. 处理大并发之一 对异步非阻塞的理解
  4. [XSY3112] 接水果(树上包含路径,整体二分,扫描线)
  5. 【渝粤教育】电大中专电商运营实操 (23)作业 题库
  6. Spring中@Async
  7. git git 查看远程库_如何从Git远程存储库中提取
  8. oracle重建服务器,Oracle重建控制文件的实例教程
  9. ubuntu虚拟机进程被杀死_Linux进程被杀掉(OOM killer),查看系统日志
  10. .Net Core DI,如何在程序集中注册所有现有的可分配类型
  11. LABjs异步加载组件
  12. 零基础怎么开启编程之路 -(第1期)
  13. android热加载随记
  14. 第六章 Dubbo的源码解析
  15. ads2020卸载 ads软件怎么卸载干净ads2016 ads2019卸载不干净无法重新安装 ads2017彻底卸载 ads2017卸载时删不尽
  16. 阿里巴巴实习生面试悲惨经历
  17. 【概念学习】联邦学习的三个类别+【论文阅读】异步联邦学习
  18. java浪漫代码_程序员表白教程,这些代码用过的都说浪漫
  19. 【杂谈】扒一扒Reddit,Medium,Quora与知乎等国内外高质量AI社区与内容平台
  20. android多点触控的理解

热门文章

  1. 人生需要往前看,一直回味过去只会迷失,如果已经开始迷失,请回想初心
  2. 总线制和多线制示意图_再谈总线制与多线制的区别
  3. C语言面试题分享(6)
  4. 对于局部变量_2020年对于JDK ,大家觉得哪个版本好用?
  5. python中area是什么意思_python – 与openCV 3中的contourArea的兼容性问题
  6. ajax带来的主要问题有哪些,ajax面试题
  7. excel mysql实时交换数据_Excel与数据库的数据交互
  8. 底部分页栏_2020年执业药师考试教材各科目增加页数!最多203页
  9. 群晖docker装huginn_应用篇:Docker版Zerotier实现内网穿透
  10. button layui 点击事件_Layui 带多选框表格监听事件以及按钮自动点击写法实例