Getting started
Installation
npm install --save nprogress
import NProgress from "nprogress";
import "nprogress/nprogress.css";
CSS import is required for NProgress to work.
CDN Setup
<script src="https://unpkg.com/nprogress@0.2.0/nprogress.js"></script>
<link rel="stylesheet" href="https://unpkg.com/nprogress@0.2.0/nprogress.css" />
Basic Usage
NProgress.start(); // Show progress bar
NProgress.done(); // Complete and hide
// With fetch
async function fetchData(url) {
NProgress.start();
try {
const res = await fetch(url);
return await res.json();
} finally {
NProgress.done();
}
}
API
Core Methods
| Method | Description |
|---|---|
NProgress.start() |
Start progress bar |
NProgress.done() |
Complete progress bar |
NProgress.done(true) |
Force complete (even if not started) |
NProgress.set(0.4) |
Set to specific % (0.0-1.0) |
NProgress.inc() |
Increment random amount |
NProgress.inc(0.2) |
Increment by 20% |
NProgress.remove() |
Remove from DOM |
Status Checking
NProgress.isStarted(); // Returns boolean
NProgress.status; // Current value (0.0-1.0) or null
The .inc() method auto-adjusts increment size:
- 0.0-0.2: increments by 0.1
- 0.2-0.5: increments by 0.04
- 0.5-0.8: increments by 0.02
- 0.8-0.99: increments by 0.005
Configuration
All Options
| Option | Default | Description |
|---|---|---|
minimum |
0.08 |
Minimum percentage |
easing |
'linear' |
CSS easing animation |
speed |
200 |
Animation speed (ms) |
trickle |
true |
Auto-increment enabled |
trickleSpeed |
200 |
Auto-increment interval (ms) |
showSpinner |
true |
Show loading spinner |
parent |
'body' |
Container selector |
template |
HTML | Custom HTML template |
barSelector |
'[role="bar"]' |
Bar element selector |
spinnerSelector |
'[role="spinner"]' |
Spinner element selector |
Common Configurations
// Hide spinner
NProgress.configure({ showSpinner: false });
// Higher minimum
NProgress.configure({ minimum: 0.1 });
// Smoother animation
NProgress.configure({
easing: "ease",
speed: 500,
});
// Disable auto-increment
NProgress.configure({ trickle: false });
// Custom container
NProgress.configure({ parent: "#container" });
// Multiple options
NProgress.configure({
minimum: 0.1,
easing: "ease",
speed: 500,
showSpinner: false,
});
Integrations
jQuery AJAX
$(document).on("ajaxStart", function () {
NProgress.start();
});
$(document).on("ajaxStop", function () {
NProgress.done();
});
Fetch API
async function fetchData(url) {
NProgress.start();
try {
const res = await fetch(url);
return await res.json();
} finally {
NProgress.done();
}
}
// With error handling
async function fetchWithProgress(url) {
NProgress.start();
try {
const res = await fetch(url);
if (!res.ok) throw new Error("Failed");
return await res.json();
} catch (err) {
console.error(err);
throw err;
} finally {
NProgress.done();
}
}
Next.js (Pages Router)
import Router from "next/router";
import NProgress from "nprogress";
Router.events.on("routeChangeStart", () => NProgress.start());
Router.events.on("routeChangeComplete", () => NProgress.done());
Router.events.on("routeChangeError", () => NProgress.done());
Place in _app.js or layout component.
Turbolinks
$(document).on("turbolinks:click", function () {
NProgress.start();
});
$(document).on("turbolinks:render", function () {
NProgress.done();
NProgress.remove();
});
Pjax
$(document).on("pjax:start", function () {
NProgress.start();
});
$(document).on("pjax:end", function () {
NProgress.done();
});
Customization
Custom Colors
/* Change color (default: #29d) */
#nprogress .bar {
background: #ff0000;
}
#nprogress .peg {
box-shadow:
0 0 10px #ff0000,
0 0 5px #ff0000;
}
#nprogress .spinner-icon {
border-top-color: #ff0000;
border-left-color: #ff0000;
}
Positioning & Size
/* Bottom positioning */
#nprogress .bar {
top: auto;
bottom: 0;
}
/* Custom height */
#nprogress .bar {
height: 4px;
}
/* Adjust z-index (default: 1031) */
#nprogress {
z-index: 9999;
}
Custom Container
.nprogress-custom-parent {
overflow: hidden;
position: relative;
}
NProgress.configure({
parent: "#nprogress-container",
});
Container must have position: relative and overflow: hidden.
Gotchas
- CSS file is REQUIRED - NProgress won't work without importing
nprogress.css .inc()never reaches 100% - You must call.done()to complete the bar.done()without.start()- Won't show anything unless you use.done(true)to force- Default z-index is 1031 - May conflict with modals or other overlays
- Trickle is ON by default - Progress auto-increments; disable with
trickle: false - Size: ~4KB total - No dependencies, very lightweight
Also see
- NProgress Official Site - Live demo and documentation
- NProgress GitHub - Source code and issues
- NProgress npm - Package information