JGuang

气泡卡片

Popover · Ant Design

交互预览
npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23

气泡卡片

点击/鼠标移入元素,弹出气泡式的卡片浮层。

何时使用

当目标元素有进一步的描述和相关操作时,可以收纳到卡片中,根据用户的操作行为进行展现。

和 Tooltip 的区别是,用户可以对浮层上的元素进行操作,因此它可以承载更复杂的内容,比如链接或按钮等。

代码演示

  • 基本 · basic

  • 三种触发方式 · triggerType

  • 位置 · placement

  • 箭头展示 · arrow

  • 贴边偏移 · shift

  • 从浮层内关闭 · control

  • 悬停点击弹出窗口 · hover-with-click

  • 自定义语义结构的样式和类 · style-class

API

通用属性参考:通用属性

参数说明类型默认值版本全局配置
classNames用于自定义组件内部各语义化结构的 class,支持对象或函数Record<SemanticDOM, string> | (info: { props })=> Record<SemanticDOM, string>-5.23.0
content卡片内容ReactNode | () => ReactNode-×
title卡片标题ReactNode | () => ReactNode-×
styles用于自定义组件内部各语义化结构的行内 style,支持对象或函数Record<SemanticDOM, CSSProperties> | (info: { props })=> Record<SemanticDOM, CSSProperties>-5.23.0

<Antd component="Alert" title="以下 API 为 Tooltip、Popconfirm、Popover 共享的 API。" type="info" banner="true"></Antd>

参数说明类型默认值版本全局配置
align请参考 dom-align 进行配置object-×
arrow修改箭头的显示状态以及修改箭头是否指向目标元素中心boolean | { pointAtCenter: boolean }true5.2.0Tooltip: 6.0.0,Popover: 6.0.0,Popconfirm: 6.0.0
autoAdjustOverflow气泡被遮挡时自动调整位置booleantrue×
color背景颜色string-4.3.0×
classNames用于自定义组件内部各语义化结构的 class,支持对象或函数Record<SemanticDOM, string> | (info: { props }) => Record<SemanticDOM, string>-5.23.0Tooltip: 5.23.0,Popover: 5.23.0,Popconfirm: 5.23.0
defaultOpen默认是否显隐booleanfalse4.23.0×
destroyTooltipOnHide关闭后是否销毁 dombooleanfalse×
destroyOnHidden关闭后是否销毁 dombooleanfalse5.25.0×
fresh默认情况下,Tooltip 在关闭时会缓存内容。设置该属性后会始终保持更新booleanfalse5.10.0×
getPopupContainer浮层渲染父节点,默认渲染到 body 上(triggerNode: HTMLElement) => HTMLElement() => document.body×
mouseEnterDelay鼠标移入后延时多少才显示 Tooltip,单位:秒number0.1Tooltip: 6.6.0,Popover: 6.6.0,Popconfirm: 6.6.0
mouseLeaveDelay鼠标移出后延时多少才隐藏 Tooltip,单位:秒number0.1Tooltip: 6.6.0,Popover: 6.6.0,Popconfirm: 6.6.0
overlayClassName卡片类名, 请使用 classNames.root 替换string-×
overlayStyle卡片样式, 请使用 styles.root 替换React.CSSProperties-×
overlayInnerStyle卡片内容区域的样式对象, 请使用 styles.container 替换React.CSSProperties-×
placement气泡框位置,可选 top left right bottom topLeft topRight bottomLeft bottomRight leftTop leftBottom rightTop rightBottomstringtop×
styles用于自定义组件内部各语义化结构的行内 style,支持对象或函数Record<SemanticDOM, CSSProperties> | (info: { props }) => Record<SemanticDOM, CSSProperties>-5.23.0Tooltip: 5.23.0,Popover: 5.23.0,Popconfirm: 5.23.0
trigger触发行为,可选 hover | focus | click | contextMenu,可使用数组设置多个触发行为string | string[]hoverTooltip: 6.1.0,Popover: 6.1.0,Popconfirm: 6.1.0
open用于手动控制浮层显隐,小于 4.23.0 使用 visible(为什么?)booleanfalse4.23.0×
zIndex设置 Tooltip 的 z-indexnumber-×
onOpenChange显示隐藏的回调(open: boolean) => void-4.23.0×

注意

请确保 Popover 的子元素能接受 onMouseEnter、onMouseLeave、onFocus、onClick 事件。

Semantic DOM

语义节点原生说明版本
root根元素,设置绝对定位、层级、变换原点、箭头指向和弹层容器样式—
container容器元素,设置背景色、内边距、圆角、阴影、边框和内容展示样式—
title标题元素,设置标题文本样式和间距—
content内容元素,设置内容文本样式和布局—
arrow箭头元素,设置宽高、位置、颜色和边框样式—

语义说明来源: vendor/components/popover/demo/_semantic.tsx

主题变量(Design Token)

类型、继承关系和原生令牌声明保持固定源码原文;默认值由原生主题计算,并可能受 ConfigProvider 覆盖。本表不伪造静态默认值。

令牌类型原生说明
width?number | string气泡卡片宽度
minWidth?number | string气泡卡片最小宽度
titleMinWidthnumber | string气泡卡片标题最小宽度
zIndexPopupnumber气泡卡片 z-index
innerPaddingnumber见原生声明及继承类型
titlePaddingnumber | string见原生声明及继承类型
titleMarginBottomnumber见原生声明及继承类型
titleBorderBottomstring见原生声明及继承类型
innerContentPaddingnumber | string见原生声明及继承类型

声明来源: vendor/components/popover/style/index.ts

import type { CSSObject } from '@ant-design/cssinjs';

