Skip to main content
Version: v7

ion-popover

shadow

Popoverは、現在のページの上部に表示されるダイアログです。これは何にでも使用できますが、通常はナビゲーションバーに収まらないオーバーフローアクションに使用されます。

ion-popover を使用するには、インラインで使用する方法と popoverController を使用する方法がります。それぞれの方法には異なる考慮点があるので、あなたのユースケースに最も適した方法を使用するようにしましょう。

インラインポップオーバー

ion-popover は、テンプレートに直接コンポーネントを記述して使用することができます。これにより、ポップオーバーを表示するために必要なハンドラの数を減らすことができます。

Angular、React、Vue で ion-popover を使用する場合、渡されたコンポーネントはポップオーバーが解除されると破棄されます。この機能は JavaScript フレームワークによって提供されるので、JavaScript フレームワークを使わずに ion-popover を使用しても、渡したコンポーネントは破棄されない。この機能が必要な場合は、代わりに popoverController を使用することを推奨します

いつ使うか

ポップオーバーをインラインで使用することは、ポップオーバーを開くためにクリックイベントを明示的に配線したくない場合に便利です。例えば、 trigger プロパティを使用して、クリックされたときにポップオーバーを表示するボタンを指定することができます。また、trigger-action プロパティを使って、トリガーが左クリックされたとき、右クリックされたとき、ホーバーされたときにポップオーバーを表示するかどうかをカスタマイズすることができます。

もし、ポップオーバーの表示と非表示を細かく制御したい場合は、 popoverController を使用することをお勧めします。

Angular

渡されたコンポーネントは、ポップオーバーが表示されたときに作成され、ポップオーバーが解除されたときに破棄される必要があるため、内部で <ng-content> を使用してコンテンツを投影することはできません。代わりに、<ng-container> を使用します。これは、<ng-template> が渡されることを想定しています。そのため、コンポーネントを渡す際には、<ng-template>でラップする必要があります。

<ion-popover [isOpen]="isPopoverOpen">
<ng-template>
<app-popover-content></app-popover-content>
</ng-template>
</ion-popover>

トリガー

インラインの ion-popover のトリガーは、インタラクションされたときにポップオーバーを開く要素です。インタラクションの動作は trigger-action プロパティを設定することでカスタマイズすることができます。なお、trigger-action="context-menu" はシステムのデフォルトのコンテキストメニューを開かせないようにします。

note

popoverController を使用する場合、ion-popover は前もって作成されないので、トリガーは適用されません。

isOpen プロパティ

インラインポップオーバーは isOpen プロパティを true に設定することによっても開くことができます。この方法はトリガーよりも細かくポップオーバーをコントロールする必要がある場合に使用されます。

isOpen は一方向のデータバインディングを使用しています。つまり、ポップオーバーが閉じられたときに自動的に false に設定されることはありません。開発者は ionPopoverDidDismiss または didDismiss イベントをリッスンして isOpenfalse にセットする必要があります。この理由は、ion-popover の内部がアプリケーションの状態と密に結合されるのを防ぐためである。一方通行のデータバインディングでは、ポップオーバーはリアクティブ変数が提供するブーリアン値だけを気にすればよいのです。双方向のデータバインディングでは、ポップオーバーはブール値とリアクティブ変数の存在の両方に関心を持つ必要があります。これは非決定的な動作につながり、アプリケーションのデバッグを難しくします。

ポップオーバーコントローラ

Ionic Framework からインポートされた popoverController を使用することで、ion-popover をプログラム的に表示することも可能です。これにより、インラインポップオーバーのカスタマイズ以上に、ポップオーバーを表示するタイミングを完全に制御することができます。

どのような場合に使用するのか

ポップオーバーはインラインで記述することをお勧めします。ポップオーバーをインラインで書くことが現実的でない複雑なユースケースの場合にのみ popoverController を使用すべきです。コントローラを使用する場合、ポップオーバーは前もって作成されないので、 triggertrigger-action などのプロパティはここでは適用されません。さらに、ネストされたポップオーバーはコントローラのアプローチと互換性がありません。なぜなら、ポップオーバーは create メソッドが呼ばれたときに自動的にアプリケーションのルートに追加されるからです。

