Scrollbars are natural progress meters. How far the scrollbar is down or across is how much progress has been made scrolling through that element (often the entire page). But, they are more like progress indicators than meters, if you think of a meter as something that “fills up” as you go.
We can use some CSS trickery to make the scrollbar fill up as we go.
This will only work with -webkit-
vendor-prefixed scrollbar-styling properties. In other words, these are non-standard. The standardized scrollbar styling properties are scrollbar-width
and scrollbar-color
, which can’t pull this kind of thing off, but are probably a safer bet in the long run. Still, the vendor-prefixed versions probably aren’t going anywhere, so if you consider this a weird form of progressive enhancement, that’s probably fine.
What’s the trick?
Essentially, it’s hanging a huge box-shadow
off the top of the scrollbar thumb — or off the side if it’s a horizontally scrolling element.
:root {
--shadow: #43a047;
--scrollbarBG: #eee;
--thumbBG: #66bb6a;
}
::-webkit-scrollbar {
width: 16px;
}
::-webkit-scrollbar-track {
background: var(--scrollbarBG);
}
::-webkit-scrollbar-thumb {
background-color: var(--thumbBG);
box-shadow: 0 -100vh 0 100vh var(--shadow), 0 0 15px 5px black;
}
Demo
I first saw this in a Pen by Myk.
That example didn’t differentiate the thumb part of the scrollbar at all, which makes it more meter-like, but also harder to use. My demo has a slightly different color thumb.
Can I really use this?
No! Aside from it being super weird and non-standard. Safari flips it’s lid and I have no idea how to fix it.
I do happen to have a favorite CSS trick that is highly related to this though.
I want to learn more about styling scrollbars
Cool, here you go.
Tried using
filter
instead but that property seems invalid on scrollbars. Using a chain ofbox-shadow
s seems to be pretty effective but highly brittle if the content is very tall (a Sass loop to add a shadow for each unit ofvh
from 1 to 100 is a bit overkill, probably): CodePen demo (which by the way is still broken on Safari, just a tiny bit less, I guess?).Cool, this one is simpler
looks like it doesn’t work in latest Firefox (FF 75.0)