import { resetComponent } from '../../style';

import { initZoomMotion } from '../../style/motion';

import type { ArrowOffsetToken } from '../../style/placementArrow';

import getArrowStyle, { getArrowOffsetToken } from '../../style/placementArrow';

import type { ArrowToken } from '../../style/roundedArrow';

import { getArrowToken } from '../../style/roundedArrow';

import type {
  FullToken,
  GenerateStyle,
  GetDefaultToken,
  PresetColorType,
} from '../../theme/internal';

import { genStyleHooks, mergeToken, PresetColors } from '../../theme/internal';

import { genCssVar } from '../../theme/util/genStyleUtils';

export interface ComponentToken extends ArrowToken, ArrowOffsetToken {
  /**
   * @deprecated Please use `titleMinWidth` instead
   * @desc 气泡卡片宽度
   * @descEN Width of Popover
   */
  width?: number | string;
  /**
   * @deprecated Please use `titleMinWidth` instead
   * @desc 气泡卡片最小宽度
   * @descEN Min width of Popover
   */
  minWidth?: number | string;
  /**
   * @desc 气泡卡片标题最小宽度
   * @descEN Min width of Popover title
   */
  titleMinWidth: number | string;
  /**
   * @desc 气泡卡片 z-index
   * @descEN z-index of Popover
   */
  zIndexPopup: number;
  /** @internal */
  innerPadding: number;
  /** @internal */
  titlePadding: number | string;
  /** @internal */
  titleMarginBottom: number;
  /** @internal */
  titleBorderBottom: string;
  /** @internal */
  innerContentPadding: number | string;
}

/**
 * @desc Popover 组件的 Token
 * @descEN Token for Popover component
 */
export type PopoverToken = FullToken<'Popover'> & {
  /**
   * @desc 气泡卡片背景色
   * @descEN Background color of Popover
   */
  popoverBg: string;
  /**
   * @desc 气泡卡片文字颜色
   * @descEN Text color of Popover
   */
  popoverColor: string;
};

FAQ

<Antd component="Alert" title="以下常见问题均适用于 Tooltip、Popconfirm、Popover 组件" type="warning" banner="true"></Antd>

为何在严格模式中有时候会出现 findDOMNode is deprecated 这个警告?

这是由于 @rc-component/trigger 的实现方式导致的,@rc-component/trigger 强制要求 children 能够接受 ref,否则就会 fallback 到 findDOMNode,所以 children 需要是原生 html 标签,如果不是,则需要使用 React.forwardRef 把 ref 透传到原生 html 标签。

为什么自定义子组件无法正常工作?

类似问题: #15909, #12812。

请确保子元素能接受 onMouseEnter、onMouseLeave、onPointerEnter、onPointerLeave、onFocus、onClick 事件。参考示例

placement 的行为逻辑是什么?

当屏幕空间足够时,会按照 placement 的设置进行弹层。当空间不足时则会取反向位置进行弹层(例如 top 不够时,会改为 bottom,topLeft 不够时会改为 bottomLeft)。单一方向如 top bottom left right 当贴边时进行自动位移:

<img alt="shift" height="200" src="https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*sxaTTJjLtIMAAAAAAAAAAAAADrJ8AQ/original" />

当设置为边缘对齐方向如 topLeft bottomRight 等,则会仅做翻转而不做位移。

如何支持键盘无障碍访问?

Tooltip 等组件的默认触发方式(trigger)为 hover,不包含 focus,因此无法响应键盘聚焦事件。如果你希望组件支持键盘操作,可以通过以下方式开启:

  • 单个组件开启:将 trigger 属性设置为包含 focus 的值,例如 trigger="focus" 或 trigger={['hover', 'focus']}。
  • 全局开启:通过 ConfigProvider 进行全局配置,这样应用内的所有相关组件都会默认支持键盘聚焦触发。
import { ConfigProvider, Tooltip, Button } from 'antd';

// 单个组件
<Tooltip trigger={['hover', 'focus']} title="Title">
  <Button>Button</Button>
</Tooltip>

// 全局配置
<ConfigProvider
  tooltip={{ trigger: ['hover', 'focus'] }}
  popover={{ trigger: ['hover', 'focus'] }}
  popconfirm={{ trigger: ['hover', 'focus'] }}
>
  <App />
</ConfigProvider>

更多问题,请参考 Tooltip FAQ。

原生通用属性

Tips: 以下通用属性适用于 antd 大部分组件,不支持的组件会单独说明。

参数说明类型默认值
style自定义样式CSSProperties-
className自定义类名string-
rootClassName添加在组件最外层的 classNamestring-
autoFocus自动获取焦点,仅对表单类、链接、交互容器等可聚焦元素生效booleanfalse

安装并复现示例

npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23

使用 ConfigProvider 和原生 App,并单独配置 dayjs 语言。每个示例在查看代码中列出完整源码文件和额外固定依赖。示例名称用于选择演示,不是组件通用属性。主题、语言与 SSR 初始化见资源安装指南。

原生类型参考

源码查看器包含未修改的原生实现和以下声明文件,继承类型仍位于原生包中。代码中的英文注释保留为源码参考。

  • vendor/components/popover/PurePanel.tsx
  • vendor/components/popover/index.tsx
  • vendor/components/popover/style/index.ts

来源与许可

https://github.com/ant-design/ant-design/tree/4a39f54842eade4e565ab336ef6097cd7e723cdd

保留原生中英文正文与可执行示例;官网专用的嵌入章节和令牌表格在本地展开。Ant Design 使用 MIT 许可,另列依赖的许可证也需保留。上传预览禁止向外发起请求,不提供后端服务。