Reading Progress: 5 Smart Skins That Keep Readers Scrolling

October 17, 2026
·
Shahidul Islam
Reading progress widget for Elementor showing the horizontal bar skin

Long articles lose people in the middle. Not at the top, where the headline did its job, and not at the end, where the reader is already committed, but somewhere around the third subheading, when the page stops giving any sense of how much is left. A scroll bar answers that question, badly, and on a phone it is usually not visible at all.

A reading progress indicator answers it properly. One thin bar that fills as the page moves tells a reader they are two thirds through, which is exactly the information that keeps them going. It costs almost nothing to add and it is one of the few interface flourishes that earns its place on a content site.

Reading progress bar pinned to the top of an Elementor page
The default skin: one thin bar pinned to the top of the page.

Where reading progress helps

  • Long form articles. Anything past a thousand words benefits from a sense of distance.
  • Documentation pages. A reader scanning for one section wants to know how much they have left to scan.
  • Sales pages. A long pitch page reads as shorter when the visitor can see the end coming.
  • Case studies. Progress plus a scroll to top button means a reader can reach the call to action from any depth.
  • Recipe and tutorial pages. A vertical rail beside a numbered process reads as a step counter.
  • Portfolio pages. The cursor skin turns the indicator into part of the design rather than a strip of interface.

Five skins, one widget

SkinWhat it isBest for
Defaulta thin bar pinned to the top or bottomany article template
Fancy Horizontala floating bar with the percentage beside itpages where the number matters
Fancy Verticala bar down the left or right edgewide layouts with room in the margin
Scroll Topa circular button that fills as you readlong pages that need a way back
With Cursora ring that follows the pointer and tracks progressdesign led desktop pages

Every skin reads the same scroll position, so the choice is purely a design one. You can change it after the page is built without touching anything else.

Fancy horizontal reading progress bar with a percentage
Fancy Horizontal: a floating bar with the percentage beside it.

The features that matter

A percentage, when you want one. Show Percentage adds the live number beside the bar on both fancy skins, and it is rendered only when the switch is on, so nothing empty sits in the markup when it is off.

A scroll to top button that hides until it is useful. The Scroll Top skin takes a Show After value in pixels, so the button appears once a reader has moved far enough to want it, and a Scroll Animation duration in milliseconds for how fast it travels back.

A cursor made of three layers. The With Cursor skin draws a dot that follows instantly, an inner ring that lags behind it and an outer ring with the progress arc that lags further still. Ring Follow Lag sets the distance in milliseconds, and zero means instant.

A blend mode for the cursor. Normal, Difference, Exclusion, Multiply, Screen or Overlay, applied to every cursor layer, which is how you keep a light ring visible over both a white section and a photograph.

Offsets on the button. The scroll to top button takes horizontal and vertical offsets behind a popover, so it can sit clear of a chat bubble or a cookie bar.

No vendor library. The widget carries no third party scroll plugin. The logic is about eighty lines, inlined, with every scroll and mouse handler wrapped in a frame request so the updates stay smooth.

Reading progress in Elementor: Scroll to top ring and cursor progress ring close up
Scroll Top: a circular button that fills as you read.

How to add reading progress in five steps

  1. Drop the widget into the article template, not the page. One instance covers every post.
  2. Pick the skin. Default is the safe choice; With Cursor is a design decision, not a default.
  3. Set Size. Four or five pixels reads as deliberate; ten reads as a loading bar.
  4. Set the colours. Primary is the fill, secondary is the track.
  5. On the Scroll Top skin, set Show After so the button stays out of the way until the reader is committed.

Put the widget in the single post template once rather than on each page. The scroll handlers are page global by design, so two instances of the same skin on one page will fight, and the second one wins.

Vertical reading progress rail beside page content
Fancy Vertical: the bar runs down the side of the page.

What changes on the page

The measurable change is scroll depth on long pages. The reason is not magic: a reader who can see that they are seventy percent through a piece is much less likely to abandon it than a reader with no idea whether two screens remain or twelve.

The second change is on mobile, where it matters more. Phone browsers hide the scroll bar, so there is no native signal at all about page length. A thin bar at the top of the viewport is the only thing telling a reader that the article ends soon.

