NexusCS

NProgress

JavaScript libraries
NProgress is a slim progress bar for Ajax applications, inspired by Google, YouTube, and Medium. Created by Rico Sta. Cruz.
nprogress
progress-bar
loading
ui

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