跳到内容

悬停卡片

一种悬停时弹出的浮动预览——包括个人资料预览、链接预览和词汇表术语——采用新粗野主义风格的边框和阴影处理效果。

import {
  Avatar,
  AvatarFallback,

悬停卡片在指针停在触发器上时浮出一块富预览内容——无需点击。它基于 Base UI Preview Card 基元构建,并按新粗野主义的配方设计:粗边框、硬阴影、加粗字体。

适合以下场景:

  • 资料快览——悬停 @提及 或头像,展示简介、数据与关注按钮。
  • 链接预览——在读者真正点开前,先呈现页面标题与摘要。
  • 术语表——在文档里就地解释行话,无需跳走。

安装

pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/hover-card.json
npx shadcn@latest add https://neobrutalism.com/r/base/hover-card.json
yarn dlx shadcn@latest add https://neobrutalism.com/r/base/hover-card.json
bunx --bun shadcn@latest add https://neobrutalism.com/r/base/hover-card.json

安装以下依赖:

pnpm add @base-ui/react
npm install @base-ui/react
yarn add @base-ui/react
bun add @base-ui/react

将以下代码复制并粘贴到您的项目中。

components/ui/hover-card.tsx
"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

触发延迟

在触发器上使用 delaycloseDelay 来控制卡片打开和关闭的时机。

<HoverCard>
  <HoverCardTrigger delay={100} closeDelay={200}>
    Hover
  </HoverCardTrigger>
  <HoverCardContent>Content</HoverCardContent>
</HoverCard>

定位

HoverCardContent 上使用 sidealign 属性来控制放置位置。

<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 文档。