React

コントローラの代わりに、React には useIonPopover というHookがあり、同じような振る舞いをします。なお、 useIonPopover<IonApp> の子孫であることが必要です。もし、 <IonApp> の外側でポップオーバーを使用する必要がある場合は、代わりにインラインポップオーバーを使用することを検討してください。

使い方

スタイリング

ポップオーバーはアプリケーションのルートで表示されるので、アプリケーション全体を覆うように表示されます。この動作はインラインポップオーバーとコントローラから表示されるポップオーバーの両方に適用されます。そのため、カスタムポップオーバースタイリングは特定のコンポーネントにスコープすることができません。代わりに、スタイルはグローバルに適用されなければなりません。ほとんどの開発者は、カスタムスタイルを global.css に配置すれば十分です。

note

If you are building an Ionic Angular app, the styles need to be added to a global stylesheet file.

配置

リファレンス

ポップオーバーを表示するとき、Ionic Framework はポップオーバーを相対的に表示するための参照点を必要とします。reference="event" を指定すると、ポップオーバーはトリガー要素で dispatch されたポインターイベントのx-y座標に相対的に表示されます。 reference="trigger" を指定すると、ポップオーバーはトリガー要素のバウンディングボックスに対して相対的に表示されます。

Side

side プロパティを使用することで、基準点の上、右、左、下のいずれかにポップオーバーを配置することができます。また、LTRやRTLのモードに応じてサイドを切り替えたい場合は、 startend を使用することができます。

Alignment

alignment プロパティは、ポップオーバーのエッジをトリガーエレメントの対応するエッジに揃えることができます。使用される正確なエッジは side プロパティの値に依存します。

Side and Alignment Demo

オフセット

ポップオーバーの位置をより細かく制御したい場合は、CSS 変数 --offset-x--offset-y を使用することができます。例えば、--offset-x: 10px はポップオーバーのコンテンツを 10px だけ右側に移動させます。

サイズ調整

ドロップダウンメニューを作成するとき、ポップオーバーの幅をトリガー要素の幅と一致させたい場合があります。トリガーの幅を事前に知らずにこれを行うのは厄介です。 size プロパティを 'cover' に設定すると、Ionic Framework はポップオーバーの幅をトリガー要素の幅に一致させるようにします。

popoverController を使用する場合は、event オプションでイベントを指定する必要があり、Ionic Framework は event.target を参照要素に使用します。このパターンの例は controller demo を参照してください。

ポップオーバーをネスト

インラインで ion-popover を使用する場合、ポップオーバーを入れ子にして入れ子のドロップダウンメニューを作成することができます。このとき、最初のポップオーバーの背景だけが表示されるので、ポップオーバーを開くたびに画面がだんだん暗くなっていくことはありません。

dismissOnSelect プロパティを使用すると、ポップオーバーのコンテンツがクリックされたときに自動的にポップオーバーを閉じることができます。この動作は、他のポップオーバーのトリガー要素をクリックしたときには適用されません。

note

popoverController を使用する場合、ネストしたポップオーバーは作成できません。なぜなら、ポップオーバーは create メソッドが呼ばれたときに、自動的にアプリケーションのルートに追加されるからです。

Interfaces

以下に、popoverController を使用する際に利用可能なすべてのオプションを示します。これらのオプションは popoverController.create() を呼び出す際に指定します。

interface PopoverOptions {
component: any;
componentProps?: { [key: string]: any };
showBackdrop?: boolean;
backdropDismiss?: boolean;
translucent?: boolean;
cssClass?: string | string[];
event?: Event;
animated?: boolean;

mode?: 'ios' | 'md';
keyboardClose?: boolean;
id?: string;
htmlAttributes?: { [key: string]: any };

enterAnimation?: AnimationBuilder;
leaveAnimation?: AnimationBuilder;

size?: PopoverSize;
dismissOnSelect?: boolean;
reference?: PositionReference;
side?: PositionSide;
alignment?: PositionAlign;
arrow?: boolean;
}

