章节
组件
import {
Avatar,
AvatarFallback,悬停卡片在指针停在触发器上时浮出一块富预览内容——无需点击。它基于 Base UI Preview Card 基元构建,并按新粗野主义的配方设计:粗边框、硬阴影、加粗字体。
适合以下场景:
- 资料快览——悬停 @提及 或头像,展示简介、数据与关注按钮。
- 链接预览——在读者真正点开前,先呈现页面标题与摘要。
- 术语表——在文档里就地解释行话,无需跳走。
安装#
pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/hover-card.jsonnpx shadcn@latest add https://neobrutalism.com/r/base/hover-card.jsonyarn dlx shadcn@latest add https://neobrutalism.com/r/base/hover-card.jsonbunx --bun shadcn@latest add https://neobrutalism.com/r/base/hover-card.json
安装以下依赖:
pnpm add @base-ui/reactnpm install @base-ui/reactyarn add @base-ui/reactbun add @base-ui/react
将以下代码复制并粘贴到您的项目中。
"use client"
import * as React from "react"
import { HoverCard as HoverCardPrimitive } from "radix-ui"
import { cn } from "@/lib/utils"
function HoverCard({
...props
}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {
return <HoverCardPrimitive.Root data-slot="hover-card" {...props} />
}
function HoverCardTrigger({
...props
}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {
return (
<HoverCardPrimitive.Trigger data-slot="hover-card-trigger" {...props} />
)
}
function HoverCardContent({
className,
align = "center",
sideOffset = 4,
...props
}: React.ComponentProps<typeof HoverCardPrimitive.Content>) {
return (
<HoverCardPrimitive.Portal data-slot="hover-card-portal">
<HoverCardPrimitive.Content
data-slot="hover-card-content"
align={align}
sideOffset={sideOffset}
className={cn(
"z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded border-2 bg-popover p-2.5 text-sm text-popover-foreground shadow-md outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
className
)}
{...props}
/>
</HoverCardPrimitive.Portal>
)
}
export { HoverCard, HoverCardTrigger, HoverCardContent }
更新导入路径以匹配您的项目结构。
用法#
import {
HoverCard,
HoverCardContent,
HoverCardTrigger,
} from "@/components/ui/hover-card"<HoverCard>
<HoverCardTrigger>Hover</HoverCardTrigger>
<HoverCardContent>
The React Framework – created and maintained by @vercel.
</HoverCardContent>
</HoverCard>组合#
使用以下组合来构建 HoverCard:
HoverCard
├── HoverCardTrigger
└── HoverCardContent触发延迟#
在触发器上使用 delay 和 closeDelay 来控制卡片打开和关闭的时机。
<HoverCard>
<HoverCardTrigger delay={100} closeDelay={200}>
Hover
</HoverCardTrigger>
<HoverCardContent>Content</HoverCardContent>
</HoverCard>定位#
在 HoverCardContent 上使用 side 和 align 属性来控制放置位置。
<HoverCard>
<HoverCardTrigger>Hover</HoverCardTrigger>
<HoverCardContent side="top" align="start">
Content
</HoverCardContent>
</HoverCard>示例#
基础#
import {
Avatar,
AvatarFallback,方位#
import { Button } from "@/components/ui/button"
import {
HoverCard,RTL#
若要在 Neobrutalism 中启用 RTL 支持,请参阅 RTL 配置指南。
"use client"
import {无障碍#
悬停卡片没有专属的 WAI-ARIA 模式——最接近的是 Tooltip 模式。Base UI 基元会在触发器获得键盘焦点时打开卡片,并用 Escape 关闭。即便如此,仍应把内容当作给视力用户的补充信息,并让触发器保持为真正的链接,以便在目标页访问完整内容。
键盘交互:
| 按键 | 操作 |
|---|---|
Tab / Shift + Tab | 把焦点移到触发器——聚焦即打开卡片,离开即关闭 |
Escape | 关闭卡片 |
Enter | 跟随触发器链接 |
API 参考#
更多信息请参阅 Base UI 文档。