Choosing a skin without overdoing it

The temptation with this widget is to take the most elaborate option. A few honest notes on each.

Default is right for most content sites. It is one bar, it sits above or below the viewport edge, and it never competes with the writing. If you are adding a progress indicator to a blog for the first time, start here and stop here.

Fancy Horizontal earns the extra weight on pages where the number is meaningful, like a long form guide or a multi step form page. The percentage is a real number, not a rounded guess, so it moves smoothly rather than jumping.

Fancy Vertical needs a layout with actual margin. On a centred article at 800 pixels wide on a large screen it looks considered. On a full width page it sits on top of the content, and you will end up with the spacing control fighting your section padding.

Scroll Top is the most practical of the five, and the only one that does a job beyond information. On a two thousand word page it saves a reader a lot of thumb work, and the filling ring means it is not just another floating button.

With Cursor is a desktop only effect, since touch devices never fire a mouse move, and the elements simply stay hidden. It suits a portfolio or a studio site. On a documentation site it will read as a distraction, which it is.

One last note that applies to every skin: all of them account for the WordPress admin bar, so what you see while logged in matches what a visitor sees.

Styling it so it belongs

A reading progress bar goes wrong in one of two ways: it is invisible, or it is a stripe of brand colour shouting at the top of every page. Both are avoidable.

Use your accent colour for the fill and a very light neutral for the track. The contrast between fill and track is what makes the bar readable; the contrast between the bar and the page is what makes it loud. A four pixel bar in the accent colour on a near white track is visible without being a design element.

Set the transition duration rather than leaving it. The default two hundred milliseconds smooths the fill so it glides instead of stepping, which matters on a page with lazy loaded images where the total height changes as you scroll.

If the page has a sticky header, check the bar against it. The default and fancy horizontal skins sit at the viewport edge, so a sticky header with a shadow can swallow a thin bar completely. Either move the bar to the bottom with the Position control or raise its size by a pixel or two.

Reading progress: common questions

Is the reading progress widget free?

Yes. All five skins are in the free Sky Addons plugin.

Does it need Elementor Pro?

No. Elementor and the free Sky Addons plugin are enough.

Does it load a JavaScript library?

No. The vendor dependency was removed and the logic inlined into the widget script.

Can I use two of them on one page?

Not of the same skin. The scroll handlers are page global, so the second instance cancels the first. One per page is the intended use.

Does the cursor skin work on phones?

No, and that is deliberate. Cursor tracking needs a pointer, so on touch devices the layers stay hidden. Use the Scroll Top skin instead.

Pick one, ship it

A progress indicator is a small thing that makes long pages feel finishable. Five skins cover everything from a plain bar to a cursor overlay, with no library loaded and no Pro licence needed.

Try each one on the reading progress demo, read the documentation, and if you are building the article template itself, the table of contents widget is the natural companion. For a different kind of scroll behaviour, see the scroll stack widget. The free versus Pro page and the pricing page cover the rest of the plugin. The underlying browser behaviour is documented by MDN in the scroll event reference, and the cursor skin uses mix-blend-mode.

Written by
Shahidul Islam
Writes about the work behind the widgets — what shipped, why, and what it cost.
Share
In this post

More from the journal

Reading Progress: 5 Smart Skins That Keep Readers Scrolling

Reading Progress: 5 Smart Skins That Keep Readers Scrolling

The reading progress widget adds a top bar, a floating bar with a percentage, a side rail, a scroll to top ring or a cursor overlay. Free, no library.
Changelog Widget: Publish 7 Update Labels From One Remote URL

Changelog Widget: Publish 7 Update Labels From One Remote URL

The changelog widget reads a raw changelog file, labels every entry, caches it for days and renders the whole release history on an Elementor page.
Post List: 3 Smart Column Layouts for a Blog Feed That Gets Read

Post List: 3 Smart Column Layouts for a Blog Feed That Gets Read

The post list widget gives Elementor one, two or three columns, an image beside or above the text, eight content toggles and real pagination. Free.

Comments are closed.