Types

以下に、ion-popover のすべてのカスタムTypeを紹介します。

type PopoverSize = 'cover' | 'auto';
type TriggerAction = 'click' | 'hover' | 'context-menu';
type PositionReference = 'trigger' | 'event';
type PositionSide = 'top' | 'right' | 'bottom' | 'left' | 'start' | 'end';
type PositionAlign = 'start' | 'center' | 'end';

アクセシビリティ

キーボードナビゲーション

ion-popover は、ポップオーバー内のフォーカス可能な要素間を移動するための基本的なキーボードをサポートしています。次の表は、それぞれのキーが何をするのかの詳細です:

KeyFunction
TabMoves focus to the next focusable element.
Shift + TabMoves focus to the previous focusable element.
EscCloses the popover.
Space or EnterClicks the focusable element.

ion-popover は、 button プロパティを持つ ion-item 要素間を移動するための矢印キーを完全にサポートしています。最も一般的な使用例としては、デスクトップにフォーカスしたアプリケーションにおけるドロップダウンメニューとして使用することができます。基本的なキーボードのサポートに加え、次の表ではドロップダウンメニューの矢印キーのサポートについて詳しく説明します。

KeyFunction
ArrowUpMoves focus to the previous focusable element.
ArrowDownMoves focus to the next focusable element.
HomeMoves focus to the first focusable element.
EndMoves focus to the last focusable element.
ArrowLeftWhen used in a child popover, closes the popover and returns focus to the parent popover.
Space, Enter, and ArrowRightWhen focusing a trigger element, opens the associated popover.

Performance

Innerコンテンツのマウント

インライン ion-popover のコンテンツは、閉じるとマウントされなくなります。このコンテンツのレンダリングにコストがかかる場合、開発者は keepContentsMounted プロパティを使用して、ポップオーバーがマウントされると同時にコンテンツをマウントすることができます。これにより、ポップオーバーが開いたときに内部コンテンツがすでにマウントされているため、アプリケーションの応答性を最適化することができます。

開発者は keepContentsMounted を使用する際に、以下の点に留意する必要があります。

  • この機能は、既存のパフォーマンス問題に対処するための最後の手段として使用する必要があります。この機能は、既存のパフォーマンス問題に対処するための最後の手段として使用されるべきです。また、パフォーマンスの問題を予期してこの機能を使用しないでください。

  • この機能は、JavaScriptフレームワークを使用する場合にのみ必要です。フレームワークを使用していない開発者は、レンダリングするコンテンツをポップオーバーに渡すことができ、コンテンツは自動的にレンダリングされます。

  • この機能はインラインポップオーバーでのみ機能します。 popoverControllerで作成されたポップオーバーは先に作成されないので、内部のコンテンツも作成されません。

  • 内部コンポーネントの JavaScript Framework ライフサイクルフックは、ポップオーバーが表示されたときではなく、ポップオーバーがマウントされたときにすぐに実行されます。

プロパティ

alignment

Descriptionポップオーバーのコンテンツを reference ポイントに揃える方法を記述します。デフォルトは ios モードでは "center" で、md モードでは "start" です。
Attributealignment
Type"center" | "end" | "start" | undefined
Defaultundefined

animated

Descriptiontrueの場合、ポップオーバーはアニメーションを行います。
Attributeanimated
Typeboolean
Defaulttrue

arrow

Descriptiontrueの場合、ios modeで動作しているとき、ポップオーバーは reference を指し示す矢印を表示します。 md modeでは適用されない。
Attributearrow
Typeboolean
Defaulttrue

backdropDismiss

Descriptiontrueの場合、バックドロップがクリックされたときにポップオーバーが解除される。
Attributebackdrop-dismiss
Typeboolean
Defaulttrue

component

