RippleButton
ripple-button在点击落点扩散一圈水波纹,给出触感反馈
用法
基础用法
点击后从落点扩散一圈 Material 风水波纹,动画结束自动移除。
tsx
<RippleButton>点我看波纹</RippleButton>波纹速度
duration 控制单次波纹扩散的时长。
tsx
<RippleButton duration="400ms">快</RippleButton>
<RippleButton duration="900ms">慢</RippleButton>自定义波纹色
rippleColor 指定波纹颜色,缺省取 primary-foreground。
tsx
<RippleButton rippleColor="rgba(255,255,255,0.7)">高对比波纹</RippleButton>何时用
需要 Material 风格「点击落点扩散波纹」反馈的按钮。普通操作用 Button;只想要视觉特效(流光/彩虹/脉冲)而非点击涟漪时用 ShimmerButton / RainbowButton / PulsatingButton。
导入
ts
import { RippleButton } from "@hulianui/ui"Props
继承全部原生 <button> 属性(disabled/type…)。
| 名称 | 类型 | 默认 | 说明 |
|---|---|---|---|
| size | "sm" | "md" | "lg" | "md" | 尺寸档,与 Button 同刻度(32/40/48px 高) |
| variant | "solid" | "outline" | "ghost" | "soft" | "solid" | 外观档,与 Button 的同名档同色。没有 `link`:波纹要有盒子,见「禁忌 / 坑」 |
| tone | "brand" | "neutral" | "success" | "warning" | "danger" | "brand" | 语气色,与 Button 的同名档同色。没有 `current`:波纹默认色要从 tone 推导,继承色推不出来 |
| rippleColor | string | 按 variant × tone 推导 | 波纹颜色。实心档默认取该 tone 的前景色(深底上的浅波纹),其余档取该 tone 的本色。传值即覆盖 |
| duration | string | "600ms" | 单次波纹动画时长 |
Events
| 事件 | 类型 | 说明 |
|---|---|---|
| onClick | (e: MouseEvent<HTMLButtonElement>) => void | 透传原生点击回调(点击同时触发波纹扩散) |
Slots
| 插槽 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 按钮内容(文案/图标) |
| render | ReactElement | 渲染为自定义元素(如 <a>/Next <Link>),样式与波纹层合并进该元素;文案仍取 children |
禁忌 / 坑
- 与 [Button](/zh/components/button) 共享底座与配色档:排布、
size三档(32/40/48px 高)、焦点环、禁用态视觉、forwardRef来自同一份EFFECT_BUTTON_BASE_CLASS+BUTTON_SIZE_CLASS;variant×tone的色号与 Button 逐格对齐(#233)。不共享的是圆角、阴影与颜色 hover——圆角是特效件自己的,shadow-sm四个特效件一个都没有,而颜色 hover 与本件底座冲突(下一条)。0.27.0 前四个特效件各写各的,这些全缺,px-6 py-3按内容撑高,工具栏里一排按钮会参差(#126)。 - 没有颜色 hover,交互反馈由波纹负责。 特效件的底座刻意不含
transition-colors(它们变的是背景动画不是颜色),挂hover:bg-*会是一次无过渡的跳变。所以variant="ghost"的静息态就是一段文字,鼠标悬停不变底——要「悬停就有反应」的次要操作请用Button variant="ghost",本件的反馈是点下去那一下。 - `variant` 没有 `link`,`tone` 没有 `current`。 前者是因为波纹要有盒子:
link去掉了高度与横向内边距,波纹落在h-auto px-0的文字上会裁成一条缝或整片糊住文字。后者是因为波纹默认色要从 tone 推导,而current的意思正是「别设色、跟随容器继承」——真要跟随容器请显式传rippleColor="currentColor"。 - `variant` 讲外观,`render` 讲语义,别读混。 上一条说的「要链接样式请用
Button variant="link"」指的是长相(要不要按钮盒子);如果你要的是「长得就是这颗实心按钮、但它得是个<a>」——中键新开标签页、右键复制链接、爬虫能看见——那是render={<a href="…" />},波纹与配色一样不少(#256)。 - 波纹色默认按档推导:实心档用该 tone 的前景色(深底上的浅波纹),描边 / 幽灵 / 浅底档用该 tone 的本色。反过来(浅底上用前景色)会得到一圈几乎看不见的白,所以自定义
rippleColor时注意底色。 - 波纹动画在
prefers-reduced-motion: reduce下自动抑制,无需手动处理。
相关
Button · ShimmerButton · RainbowButton · PulsatingButton · ButtonGroup · SocialButton
Playground
<RippleButton duration="600ms">点我看波纹</RippleButton>