Popover

Popover 是一个 非模态 对话框,它漂浮在其显示区域周围。它通常用于在某物之上显示额外的丰富内容。


安装

npx nextui-cli@latest add popover
以上命令仅用于单独安装。如果 @nextui-org/react 已全局安装,则可以跳过此步骤。

导入

NextUI 导出 3 个与弹出框相关的组件

  • Popover: 用于显示弹出框的主要组件。
  • PopoverTrigger: 触发弹出框的组件。
  • PopoverContent: 包含弹出框内容的组件。

使用

使用箭头

颜色

位置

偏移

受控

标题属性

为了确保弹出框向辅助技术显示正确的标题,您应该在 PopoverContent 组件上使用 titleProps 属性。要使用此属性,您必须将一个函数作为子元素传递。

使用表单

Popover 处理弹出框内容中的焦点。这意味着您可以毫无问题地将弹出框与表单元素一起使用。当弹出框关闭时,焦点将返回到触发器。

注意:您可以将 autoFocus 属性添加到第一个 Input 组件,以便在弹出框打开时将其聚焦。

背景

Popover 组件有一个 backdrop 属性,用于在弹出框后面显示背景。背景可以是 transparentopaqueblur。默认值为 transparent

自定义动画

Popover 提供了一个 motionProps 属性来定制 enter / exit 动画。

了解更多关于 Framer motion 变体的信息 这里.

自定义触发器

插槽

  • base: 主要的 popover 插槽,它包裹 popover 内容并包含箭头作为伪元素 (::before)。
  • trigger: popover 触发器插槽,它有一些小的样式来确保触发器正常工作。
  • backdrop: 背景插槽,它包含背景样式。
  • 内容: 内容插槽,包含弹出框的内容。

自定义样式

您可以通过将自定义 Tailwind CSS 类传递给组件插槽来自定义 Popover 组件。

数据属性

PopoverPopoverContent 元素上具有以下属性

  • data-open: 当弹出框打开时。基于弹出框状态。
  • data-placement: 弹出框的位置。基于 placement 属性。箭头元素根据此属性定位。
  • data-focus: 当弹出框被聚焦时。基于 useFocusRing
  • data-focus-visible: 当弹出框使用键盘获得焦点时。基于 useFocusRing.

无障碍性

  • 触发器和弹出框通过 ARIA 自动关联语义。
  • 弹出框之外的内容在弹出框打开时对辅助技术隐藏。
  • 在弹出框外部交互或按下 Escape 键时,弹出框会关闭。
  • 焦点在挂载时移动到弹出框内,并在卸载时恢复到触发元素。
  • 弹出框相对于触发元素定位,并自动翻转和调整以避免与浏览器窗口边缘重叠。
  • 在弹出框之外阻止滚动,以避免意外地重新定位或关闭弹出框。

API

Popover 属性

属性类型描述默认值
children*ReactNode[]弹出框的内容。通常是 PopoverTriggerPopoverContent.-
sizesm | md | lg弹出框内容的字体大小。md
colordefault | primary | secondary | success | warning | danger弹出框的颜色主题。default
radiusnone | sm | md | lg | full弹出框的圆角。lg
shadownone | sm | md | lg弹出框的阴影。lg
backdroptransparent | opaque | blur弹出框的背景类型。透明
放置位置PopoverPlacement弹出框相对于其触发器参考的放置位置。底部
状态OverlayTriggerState弹出框的受控状态。参见 覆盖状态-
isOpen布尔值弹出框是否默认打开(受控)。-
defaultOpen布尔值弹出框是否默认打开(不受控)。-
偏移量(px)数字参考和弹出框之间的距离或边距。它用于在内部创建偏移量修饰符。7
容器填充(px)数字应在元素与其周围容器之间应用的放置填充。12
交叉偏移量(px)数字沿元素与其锚元素之间的交叉轴应用的额外偏移量。0
触发器类型dialog | menu | listbox | tree | grid;由触发器打开的弹出框类型。对话框
showArrow布尔值弹出框是否应该有箭头。false
shouldFlip布尔值是否应在弹出框即将溢出边界区域时更改其位置并翻转。true
triggerScaleOnOpen布尔值弹出框打开时,触发器是否应缩小。true
shouldBlockScroll布尔值是否阻止弹出框外部滚动。false
isKeyboardDismissDisabled布尔值是否应禁用按 Esc 键关闭弹出框。false
shouldCloseOnBlur布尔值失去焦点或焦点移出弹出框时,弹出框是否应关闭。false
motionPropsMotionProps用于修改 framer motion 动画的 props。使用 variants API 创建您自己的动画。
portalContainerHTMLElement将放置覆盖层门户的容器元素。document.body
updatePositionDepsany[]强制弹出框位置更新的依赖项。[]
triggerRefRefObject<HTMLElement>弹出框相对于其定位的元素的 ref。-
scrollRefRefObject<HTMLElement>弹出框内可滚动区域的 ref。overlayRef
disableAnimation布尔值弹出框是否具有动画效果。false
classNamesRecord<"base"| "trigger"| "backdrop"| "content", string>允许为弹出框插槽设置自定义类名。-

Popover 事件

属性类型描述
onOpenChange(isOpen: boolean) => void弹出框的打开状态发生变化时调用的处理程序。
shouldCloseOnInteractOutside(e: HTMLElement) => void当用户在弹出框 ref 外部与参数元素交互时,如果应调用 onClose,则返回 true。这使您有机会过滤掉不应关闭弹出框的元素的交互。默认情况下,onClose 将始终在覆盖层 ref 外部交互时被调用。
onClose() => void当弹出框应该关闭时调用的处理程序。

PopoverTrigger 属性

属性类型描述默认值
children*ReactNode弹出框触发组件,确保传递的子元素可聚焦。用户可以使用键盘 Tab 键切换到它,并且它可以接受 ref。这对可访问性至关重要。-

PopoverContent 属性

属性类型描述默认值
childrenReactNode当触发器被按下时显示的内容。-

弹出框类型

弹出框位置

type PopoverPlacement =
| "top"
| "bottom"
| "right"
| "left"
| "top-start"
| "top-end"
| "bottom-start"
| "bottom-end"
| "left-start"
| "left-end"
| "right-start"
| "right-end";

运动属性

export type MotionProps = HTMLMotionProps<"div">; // @see https://www.framer.com/motion/