Descriptionポップオーバーの内側に表示するコンポーネントです。これを使う必要があるのは、JavaScriptフレームワークを使用していない場合だけです。そうでない場合は、ion-popoverの中にコンポーネントを入れるだけでいいです。
Attributecomponent
TypeFunction | HTMLElement | null | string | undefined
Defaultundefined

componentProps

Descriptionポップオーバー・コンポーネントに渡すデータです。これを使う必要があるのは、JavaScriptフレームワークを使用していない場合だけです。そうでなければ、コンポーネントに直接propsを設定すればよいのです。
Attributeundefined
Typeundefined | { [key: string]: any; }
Defaultundefined

dismissOnSelect

Descriptiontrueの場合、コンテンツがクリックされると、ポップオーバーは自動的に解除される。
Attributedismiss-on-select
Typeboolean
Defaultfalse

enterAnimation

Descriptionポップオーバーが表示されたときに使用するアニメーションです。
Attributeundefined
Type((baseEl: any, opts?: any) => Animation) | undefined
Defaultundefined

event

Descriptionポップオーバー・アニメーションに渡すイベントです。
Attributeevent
Typeany
Defaultundefined

htmlAttributes

Descriptionポップオーバーに渡す追加属性。
Attributeundefined
Typeundefined | { [key: string]: any; }
Defaultundefined

isOpen

Descriptiontrueの場合、ポップオーバーは開く。もし false ならば、ポップオーバーは閉じます。より細かく表示を制御する必要がある場合はこれを使用し、そうでない場合は popoverController または trigger プロパティを使用します。注意: ポップオーバーが閉じると isOpen は自動的に false に戻されません。あなたのコードでそれを行う必要があります。
Attributeis-open
Typeboolean
Defaultfalse

keepContentsMounted

Descriptiontrueの場合、ポップオーバーの作成時に ion-popover に渡されたコンポーネントが自動的にマウントされます。このコンポーネントは、ポップオーバーが削除されてもマウントされたままです。ただし、ポップオーバーが破棄されると、コンポーネントは破棄されます。このプロパティはリアクティブではないので、ポップオーバーを最初に作成するときにのみ使用する必要があります。 注:この機能は、Angular、React、VueなどのJavaScriptフレームワークのインラインポップオーバーにのみ適用されます。
Attributekeep-contents-mounted
Typeboolean
Defaultfalse

keyboardClose

Descriptiontrueの場合、オーバーレイが表示されたときにキーボードが自動的に解除されます。
Attributekeyboard-close
Typeboolean
Defaulttrue

leaveAnimation

Descriptionポップオーバーが解除されたときに使用するアニメーションです。
Attributeundefined
Type((baseEl: any, opts?: any) => Animation) | undefined
Defaultundefined

mode

Descriptionmodeは、どのプラットフォームのスタイルを使用するかを決定します。
Attributemode
Type"ios" | "md"
Defaultundefined

reference

Descriptionポップオーバーを何に対して相対的に配置するかを記述します。もし "trigger" ならば、ポップオーバーはトリガーボタンに相対して配置されます。イベントを渡すと、event.targetによって決定されます。もし "event" ならば、ポップオーバーはトリガーアクションのx/y座標に相対的に配置されます。イベントを渡す場合、これはevent.clientXとevent.clientYを介して決定されます。
Attributereference
Type"event" | "trigger"
Default'trigger'

showBackdrop

Descriptiontrueの場合、ポップオーバーの後ろに背景が表示されます。このプロパティは、ポップオーバーが表示されたときに背景が画面を暗くするかどうかを制御します。このプロパティは、背景がアクティブであるかどうか、またはDOMに存在するかどうかを制御しません。
Attributeshow-backdrop
Typeboolean
Defaulttrue

side

Descriptionポップオーバーを reference ポイントのどちら側に配置するかを記述します。"start""end" の値はRTLを意識しており、"left""right" の値はそうではない。
Attributeside
Type"bottom" | "end" | "left" | "right" | "start" | "top"
Default'bottom'

