前端自定义滚动条新星库出现了,看它亮还是不亮

告别原生滚动条:一个不到 10KB 的轻量级自定义滚动条插件

原生滚动条太丑?第三方组件太臃肿?试试这个轻量到极致的方案。


前端开发中,自定义滚动条是一个绕不开的话题。浏览器原生滚动条不仅样式简陋,在不同系统下表现也不一致。而市面上的 UI 框架往往捆绑着庞大的依赖,为了美化一个滚动条引入整个组件库,怎么想都不划算。

dumogu-scrollbar 正是为解决这个痛点而生 ------ 压缩后不到 10KB,零依赖,TypeScript 原生支持

为什么值得关注?

1. 极致轻量,零依赖

整个插件压缩后不到 10KB,不依赖任何第三方库。源码不到 800 行 TypeScript,结构清晰,感兴趣的话花一杯咖啡的时间就能读完。

2. 覆盖层设计,不侵入 DOM

这是它和其他滚动条插件最大的区别。dumogu-scrollbar 采用绝对定位覆盖层(overlay)的方式渲染滚动条,不包裹、不修改你的滚动容器。这意味着:

  • 原有 DOM 结构完全不受影响
  • 不会触发任何基于 DOM 结构的样式破坏
  • 不会干扰已有的 overflow / scroll 行为
  • 你只管写业务代码,滚动条完全独立运作

3. 支持 ESM / CJS / UMD 三种模块格式

无论你用 Webpack、Vite、Rollup,还是直接 <script> 标签引入,都能无缝接入:

bash 复制代码
npm install dumogu-scrollbar
js 复制代码
// ESM
import { DumoguScrollbar } from 'dumogu-scrollbar';
import 'dumogu-scrollbar/dist/dumogu-scrollbar.css';
html 复制代码
<!-- 或者浏览器直接引入 -->
<link rel="stylesheet" href="dumogu-scrollbar/dist/dumogu-scrollbar.css" />
<script src="dumogu-scrollbar/dist/dumogu-scrollbar.umd.js"></script>

4. 独立导轨组件,灵活度拉满

除了开箱即用的 DumoguScrollbar(同时管理 X/Y 双轴滚动条),你还可以单独使用 DumoguScrollbarRail,把横向或纵向导轨放到页面任意位置,完全突破滚动容器的布局限制。

js 复制代码
// 单独创建一个横向滚动条,放到任意容器中
const railX = new DumoguScrollbarRail({
    isX: true,
    keepShow: true,
});
document.querySelector('#custom-rail-wrapper').appendChild(railX.railEl);
railX.bind(document.querySelector('#my-scroll-area'));

每个导轨实例完全独立,你可以混搭「常驻显示」和「悬停显示」两种模式。

5. 高度可定制的样式

所有内部元素都暴露了语义化的 CSS 类名(如 .dumogu-scrollbar-rail_x.dumogu-scrollbar-rail_thumb_y),只需在根元素上加一个自定义类名,就能轻松覆盖样式:

css 复制代码
.my-theme .dumogu-scrollbar-rail_y {
    width: 8px;
    right: initial;
    left: -14px;  /* 把滚动条移到容器左侧 */
}
.my-theme .dumogu-scrollbar-rail_thumb_y {
    border-radius: 999px;
    background: linear-gradient(to top, #e14fad 0%, #f9d423 100%);
}

6. TypeScript 类型完备

类型定义文件随包发布,ScrollbarOptionRailOption 类型也已导出,写 TS 项目毫无压力。

快速上手

三步搞定一个自定义滚动条:

js 复制代码
import 'dumogu-scrollbar/dist/dumogu-scrollbar.css';
import { DumoguScrollbar } from 'dumogu-scrollbar';

// 1. 创建实例
const ds = new DumoguScrollbar({ keepShow: false });

// 2. 绑定到滚动容器
ds.bind(document.querySelector('#my-scroll-container'));

// 3. 挂载到 DOM(默认挂到 body)
ds.mount();

别忘了隐藏原生滚动条:

css 复制代码
.no-scrollbar {
    -ms-overflow-style: none;
    scrollbar-width: none;
}
.no-scrollbar::-webkit-scrollbar {
    display: none;
}

进阶:多实例管理

页面有多个滚动区域?一个 requestAnimationFrame 循环统一管理:

js 复制代码
const instances = [ds1, ds2, ds3];

function updateLoop() {
    requestAnimationFrame(() => {
        instances.forEach(item => item.update());
        updateLoop();
    });
}
updateLoop();

拖拽过程中对应导轨会跳过 update(),避免拖拽和内容更新冲突,细节处理得很到位。

总结

对比维度 原生滚动条 UI 框架内置 dumogu-scrollbar
样式自定义 ❌ 有限 ✅ 完全自由
包体积 --- 几十到几百 KB < 10KB
依赖 --- 全家桶 零依赖
DOM 侵入 --- 可能修改结构 覆盖层,不侵入
独立导轨 ---
TypeScript --- 看框架 ✅ 类型完备

如果你正在做:

  • 后台管理系统的表格/列表美化
  • 品牌官网的视觉定制
  • 桌面端应用(Electron)的 UI 打磨
  • 任何需要「轻量、可控、不挑框架」的滚动条场景

dumogu-scrollbar 值得一试。


相关推荐
大龄秃头程序员19 小时前
我在图文流 App 里落地双层缓存、弱网降级与 OOM 治理
前端
老王以为19 小时前
React Renderer 分离的多平台架构
前端·react native·react.js
hunterandroid19 小时前
Kotlin Coroutines 与 Flow:让异步任务更清晰
前端
Bigger20 小时前
从零搭建 AI 代码审查服务:一份前端也能看懂的 Python 学习笔记
前端·ci/cd·ai编程
lichenyang45320 小时前
JSAPI、NAPI、Biz、Imp:ASCF Demo 如何真正调用系统能力和 C++ 能力
前端
lichenyang45320 小时前
IPC、JSVM、UIThread、libuv:ASCF 架构图里最容易混的几个词
前端
用户0595401744620 小时前
Redis记忆存储故障恢复测试踩坑实录:手动测试让我漏掉了2个一致性Bug
前端·css
用户21366100357220 小时前
Vue2脚手架工程化与Axios集成
前端·vue.js
张元清20 小时前
React useDebounce Hook:给状态和回调做防抖(2026)
javascript·react.js
我不是外星人20 小时前
我把 Claude Code 搬到网页!自研高颜值 Web 交互工作台
前端·ai编程·claude