HTML中实现页面加载进度条的结构与NProgress库集成方法

阿涛吖_9668

阿涛吖_9668

2026-06-13

584人浏览

原创

nprogress卡在0%或不消失的根本原因是其默认监听document.readystate等全局事件,而spa中需控制路由切换或api请求完成时机。应在vue router的beforeeach启动、aftereach和onerror收起,并对api请求用inc()/done()手动管理计数器,同时注意dom插入点、样式及css过渡兼容性。

html中实现页面加载进度条的结构与nprogress库集成方法

为什么直接用 NProgress 会卡在 0% 或不消失

NProgress 默认依赖 document.readyState 和原生事件(如 DOMContentLoaded、load),但在现代前端项目中,尤其是使用 Webpack/Vite 打包、动态 import、或单页应用(SPA)路由切换时,这些事件无法准确反映「当前页面内容是否加载完成」。常见现象是进度条卡在 0.3 或 0.7 不动,或者跳转后没触发 done(),残留遮罩。

根本原因不是 NProgress 有 bug,而是它默认监听的是 HTML 文档生命周期,而你真正想控制的是「路由切换」或「数据请求完成」这两个更细粒度的时机。

  • SPA 中 window.addEventListener('load', ...) 只触发一次,后续路由变化不会触发
  • 若页面含大量懒加载图片或第三方脚本,load 事件早于内容渲染完成
  • NProgress 的 start() 和 done() 必须成对调用,漏掉任意一次都会导致状态错乱

在 Vue Router 中正确触发 NProgress 的位置

对于 Vue 项目,应把 start() 放在全局前置守卫(router.beforeEach),done() 放在全局后置守卫(router.afterEach),但要注意:后置守卫不捕获导航失败(如 404、守卫抛错),所以必须补上错误处理。

router.beforeEach((to, from, next) => {
  NProgress.start();
  next();
});
<p>router.afterEach(() => {
NProgress.done();
});</p><p>router.onError(() => {
NProgress.done();
});</p>
  • router.beforeEach 是唯一可靠触发「开始加载」的位置,不能放在组件内 mounted —— 那时路由已跳完,进度条一闪就没了
  • router.afterEach 不接收 next,只适合做副作用清理;不要在里面调用异步操作(如 await api.get()),否则 done() 会被延迟
  • 务必加 router.onError,否则路由守卫中 next(false) 或未捕获异常会导致进度条永远不收起

如何让 NProgress 在 API 请求期间也显示

单纯靠路由守卫只能覆盖页面跳转,但用户点击按钮触发数据加载(比如搜索、提交表单)时,也需要进度反馈。这时不能复用 NProgress 的全局状态,而应使用它的「递增模式」+ 手动控制。

Doc To HTML
Doc To HTML

使用 MinerU 文档处理引擎将 Word 文档(.doc、.docx)转换为保留结构和格式的干净 HTML。

下载

关键点:NProgress 支持嵌套调用,start() 每调一次,内部计数器 +1;done() 每调一次,-1;只有计数器归零才真正隐藏进度条。

  • 封装一个请求函数,在发起前调用 NProgress.inc()(比 start() 更轻量,避免重复从 0 开始)
  • 响应成功/失败后都调用 NProgress.done(),确保计数器能清零
  • 避免在同一个操作里混用 start() 和 inc(),它们行为不同:start() 强制重置为 0.3,inc() 是随机微增(如 0.3 → 0.35 → 0.42)

示例:

async function fetchUser(id) {
  NProgress.inc(); // 不用 start()
  try {
    const res = await axios.get(`/api/user/${id}`);
    return res.data;
  } finally {
    NProgress.done();
  }
}

自定义 NProgress 样式与 DOM 插入点避坑

NProgress 默认把进度条插入到 document.body 最前面,如果页面用了 position: fixed 的顶部导航栏,进度条可能被遮挡。修改插入点需在初始化时指定 parent,且该容器必须存在、可定位、z-index 足够高。

  • 不要在 document.body.appendChild(...) 后再初始化 NProgress —— 它会在初始化时自己重插 DOM
  • 推荐写法:NProgress.configure({ parent: '#app', minimum: 0.15 });,其中 #app 是你的根容器,且 CSS 中要确保它有 position: relative 或 position: fixed
  • 修改颜色别直接改 CSS 类名(.bar),而是用 template 配置项替换整个 HTML 结构,否则容易因优先级问题失效
  • minimum 设太低(如 0.01)会导致进度条长时间卡在起点,人眼感知不到变化;设太高(如 0.4)会让用户误以为加载很慢

最常被忽略的一点:NProgress 的动画依赖 transition,如果你全局重置了 * { transition: none !important },进度条就会变成瞬移或卡死 —— 这类 CSS 重置必须排除 .nprogress 相关选择器。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

5255

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3032

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

2690

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

2739

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4639

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

2681

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2469

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2248

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2228

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app电商系统实战精讲课程
uni-app电商系统实战精讲课程

共66课时 | 17.4万人学习

Vue实战—打造属于自己的外卖系统
Vue实战—打造属于自己的外卖系统

共82课时 | 15.4万人学习

Vue核心技术实战教程全套完整版
Vue核心技术实战教程全套完整版

共75课时 | 12.1万人学习