ProComponents, templates & AI tooling
HeroUI
27.7k

Popover 弹出框

在由按钮或任意自定义元素触发后,于 portal 中展示丰富内容。

引入

import { Popover } from '@heroui/react';

用法

import {Button, Popover} from "@heroui/react";

export function PopoverBasic() {
  return (
    <div className="flex items-center gap-4">

组件结构

引入 Popover 后,可通过点语法访问各个部分。

import { Popover } from '@heroui/react';

export default () => (
  <Popover>
    <Popover.Trigger/>
    <Popover.Content>
      <Popover.Arrow />
      <Popover.Dialog>
        <Popover.Heading/>
        {/* content goes here */}
      </Popover.Dialog>
    </Popover.Content>
  </Popover>
)

带箭头

import {Ellipsis} from "@gravity-ui/icons";
import {Button, Popover} from "@heroui/react";

export function PopoverWithArrow() {
  return (

位置

点击按钮
import {Button, Popover} from "@heroui/react";

export function PopoverPlacement() {
  return (
    <div className="grid grid-cols-3 gap-4">

可交互内容

"use client";

import {Avatar, Button, Popover} from "@heroui/react";
import {useState} from "react";

自定义渲染函数

"use client";

import {Button, Popover} from "@heroui/react";

export function CustomRenderFunction() {

样式

传入 Tailwind CSS 类

import { Popover, Button } from '@heroui/react';

function CustomPopover() {
  return (
    <Popover>
      <Popover.Trigger>
        <Button>Open</Button>
      </Popover.Trigger>
      <Popover.Content className="bg-accent text-accent-foreground">
        <Popover.Dialog>
          <h3>Custom Styled</h3>
          <p>This popover has custom styling</p>
        </Popover.Dialog>
      </Popover.Content>
    </Popover>
  );
}

自定义组件类

若要自定义 Popover 的组件类名,可使用 @layer components 指令。
了解更多

@layer components {
  .popover {
    @apply rounded-xl shadow-2xl;
  }

  .popover__dialog {
    @apply p-4;
  }

  .popover__heading {
    @apply text-lg font-bold;
  }
}

HeroUI 遵循 BEM 方法论,确保组件变体与状态可复用且易于定制。

CSS 类

Popover 使用以下 CSS 类(查看源码样式):

基础类

  • .popover - Popover 根容器样式
  • .popover__dialog - 对话框内容包裹层
  • .popover__heading - 标题文本样式
  • .popover__trigger - 触发元素样式

交互状态

组件支持以下动画相关状态:

  • 进入[data-entering] — Popover 出现过程中应用
  • 离开[data-exiting] — Popover 消失过程中应用
  • 位置[data-placement="*"] — 根据 Popover 位置应用
  • 焦点:focus-visible[data-focus-visible="true"]

API 参考

Popover Props

Prop类型默认值描述
childrenReact.ReactNode-触发器与内容元素
isOpenboolean-控制 Popover 是否可见(受控)
defaultOpenbooleanfalse初始打开状态(非受控)
onOpenChange(isOpen: boolean) => void-打开状态变化时调用

Popover.Content Props

Prop类型默认值描述
childrenReact.ReactNode-在 Popover 中展示的内容
placement"top" | "bottom" | "left" | "right" (及变体)"bottom"Popover 的位置
offsetnumber8与触发元素的距离
shouldFlipbooleantrue是否允许 Popover 改变方向以适配空间
classNamestring-额外的 CSS 类名
renderDOMRenderFunction<keyof React.JSX.IntrinsicElements, PopoverRenderProps>-通过自定义渲染函数覆盖默认的 DOM 元素。

Popover.Dialog Props

Prop类型默认值描述
childrenReact.ReactNode-对话框内容
classNamestring-额外的 CSS 类名

Popover.Trigger Props

Prop类型默认值描述
childrenReact.ReactNode-触发 Popover 的元素
classNamestring-额外的 CSS 类名

Popover.Arrow Props

Prop类型默认值描述
childrenReact.ReactNode-自定义箭头元素
classNamestring-额外的 CSS 类名
renderDOMRenderFunction<keyof React.JSX.IntrinsicElements, OverlayArrowRenderProps>-通过自定义渲染函数覆盖默认的 DOM 元素。

本页目录