HoverCard
鼠标悬停或聚焦时展示补充信息的浮层卡片
HoverCard 用于在用户悬停或聚焦某个触发元素时展示简短的补充信息。它基于 Radix HoverCard 封装,适合展示用户资料、术语说明、链接预览或上下文摘要。
import {
HoverCard,
HoverCardArrow,
HoverCardContent,
HoverCardRoot,
HoverCardTrigger
} from '@skyroc/web-ui';何时使用
- 需要在不打断当前流程的情况下展示补充信息。
- 触发内容和浮层内容之间存在明确关联,例如用户、链接、指标或术语。
- 内容较短,用户可以快速扫读并离开。
- 需要点击确认或承载复杂交互时使用 Dialog;只需要纯文本提示时优先使用 Tooltip。
基础用法
通过 trigger 提供触发元素,children 作为悬停后展示的浮层内容。
箭头
通过 showArrow 显示箭头,让浮层和触发元素的视觉关系更明确。箭头样式可以通过 classNames.arrow 或 arrowProps 调整。
位置与偏移
通过 contentProps 传递 Radix Content 的定位属性,例如 side、align、sideOffset、alignOffset 和碰撞检测相关配置。
<HoverCard
trigger={<button type="button">Hover me</button>}
contentProps={{ align: 'start', side: 'right', sideOffset: 12 }}
>
<div>Content</div>
</HoverCard>自定义样式
通过 classNames.content 控制浮层内容容器,通过 classNames.arrow 控制箭头。也可以直接使用 className 设置内容容器样式,className 的优先级高于 classNames.content。
API
HoverCard
通用属性参考:基于 Radix HoverCard Root,支持打开状态、延迟、触发元素、内容属性和箭头配置。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| trigger* | 触发 HoverCard 打开的元素,通常是 Button、链接或文本节点 | ReactNode | - |
| children | 浮层内容 | ReactNode | - |
| showArrow | 是否显示指向触发元素的箭头 | boolean | false |
| arrowProps | 传递给 HoverCardArrow 的额外 props,仅在 showArrow 为 true 时生效 | HoverCardArrowProps | - |
| contentProps | 传递给 HoverCardContent 的定位和交互 props,不包含 children 与 className | Omit<HoverCardContentProps, 'children' | 'className'> | - |
| classNames | 各 slot 的自定义 class(content / arrow) | HoverCardClassNames | - |
| className | 传递给内容容器的自定义 class;优先级高于 classNames.content | ClassValue | - |
| open | 受控模式下的打开状态 | boolean | - |
| defaultOpen | 非受控模式下的默认打开状态 | boolean | - |
| onOpenChange | 打开状态变化时触发 | (open: boolean) => void | - |
| openDelay | 鼠标进入或聚焦后延迟打开的毫秒数,透传给 Radix Root | number | - |
| closeDelay | 鼠标离开或失焦后延迟关闭的毫秒数,透传给 Radix Root | number | - |
| size | 类型中存在,但当前 HoverCard 样式没有 size 分支,不建议依赖 | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | - |
HoverCardContent
浮层内容容器会自动通过 Portal 渲染,并默认设置 align="center"、sideOffset={8}。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| children | 浮层内容 | ReactNode | - |
| className | 内容容器的自定义 class | ClassValue | - |
| side | 浮层相对触发元素的位置 | 'top' | 'right' | 'bottom' | 'left' | - |
| align | 浮层相对触发元素的对齐方式 | 'start' | 'center' | 'end' | 'center' |
| sideOffset | 浮层和触发元素之间的距离 | number | 8 |
| alignOffset | 沿对齐轴偏移的距离 | number | - |
| avoidCollisions | 是否启用碰撞检测以避免浮层超出视口 | boolean | - |
| collisionPadding | 碰撞检测时和边界之间保留的距离 | number | Partial<Record<Side, number>> | - |
| forceMount | 强制挂载内容容器 | true | - |
HoverCardArrow
箭头组件用于在浮层和触发元素之间建立视觉连接。主组件中只有 showArrow 为 true 时才会渲染。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| className | 箭头的自定义 class | ClassValue | - |
| width | 箭头宽度,透传给 Radix Arrow | number | - |
| height | 箭头高度,透传给 Radix Arrow | number | - |
| asChild | 使用子元素替代默认箭头元素 | boolean | - |
| size | 类型中存在,但当前箭头样式没有 size 分支,不建议依赖 | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | - |
子组件
HoverCard 也导出 Radix 原语,适合在需要完全自定义组合结构时使用。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| HoverCardRoot | Radix HoverCard Root 原语,用于自定义组合根节点 | radix primitive | - |
| HoverCardTrigger | Radix HoverCard Trigger 原语,用于自定义触发元素 | radix primitive | - |
| HoverCardContent | 浮层内容容器,支持对应 Radix Content props、className 和 Portal 渲染 | HoverCardContentProps | - |
| HoverCardArrow | 浮层箭头,支持对应 Radix Arrow props 和 className | HoverCardArrowProps | - |
类型
HoverCardProps
主组件属性。组合了 Radix HoverCard Root 属性,并额外提供触发元素、内容属性、箭头和 slot 样式配置。
| 字段 | 类型 | 说明 |
|---|---|---|
| arrowProps | HoverCardArrowProps | 传递给箭头组件的额外属性。 |
| children | ReactNode | 浮层内容。 |
| className | ClassValue | 内容容器的 class。来自 StyledComponentProps。 |
| classNames | HoverCardClassNames | 各 slot 的自定义 class。 |
| closeDelay | number | 延迟关闭时间。来自 Radix Root props。 |
| contentProps | Omit<HoverCardContentProps, 'children' | 'className'> | 传递给内容容器的定位和交互属性。 |
| defaultOpen | boolean | 非受控模式下的默认打开状态。来自 Radix Root props。 |
| onOpenChange | (open: boolean) => void | 打开状态变化时触发。 |
| open | boolean | 受控模式下的打开状态。来自 Radix Root props。 |
| openDelay | number | 延迟打开时间。来自 Radix Root props。 |
| showArrow | boolean | 是否显示箭头。默认值为 false。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 类型中存在,但当前主组件没有将 size 应用到内容或箭头样式。 |
| trigger* | ReactNode | 触发 HoverCard 打开的元素。 |
HoverCardClassNames
各 slot 的自定义 class,用于精细化控制 HoverCard 各部分的样式。
| 字段 | 类型 | 说明 |
|---|---|---|
| content | ClassValue | 内容容器的 class。 |
| arrow | ClassValue | 箭头的 class。 |
HoverCardContentProps
内容容器属性。继承 Radix HoverCard Content props,并通过 StyledComponentProps 增加 className 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| align | 'start' | 'center' | 'end' | 对齐方式。默认值为 center。 |
| alignOffset | number | 沿对齐轴偏移的距离。 |
| avoidCollisions | boolean | 是否启用碰撞检测。 |
| children | ReactNode | 浮层内容。 |
| className | ClassValue | 内容容器的 class。 |
| collisionPadding | number | Partial<Record<Side, number>> | 碰撞检测边距。 |
| forceMount | true | 强制挂载内容容器。 |
| side | 'top' | 'right' | 'bottom' | 'left' | 浮层位置。 |
| sideOffset | number | 浮层和触发元素之间的距离。默认值为 8。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 类型中存在,但当前内容容器样式不依赖 size。 |
HoverCardArrowProps
箭头属性。继承 Radix HoverCard Arrow props,并通过 StyledComponentProps 增加 className 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| asChild | boolean | 使用子元素替代默认箭头元素。 |
| className | ClassValue | 箭头的 class。 |
| height | number | 箭头高度。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 类型中存在,但当前箭头样式不依赖 size。 |
| width | number | 箭头宽度。 |
StyledComponentProps<T>
项目内用于包装 Radix props 或原生元素 props 的通用类型。
| 字段 | 类型 | 说明 |
|---|---|---|
| ...sourceProps | inherited props without className | 继承原始组件属性,但重新定义 className。 |
| className | ClassValue | 组件 class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 项目统一尺寸类型。 |
HoverCardSlots
HoverCard 可配置 classNames 的内置 slot
Side
碰撞检测边距支持的方向键