OverlayScrollbars:把 scrollbar 從視覺噪音變成可管理的 UI layer

這篇 Threads 講的是一個 UI 開發裡很常被低估的問題:scrollbar 不是小細節,而是會直接影響產品質感的元件。

原生 scrollbar 在大面積頁面上通常還能接受,但一進到比較精密的 layout,例如 sidebar、table、popover、drawer、modal、code panel、nested scroll container,就很容易變成視覺噪音。問題不只是「醜」,而是它會:

  • 佔掉有限空間
  • 在不同作業系統與瀏覽器上長得不一致
  • 很難跟設計系統的顏色、圓角、hover 狀態對齊
  • 在窄容器裡特別突兀
  • 讓 scroll experience 變成每個容器各自處理,而不是系統化管理

OverlayScrollbars 的價值就在這裡。它不是單純把 scrollbar 美化,而是把 scrollbar 抽成一層可控的 UI layer:底層保留 native scrolling behavior 與手感,上層提供可樣式化、可設定、可跨框架復用的 overlay scrollbar。

根據官方 README,OverlayScrollbars 的定位是:隱藏原生 scrollbar,提供 custom styleable overlay scrollbars,同時保留 native functionality and feel。它的重點能力包括:

  • 保留原生滾動行為,強調 accessibility
  • 支援 Firefox、Chrome、Opera、Edge、Safari 等主流瀏覽器
  • 支援 SSR、SSG、ISR,可在 Node、Deno、Bun 環境運作
  • 支援 mobile、desktop、tablet
  • 支援 mouse、touch、pen 等輸入方式
  • 不需要 polling,自動偵測更新
  • 支援 direction、flex-direction、writing-mode 等不同 flow
  • 支援 scroll snapping
  • 支援 virtual scrolling libraries
  • 支援 body element
  • TypeScript 撰寫、無外部依賴
  • 有 React、Vue、Angular、Svelte、Solid 官方框架版本

安裝方式很直接:

npm install overlayscrollbars

基本使用:

import 'overlayscrollbars/overlayscrollbars.css';
import { OverlayScrollbars } from 'overlayscrollbars';

OverlayScrollbars(document.querySelector('#target'), {
  scrollbars: {
    theme: 'os-theme-dark',
    autoHide: 'scroll'
  }
});

我的判斷:如果只是一般網頁主 scroll,其實不一定需要引入 library;但如果產品有大量複雜容器,尤其是 B2B dashboard、admin portal、IDE-like UI、資料表格、側邊欄、popover / drawer 密集的介面,scrollbar 就應該被當成設計系統的一部分,而不是靠各頁 CSS 補丁。

這篇最值得保留的觀念是:

scrollbar 的問題不是「變漂亮」而已,而是把 scroll experience 納入正式 UI 管理。當產品開始出現大量局部 scroll container 時,成熟 scrollbar library 能降低跨平台差異,也能讓細節質感一致。

對 BigIntTech 的產品來說,像工多多 admin portal、資料表格密集頁、側欄與 modal 多的系統,都可以把 OverlayScrollbars 列為候選方案。不過實作前仍要注意兩件事:第一,不要為了裝飾犧牲原生可及性;第二,只在複雜局部滾動場景使用,避免整站過度包裝造成維護成本。

來源:

OverlayScrollbars:把 scrollbar 從視覺噪音變成可管理的 UI layer | Allen 知識庫 | Allen 知識庫