彈出視窗 (Popover)

彈出視窗是一個非強制回應 (non-modal) 的對話框,會浮動在其觸發元素周圍。它通常用於在某個項目之上顯示額外的豐富內容。


安裝

以上指令僅適用於單獨安裝。如果已經全域安裝 @nextui-org/react ,您可以跳過此步驟。

導入

NextUI 導出 3 個與彈出視窗相關的元件

  • Popover:用於顯示彈出視窗的主要元件。
  • PopoverTrigger:觸發彈出視窗的元件。
  • PopoverContent:包含彈出視窗內容的元件。

用法

帶有箭頭

顏色

位置

偏移

受控狀態

標題屬性 (Title Props)

為了確保彈出視窗將正確的標題暴露給輔助技術,您應該在 PopoverContent 元件上使用 titleProps 屬性。要使用此屬性,您必須傳遞一個函式作為子元素。

搭配表單使用

Popover 會處理彈出視窗內容中的焦點。這表示您可以毫無問題地將彈出視窗與表單元素一起使用。當彈出視窗關閉時,焦點會返回到觸發器。

注意:您可以將 autoFocus 屬性新增到第一個 Input 元件,以便在彈出視窗開啟時將焦點放在該元件上。

背景幕 (Backdrop)

Popover 元件有一個 backdrop 屬性,用於在彈出視窗後面顯示一個背景幕。背景幕可以是 transparentopaqueblur。預設值為 transparent

自訂動畫效果 (Custom Motion)

Popover 提供一個 motionProps 屬性,用於自訂 enter / exit 動畫。

在此連結瞭解更多關於 Framer 動畫變體 (motion variants) 的資訊。

自訂觸發器 (Custom Trigger)

插槽 (Slots)

  • base:主要的彈出視窗插槽,它會包裝彈出視窗的內容,並將箭頭作為虛擬元素 (::before) 包含在內。
  • trigger:彈出視窗的觸發器插槽,它具有一些小的樣式,以確保觸發器正常運作。
  • backdrop:背景幕插槽,它包含背景幕的樣式。
  • content:內容插槽,它包含彈出視窗的內容。

自訂樣式 (Custom Styles)

您可以透過將自訂 Tailwind CSS 類別傳遞到元件插槽來自訂 Popover 元件。

資料屬性 (Data Attributes)

PopoverPopoverContent 元素上具有以下屬性

  • data-open:當彈出視窗開啟時。基於彈出視窗狀態。
  • data-placement:彈出視窗的位置。基於 placement 屬性。箭頭元素會根據此屬性定位。
  • data-focus:當彈出視窗正在被聚焦時。基於useFocusRing
  • data-focus-visible:當彈出視窗正在使用鍵盤聚焦時。基於useFocusRing

無障礙 (Accessibility)

  • 觸發器和彈出視窗會透過 ARIA 自動在語意上關聯。
  • 當彈出視窗開啟時,彈出視窗外部的內容會對輔助技術隱藏。
  • 當在外部互動或按下 Escape 鍵時,彈出視窗會關閉。
  • 焦點會在掛載時移入彈出視窗,並在卸載時還原到觸發器元素。
  • 彈出視窗相對於觸發元素定位,並會自動翻轉和調整,以避免與瀏覽器視窗邊緣重疊。
  • 在彈出視窗外滾動會被阻止,以避免意外地重新定位或關閉它。

API

彈出視窗屬性 (Popover Props)

屬性 (Prop)類型 (Type)預設值 (Default)
children*
ReactNode[]
size
sm | md | lg
"md"
color
default | primary | secondary | success | warning | danger
"default"
radius
none | sm | md | lg | full
"lg"
shadow
none | sm | md | lg
"lg"
backdrop
transparent | opaque | blur
"transparent"
placement
PopoverPlacement
"bottom"
state
OverlayTriggerState
isOpen
boolean
defaultOpen
boolean
offset
number
"7"
containerPadding
number
"12"
crossOffset
number
"0"
triggerType
dialog | menu | listbox | tree | grid
"dialog"
showArrow
boolean
false
shouldFlip
boolean
true
triggerScaleOnOpen
boolean
true
shouldBlockScroll
boolean
true
shouldCloseOnScroll
boolean
false
isKeyboardDismissDisabled
boolean
false
shouldCloseOnBlur
boolean
false
motionProps
MotionProps
portalContainer
HTMLElement
"document.body"
disableAnimation
boolean
false
classNames
Partial<Record<'base' | 'trigger' | 'backdrop' | 'content', string>>

彈出視窗事件 (Popover Events)

屬性 (Prop)類型 (Type)預設值 (Default)
onOpenChange
(isOpen: boolean) => void
shouldCloseOnInteractOutside
(e: HTMLElement) => void
onClose
() => void

彈出視窗觸發器屬性 (PopoverTrigger Props)

屬性 (Prop)類型 (Type)預設值 (Default)
children*
ReactNode

彈出視窗內容屬性 (PopoverContent Props)

屬性 (Prop)類型 (Type)預設值 (Default)
children
ReactNode

彈出視窗類型 (Popover types)

彈出視窗位置 (Popover Placement)

動畫屬性 (Motion Props)