shadowPopoverは、現在のページの上部に表示されるダイアログです。これは何にでも使用できますが、通常はナビゲーションバーに収まらないオーバーフローアクションに使用されます。
ion-popover
を使用するには、インラインで使用する方法と popoverController
を使用する方法がります。それぞれの方法には異なる考慮点があるので、あなたのユースケースに最も適した方法を使用するようにしましょう。
ion-popover
は、テンプレートに直接コンポーネントを記述して使用することができます。これにより、ポップオーバーを表示するために必要なハンドラの数を減らすことができます。
Angular、React、Vue で ion-popover
を使用する場合、渡されたコンポーネントはポップオーバーが解除されると破棄されます。この機能は JavaScript フレームワークによって提供されるので、JavaScript フレームワークを使わずに ion-popover
を使用しても、渡したコンポーネントは破棄されない。この機能が必要な場合は、代わりに popoverController
を使用することを推奨します
ポップオーバーをインラインで使用することは、ポップオーバーを開くためにクリックイベントを明示的に配線したくない場合に便利です。例えば、 trigger
プロパティを使用して、クリックされたときにポップオーバーを表示するボタンを指定することができます。また、trigger-action
プロパティを使って、トリガーが左クリックされたとき、右クリックされたとき、ホーバーされたときにポップオーバーを表示するかどうかをカスタマイズすることができます。
もし、ポップオーバーの表示と非表示を細かく制御したい場合は、 popoverController
を使用することをお勧めします。
渡されたコンポーネントは、ポップオーバーが表示されたときに作成され、ポップオーバーが解除されたときに破棄される必要があるため、内部で <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"
はシステムのデフォルトのコンテキストメニューを開かせないようにします。
popoverController
を使用する場合、ion-popover
は前もって作成されないので、トリガーは適用されません。
インラインポップオーバーは isOpen
プロパティを true
に設定することによっても開くことができます。この方法はトリガーよりも細かくポップオーバーをコントロールする必要がある場合に使用されます。
isOpen
は一方向のデータバインディングを使用しています。つまり、ポップオーバーが閉じられたときに自動的に false
に設定されることはありません。開発者は ionPopoverDidDismiss
または didDismiss
イベントをリッスンして isOpen
を false
にセットする必要があります。この理由は、ion-popover
の内部がアプリケーションの状態と密に結合されるのを防ぐためである。一方通行のデータバインディングでは、ポップオーバーはリアクティブ変数が提供するブーリアン値だけを気にすればよいのです。双方向のデータバインディングでは、ポップオーバーはブール値とリアクティブ変数の存在の両方に関心を持つ必要があります。これは非決定的な動作につながり、アプリケーションのデバッグを難しくします。
Ionic Framework からインポートされた popoverController
を使用することで、ion-popover
をプログラム的に表示することも可能です。これにより、インラインポップオーバーのカスタマイズ以上に、ポップオーバーを表示するタイミングを完全に制御することができます。
ポップオーバーはインラインで記述することをお勧めします。ポップオーバーをインラインで書くことが現実的でない複雑なユースケースの場合にのみ popoverController
を使用すべきです。コントローラを使用する場合、ポップオーバーは前もって作成されないので、 trigger
や trigger-action
などのプロパティはここでは適用されません。さらに、ネストされたポップオーバーはコントローラのアプローチと互換性がありません。なぜなら、ポップオーバーは create
メソッドが呼ばれたときに自動的にアプリケーションのルートに追加されるからです。
コントローラの代わりに、React には useIonPopover
というHookがあり、同じような振る舞いをします。なお、 useIonPopover
は <IonApp>
の子孫であることが必要です。もし、 <IonApp>
の外側でポップオーバーを使用する必要がある場合は、代わりにインラインポップオーバーを使用することを検討してください。
ポップオーバーはアプリケーションのルートで表示されるので、アプリケーション全体を覆うように表示されます。この動作はインラインポップオーバーとコントローラから表示されるポップオーバーの両方に適用されます。そのため、カスタムポップオーバースタイリングは特定のコンポーネントにスコープすることができません。代わりに、スタイルはグローバルに適用されなければなりません。ほとんどの開発者は、カスタムスタイルを global.css
に配置すれば十分です。
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
プロパティを使用することで、基準点の上、右、左、下のいずれかにポップオーバーを配置することができます。また、LTRやRTLのモードに応じてサイドを切り替えたい場合は、 start
や end
を使用することができます。
alignment
プロパティは、ポップオーバーのエッジをトリガーエレメントの対応するエッジに揃えることができます。使用される正確なエッジは side
プロパティの値に依存します。
ポップオーバーの位置をより細かく制御したい場合は、CSS 変数 --offset-x
と --offset-y
を使用することができます。例えば、--offset-x: 10px
はポップオーバーのコンテンツを 10px
だけ右側に移動させます。
ドロップダウンメニューを作成するとき、ポップオーバーの幅をトリガー要素の幅と一致させたい場合があります。トリガーの幅を事前に知らずにこれを行うのは厄介です。 size
プロパティを 'cover'
に設定すると、Ionic Framework はポップオーバーの幅をトリガー要素の幅に一致させるようにします。
popoverController
を使用する場合は、event
オプションでイベントを指定する必要があり、Ionic Framework は event.target
を参照要素に使用します。このパターンの例は controller demo を参照してください。
インラインで ion-popover
を使用する場合、ポップオーバーを入れ子にして入れ子のドロップダウンメニューを作成することができます。このとき、最初のポップオーバーの背景だけが表示されるので、ポップオーバーを開くたびに画面がだんだん暗くなっていくことはありません。
dismissOnSelect
プロパティを使用すると、ポップオーバーのコンテンツがクリックされたときに自動的にポップオーバーを閉じることができます。この動作は、他のポップオーバーのトリガー要素をクリックしたときには適用されません。
popoverController
を使用する場合、ネストしたポップオーバーは作成できません。なぜなら、ポップオーバーは create
メソッドが呼ばれたときに、自動的にアプリケーションのルートに追加されるからです。
以下に、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;
}
以下に、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
は、ポップオーバー内のフォーカス可能な要素間を移動するための基本的なキーボードをサポートしています。次の表は、それぞれのキーが何をするのかの詳細です:
Key | Function |
---|
Tab | Moves focus to the next focusable element. |
Shift + Tab | Moves focus to the previous focusable element. |
Esc | Closes the popover. |
Space or Enter | Clicks the focusable element. |
ion-popover
は、 button
プロパティを持つ ion-item
要素間を移動するための矢印キーを完全にサポートしています。最も一般的な使用例としては、デスクトップにフォーカスしたアプリケーションにおけるドロップダウンメニューとして使用することができます。基本的なキーボードのサポートに加え、次の表ではドロップダウンメニューの矢印キーのサポートについて詳しく説明します。
Key | Function |
---|
ArrowUp | Moves focus to the previous focusable element. |
ArrowDown | Moves focus to the next focusable element. |
Home | Moves focus to the first focusable element. |
End | Moves focus to the last focusable element. |
ArrowLeft | When used in a child popover, closes the popover and returns focus to the parent popover. |
Space , Enter , and ArrowRight | When focusing a trigger element, opens the associated popover. |
インライン ion-popover
のコンテンツは、閉じるとマウントされなくなります。このコンテンツのレンダリングにコストがかかる場合、開発者は keepContentsMounted
プロパティを使用して、ポップオーバーがマウントされると同時にコンテンツをマウントすることができます。これにより、ポップオーバーが開いたときに内部コンテンツがすでにマウントされているため、アプリケーションの応答性を最適化することができます。
開発者は keepContentsMounted
を使用する際に、以下の点に留意する必要があります。
この機能は、既存のパフォーマンス問題に対処するための最後の手段として使用する必要があります。この機能は、既存のパフォーマンス問題に対処するための最後の手段として使用されるべきです。また、パフォーマンスの問題を予期してこの機能を使用しないでください。
この機能は、JavaScriptフレームワークを使用する場合にのみ必要です。フレームワークを使用していない開発者は、レンダリングするコンテンツをポップオーバーに渡すことができ、コンテンツは自動的にレンダリングされます。
この機能はインラインポップオーバーでのみ機能します。 popoverController
で作成されたポップオーバーは先に作成されないので、内部のコンテンツも作成されません。
内部コンポーネントの JavaScript Framework ライフサイクルフックは、ポップオーバーが表示されたときではなく、ポップオーバーがマウントされたときにすぐに実行されます。
Description | Describes how to align the popover content with the reference point. Defaults to "center" for ios mode, and "start" for md mode. |
Attribute | alignment |
Type | "center" | "end" | "start" | undefined |
Default | undefined |
Description | true の場合、ポップオーバーはアニメーションを行います。 |
Attribute | animated |
Type | boolean |
Default | true |
Description | If true , the popover will display an arrow that points at the reference when running in ios mode. Does not apply in md mode. |
Attribute | arrow |
Type | boolean |
Default | true |
Description | true の場合、バックドロップがクリックされたときにポップオーバーが解除される。 |
Attribute | backdrop-dismiss |
Type | boolean |
Default | true |
Description | The component to display inside of the popover. You only need to use this if you are not using a JavaScript framework. Otherwise, you can just slot your component inside of ion-popover . |
Attribute | component |
Type | Function | HTMLElement | null | string | undefined |
Default | undefined |
Description | The data to pass to the popover component. You only need to use this if you are not using a JavaScript framework. Otherwise, you can just set the props directly on your component. |
Attribute | undefined |
Type | undefined | { [key: string]: any; } |
Default | undefined |
Description | If true , the popover will be automatically dismissed when the content has been clicked. |
Attribute | dismiss-on-select |
Type | boolean |
Default | false |
Description | ポップオーバーが表示されたときに使用するアニメーションです。 |
Attribute | undefined |
Type | ((baseEl: any, opts?: any) => Animation) | undefined |
Default | undefined |
Description | ポップオーバー・アニメーションに渡すイベントです。 |
Attribute | event |
Type | any |
Default | undefined |
Description | ポップオーバーに渡す追加属性。 |
Attribute | undefined |
Type | undefined | { [key: string]: any; } |
Default | undefined |
Description | If true , the popover will open. If false , the popover will close. Use this if you need finer grained control over presentation, otherwise just use the popoverController or the trigger property. Note: isOpen will not automatically be set back to false when the popover dismisses. You will need to do that in your code. |
Attribute | is-open |
Type | boolean |
Default | false |
keepContentsMounted
Description | If true , the component passed into ion-popover will automatically be mounted when the popover is created. The component will remain mounted even when the popover is dismissed. However, the component will be destroyed when the popover is destroyed. This property is not reactive and should only be used when initially creating a popover.
Note: This feature only applies to inline popovers in JavaScript frameworks such as Angular, React, and Vue. |
Attribute | keep-contents-mounted |
Type | boolean |
Default | false |
Description | true の場合、オーバーレイが表示されたときにキーボードが自動的に解除されます。 |
Attribute | keyboard-close |
Type | boolean |
Default | true |
Description | ポップオーバーが解除されたときに使用するアニメーションです。 |
Attribute | undefined |
Type | ((baseEl: any, opts?: any) => Animation) | undefined |
Default | undefined |
Description | modeは、どのプラットフォームのスタイルを使用するかを決定します。 |
Attribute | mode |
Type | "ios" | "md" |
Default | undefined |
Description | Describes what to position the popover relative to. If "trigger" , the popover will be positioned relative to the trigger button. If passing in an event, this is determined via event.target. If "event" , the popover will be positioned relative to the x/y coordinates of the trigger action. If passing in an event, this is determined via event.clientX and event.clientY. |
Attribute | reference |
Type | "event" | "trigger" |
Default | 'trigger' |
Description | If true , a backdrop will be displayed behind the popover. This property controls whether or not the backdrop darkens the screen when the popover is presented. It does not control whether or not the backdrop is active or present in the DOM. |
Attribute | show-backdrop |
Type | boolean |
Default | true |
Description | Describes which side of the reference point to position the popover on. The "start" and "end" values are RTL-aware, and the "left" and "right" values are not. |
Attribute | side |
Type | "bottom" | "end" | "left" | "right" | "start" | "top" |
Default | 'bottom' |
Description | Describes how to calculate the popover width. If "cover" , the popover width will match the width of the trigger. If "auto" , the popover width will be determined by the content in the popover. |
Attribute | size |
Type | "auto" | "cover" |
Default | 'auto' |
Description | If true , the popover will be translucent. Only applies when the mode is "ios" and the device supports backdrop-filter . |
Attribute | translucent |
Type | boolean |
Default | false |
Description | An ID corresponding to the trigger element that causes the popover to open. Use the trigger-action property to customize the interaction that results in the popover opening. |
Attribute | trigger |
Type | string | undefined |
Default | undefined |
Description | Describes what kind of interaction with the trigger that should cause the popover to open. Does not apply when the trigger property is undefined . If "click" , the popover will be presented when the trigger is left clicked. If "hover" , the popover will be presented when a pointer hovers over the trigger. If "context-menu" , the popover will be presented when the trigger is right clicked on desktop and long pressed on mobile. This will also prevent your device's normal context menu from appearing. |
Attribute | trigger-action |
Type | "click" | "context-menu" | "hover" |
Default | 'click' |
Name | Description |
---|
didDismiss | Emitted after the popover has dismissed. Shorthand for ionPopoverDidDismiss. |
didPresent | Emitted after the popover has presented. Shorthand for ionPopoverWillDismiss. |
ionPopoverDidDismiss | ポップオーバーが解除された後に発行されます。 |
ionPopoverDidPresent | ポップオーバーが表示された後に発行されます。 |
ionPopoverWillDismiss | ポップオーバーが解除される前に発行されます。 |
ionPopoverWillPresent | ポップオーバーが表示される前に発行されます。 |
willDismiss | Emitted before the popover has dismissed. Shorthand for ionPopoverWillDismiss. |
willPresent | Emitted before the popover has presented. Shorthand for ionPopoverWillPresent. |
Description | ポップオーバーオーバーレイが提示された後、それを解除します。 |
Signature | dismiss(data?: any, role?: string, dismissParentPopover?: boolean) => Promise<boolean> |
Description | ポップオーバーが解除されたタイミングを解決するPromiseを返します。 |
Signature | onDidDismiss<T = any>() => Promise<OverlayEventDetail<T>> |
Description | ポップオーバーが解除されるタイミングを解決するPromiseを返します。 |
Signature | onWillDismiss<T = any>() => Promise<OverlayEventDetail<T>> |
Description | Present the popover overlay after it has been created. Developers can pass a mouse, touch, or pointer event to position the popover relative to where that event was dispatched. |
Signature | present(event?: MouseEvent | TouchEvent | PointerEvent | CustomEvent) => Promise<void> |
Name | Description |
---|
arrow | 参照要素を指し示す矢印。ios mode時のみ適用される。 |
backdrop | ion-backdrop`要素です。 |
content | デフォルトslotのラッパー要素です。 |
Name | Description |
---|
--backdrop-opacity | 背景の不透明度 |
--background | ポップオーバーの背景 |
--box-shadow | ポップオーバーのボックスシャドウ |
--height | ポップオーバーの高さ |
--max-height | ポップオーバーの最大の高さ |
--max-width | ポップオーバーの最大幅 |
--min-height | ポップオーバーの高さの最小値 |
--min-width | ポップオーバーの最小幅 |
--offset-x | ポップオーバーをX軸方向に移動させる量 |
--offset-y | ポップオーバーをY軸方向に移動させる量を指定します。 |
--width | ポップオーバーの幅 |
Name | Description |
---|
`` | コンテンツは .popover-content 要素の内部に配置される。 |