Try the scrollbar →
Scroll with your wheel or trackpad and the grabber tracks you on the compositor. Drag the grabber to scrub. Click the arrows to step between sections and watch the delayed dragger: the grabber lingers while a thin indicator shows where you're headed, then glides over once your pointer leaves.
scroll-timeline, so the common case costs zero
JavaScript per frame. JS only powers drag, arrow steps and the
delayed-dragger reveal.
sections="h2". Each <h2> gets a pill at
its exact spot — click to jump, hover for its label, and the arrows
step section to section. Jumps respect scroll-margin, and
with haptics a tiny vibration ticks as you cross each one
(on supporting devices).
prefers-color-scheme and
prefers-reduced-motion, keyboard-operable, themeable via
--wave-accent, and degrades gracefully where scroll-driven
animations aren't supported.
Usage
Drop the module in and wrap your content. That's the whole API:
<script type="module" src="wave-scroll.js"></script>
<wave-scroll accent="#7c6cff"> … </wave-scroll>
Optional attributes: auto-hide reveals the bar only on
interaction, no-arrows drops the step buttons,
sections="h2" adds the jump pills, and
haptics ticks as you cross sections.
auto-hide — hover the box; the teal bar fades inThis nested box uses <wave-scroll auto-hide>. At
rest the scrollbar is invisible, keeping the content perfectly
clean.
Move your pointer over the box and the bar fades in; move away and it fades back out. Everything else — drag, arrows, the delayed dragger — works exactly the same.
It's the same component, just a different attribute. Scroll me to feel it.
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget.
Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi.
Why it mattered
In its tiny form-factor the original Wave scrollbar managed to indicate document height, show the current location, scroll by clicking the arrows, and scroll by dragging — and it did all of it without ever getting in your way. Fifteen years on, the platform finally has the primitives to express that idea natively.
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra.
Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat.
Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est.
— You've reached the bottom. The grabber should be resting at the end of its track.