size

Descriptionポップオーバーの幅を計算する方法を記述します。もし "cover" ならば、ポップオーバーの幅はトリガーの幅と一致します。auto"` の場合、ポップオーバーの幅はポップオーバー内のコンテンツによって決定される。
Attributesize
Type"auto" | "cover"
Default'auto'

translucent

Descriptiontrueの場合、ポップオーバーは半透明になります。modeが "ios" で、デバイスが backdrop-filter をサポートしている場合にのみ適用されます。
Attributetranslucent
Typeboolean
Defaultfalse

trigger

Descriptionポップオーバーを開かせるトリガー要素に対応するIDです。trigger-action`プロパティを使用して、ポップオーバーを開くためのインタラクションをカスタマイズすることができます。
Attributetrigger
Typestring | undefined
Defaultundefined

triggerAction

Descriptionどのようなトリガーとの相互作用でポップオーバーを開くべきかを記述します。 triggerプロパティが undefined の場合は適用されません。"click" の場合、トリガーが左クリックされたときにポップオーバーが表示されます。"hover" の場合、ポインタがトリガーの上に乗ったときにポップオーバーが表示されます。コンテキストメニューの場合、デスクトップでは右クリック、モバイルでは長押しでポップオーバーが表示されます。これは、デバイスの通常のコンテキストメニューが表示されるのを防ぐことにもなります。
Attributetrigger-action
Type"click" | "context-menu" | "hover"
Default'click'

イベント

NameDescription
didDismissポップオーバーが解散した後に発行されます。ionPopoverDidDismissの略記です。
didPresentポップオーバーが提示された後に発行されます。ionPopoverWillDismissの略記です。
ionPopoverDidDismissポップオーバーが解除された後に発行されます。
ionPopoverDidPresentポップオーバーが表示された後に発行されます。
ionPopoverWillDismissポップオーバーが解除される前に発行されます。
ionPopoverWillPresentポップオーバーが表示される前に発行されます。
willDismissポップオーバーが解散する前に発行されます。ionPopoverWillDismissの略記です。
willPresentポップオーバーが提示される前に発行されます。ionPopoverWillPresentの略記です。

メソッド

dismiss

Descriptionポップオーバーオーバーレイが提示された後、それを解除します。
Signaturedismiss(data?: any, role?: string, dismissParentPopover?: boolean) => Promise<boolean>

onDidDismiss

Descriptionポップオーバーが解除されたタイミングを解決するPromiseを返します。
SignatureonDidDismiss<T = any>() => Promise<OverlayEventDetail<T>>

onWillDismiss

Descriptionポップオーバーが解除されるタイミングを解決するPromiseを返します。
SignatureonWillDismiss<T = any>() => Promise<OverlayEventDetail<T>>

present

Descriptionポップオーバーが作成された後に、ポップオーバーを表示します。開発者は、マウス、タッチ、またはポインタイベントを渡すことで、そのイベントがディスパッチされた場所と相対的にポップオーバーを配置することができます。
Signaturepresent(event?: MouseEvent | TouchEvent | PointerEvent | CustomEvent) => Promise<void>

CSS Shadow Parts

NameDescription
arrow参照要素を指し示す矢印。ios mode時のみ適用される。
backdropion-backdrop`要素です。
contentデフォルトslotのラッパー要素です。

CSSカスタムプロパティ

NameDescription
--backdrop-opacity背景の不透明度
--backgroundポップオーバーの背景
--box-shadowポップオーバーのボックスシャドウ
--heightポップオーバーの高さ
--max-heightポップオーバーの最大の高さ
--max-widthポップオーバーの最大幅
--min-heightポップオーバーの高さの最小値
--min-widthポップオーバーの最小幅
--offset-xポップオーバーをX軸方向に移動させる量
--offset-yポップオーバーをY軸方向に移動させる量を指定します。
--widthポップオーバーの幅

Slots

NameDescription
``コンテンツは .popover-content 要素の内部に配置される。