给 React 滑块加会说话的 Tooltip:react-compound-slider 气泡提示实战指南
【免费下载链接】react-compound-slider:black_medium_small_square: React Compound Slider | A small React slider with no opinion on markup or styles项目地址: https://gitcode.com/gh_mirrors/re/react-compound-slider
在 React 项目中使用 react-compound-slider 滑块组件时,你是否也想让滑块"开口说话"——鼠标悬停时弹出一个气泡提示(Tooltip),实时显示当前值?本文手把手教你用 react-compound-slider 自带的渲染数据流,快速实现滑块手柄 Tooltip、滑轨悬停 Tooltip,并附上官方 5 个气泡提示 Demo 和现成的 tooltip.css 样式,让滑块提示零配置落地 🎯
为什么 react-compound-slider 适合做会说话的滑块
react-compound-slider 是一个"无意见"的 React 滑块库:它不预设任何标记(markup)和样式,只负责把数值、百分比和事件数据"流"给你,渲染成什么样完全由你决定。
这带来的直接好处是:
- 🗣️Tooltip 完全自定义:内容、位置、动画、主题都能自己控制,不会和某个 UI 库的样式打架
- ⚖️体积极小:只引入逻辑,气泡提示的视觉部分几行 CSS 就够了
- 🎛️数据即定位:每个手柄自带
value(数值)和percent(百分比位置),气泡提示"贴"在手柄上只需要一个left: ${percent}% - 📦官方 Demo 齐全:仓库里内置了 5 个 Tooltip 实战案例,拿来即用
一句话:react-compound-slider 提供"说什么",你的 Tooltip 决定"怎么说"。
核心原理:两条数据流驱动气泡提示
整个库采用 Compound Component 模式:Slider内部持有数据,Rail、Handles等子组件通过"函数作为子节点"(render prop)把数据传给你的自定义组件。做 Tooltip 只需要用到两条数据流:
| 数据流 | 来源 | 用途 |
|---|---|---|
handles+activeHandleID | Handles 子组件 渲染函数 | 判断哪个手柄被激活,在对应手柄上方显示值气泡 |
getEventData(event) | Rail 子组件 渲染函数 | 鼠标悬停滑轨时,换算出该位置的value和percent |
这两个入口的定义分别位于源码src/Handles/Handles.tsx和src/Rail/Rail.tsx,对应的类型签名在src/types.ts中(EventData就是{ value, percent }的简单结构)。
步骤一:给滑块手柄加 Tooltip(悬停 + 拖拽时显示)
在Handles的渲染函数里,你会拿到handles数组和activeHandleID。官方 Demo 的做法非常直观:
<Handles> {({ handles, activeHandleID, getHandleProps }) => handles.map(handle => ( <Handle key={handle.id} handle={handle} isActive={handle.id === activeHandleID} getHandleProps={getHandleProps} /> ))} </Handles>你的Handle组件里只需要一个判断条件:
- 鼠标悬停(自己用
onMouseEnter/onMouseLeave记个mouseOver状态) - 或者该手柄正在被拖拽(
isActive为真)
满足其一就渲染气泡,用handle.percent做left定位即可。完整实现可参考docs/src/demos/tooltips/components.tsx中的Handle组件(约第 142-220 行),它同时处理了 disabled 状态下隐藏气泡的细节。
步骤二:给滑轨加"跟随鼠标"的 Tooltip(getEventData 用法)
想要用户还没碰到手柄、只是划过滑轨就能看到"这里是多少"的气泡?Rail子组件会额外给你一个神器getEventData:
<Rail> {({ getEventData, activeHandleID, getRailProps }) => ( <TooltipRail getEventData={getEventData} activeHandleID={activeHandleID} getRailProps={getRailProps} /> )} </Rail>TooltipRail的逻辑三步走(见docs/src/demos/tooltips/components.tsx第 40-96 行):
- 滑轨
onMouseEnter时,在document上挂mousemove监听 - 每次移动调用
getEventData(e),一次性拿到{ value, percent },把气泡定位到percent处、内容显示value - 两个关键兜底:拖拽手柄时(
activeHandleID非空)隐藏滑轨气泡避免重叠;onMouseLeave时清除监听并隐藏
getEventData的坐标换算是库帮你算好的——不管横版还是竖版滑块,你都不用写任何几何代码。
一步到位的气泡样式:tooltip.css 直接用
气泡的视觉部分,官方给了一份极简但完整的 CSS:docs/src/demos/tooltips/tooltip.css。它包含:
- 深色圆角气泡(
background-color: #444、border-radius: 6px、opacity: 0.8) - 通过
bottom: 150%把气泡悬在手柄正上方 - 用纯 CSS 边框三角形(
::after+border-color)画出指向手柄的小箭头
如果你的项目用 CSS-in-JS 或内联样式,把这几段规则搬过去即可;想换成 Material Design 风格,仓库里还有docs/src/demos/material-ui/components.tsx这套组件可参考。
官方 5 个 Tooltip Demo:覆盖常见场景
docs/src/demos/tooltips/index.tsx汇总了全部示例,按需求对照着抄就行:
| Demo 文件 | 场景 | 配置 |
|---|---|---|
| Example1.tsx | 仅手柄显示 Tooltip | mode=1, step=1 |
| Example2.tsx | 手柄 + 滑轨都显示 Tooltip | mode=1, step=1 |
| Example3.tsx | 禁用滑块时隐藏 Tooltip | mode=1, step=1 |
| Example4.tsx | Pushable 模式下的 Tooltip | mode=3, step=20 |
| Example5.tsx | 允许手柄交叉(Allow crossing) | mode=1, step=5 |
它们都位于docs/src/demos/tooltips/目录下,共享同一套components.tsx,改动量很小,非常适合做二次开发起点。
常见坑与速查技巧
- 气泡偏移不居中:气泡容器要写
marginLeft: '-11px'(半宽)配合left: ${percent}%,否则气泡中心会偏右;手柄本身则用transform: 'translate(-50%, -50%)'居中 - 拖拽时滑轨气泡"抢戏":一定检查
activeHandleID,非空时把滑轨 Tooltip 让位给手柄 Tooltip - 垂直滑块:
getEventData自动适配方向,只需把气泡的marginTop改成marginLeft之类调整方向即可 - 受控组件:记得同时接
onUpdate(拖拽中,可驱动实时数值显示)和onChange(松手后确认值),官方 Demo 都是这么分离的 - 键盘操作:库支持方向键移动手柄,
activeHandleID同样会更新,所以键盘用户也能看到气泡
总结
给 react-compound-slider 加气泡提示,本质上就是三件事:手柄用handles+activeHandleID判断显隐,滑轨用getEventData实时换算位置,样式抄一份 tooltip.css。数据、定位、事件都由 react-compound-slider 接管,你只需专注气泡长什么样——这正是"无意见"设计最香的地方 🎉
核心文件清单(都在项目根目录下,可直接检索):
docs/src/demos/tooltips/components.tsx—— 带 Tooltip 的 Rail/Handle/Track/Tick 全套组件docs/src/demos/tooltips/tooltip.css—— 气泡基础样式docs/src/demos/tooltips/Example1.tsx~Example5.tsx—— 5 个场景 Demosrc/Handles/Handles.tsx、src/Rail/Rail.tsx—— 数据流源头
【免费下载链接】react-compound-slider:black_medium_small_square: React Compound Slider | A small React slider with no opinion on markup or styles项目地址: https://gitcode.com/gh_mirrors/re/react-compound-slider
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考