ポップオーバー
サイト上の任意の要素に、iOSのようなBootstrapポップオーバーを追加する方法に関するドキュメントと例です。
概要 🔗
ポップオーバープラグインを使用する際の注意事項
- ポップオーバーは、配置のためにサードパーティライブラリPopperに依存しています。
bootstrap.js
の前にpopper.min.jsを含めるか、Popperを含むbootstrap.bundle.min.js
を使用する必要があります。 - ポップオーバーには、依存関係としてポップオーバープラグインが必要です。
- パフォーマンス上の理由から、ポップオーバーはオプトインです。そのため、**自分で初期化する必要があります**。
- 長さ0の
title
とcontent
の値では、ポップオーバーが表示されません。 - より複雑なコンポーネント(入力グループ、ボタングループなど)でのレンダリングの問題を回避するには、
container: 'body'
を指定します。 - 非表示の要素でポップオーバーをトリガーしても機能しません。
.disabled
またはdisabled
属性を持つ要素のポップオーバーは、ラッパー要素でトリガーする必要があります。- 複数行にわたってラップされたアンカーからトリガーされた場合、ポップオーバーはアンカーの全体の幅の中央に配置されます。この動作を回避するには、
<a>
に.text-nowrap
を使用します。 - 対応する要素がDOMから削除される前に、ポップオーバーを非表示にする必要があります。
- ポップオーバーは、シャドウDOM内の要素からトリガーできます。
prefers-reduced-motion
メディアクエリに依存しています。アクセシビリティドキュメントの低モーションセクションを参照してください。ポップオーバーの動作方法をいくつかの例で見ていきましょう。
例 🔗
ポップオーバーを有効にする 🔗
前述のように、ポップオーバーを使用する前に初期化する必要があります。ページ上のすべてのポップオーバーを初期化するには、次のようにdata-bs-toggle
属性で選択する方法があります。
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))
ライブデモ 🔗
次のライブポップオーバーを表示するために、上記のスニペットと同様のJavaScriptを使用しています。タイトルはdata-bs-title
で、本文コンテンツはdata-bs-content
で設定されています。
title
またはdata-bs-title
のいずれかを使用できます。title
が使用されている場合、要素がレンダリングされるとPopperによって自動的にdata-bs-title
に置き換えられます。<button type="button" class="btn btn-lg btn-danger" data-bs-toggle="popover" data-bs-title="Popover title" data-bs-content="And here's some amazing content. It's very engaging. Right?">Click to toggle popover</button>
4方向 🔗
上、右、下、左の4つのオプションがあります。RTLでBootstrapを使用する場合、方向は反転します。方向を変更するには、data-bs-placement
を設定します。
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Top popover">
Popover on top
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="Right popover">
Popover on right
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Bottom popover">
Popover on bottom
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Left popover">
Popover on left
</button>
カスタムcontainer
🔗
親要素にポップオーバーと干渉するスタイルがある場合、ポップオーバーのHTMLがその要素内に表示されるように、カスタムcontainer
を指定する必要があります。これは、レスポンシブテーブル、入力グループなどで一般的です。
const popover = new bootstrap.Popover('.example-popover', {
container: 'body'
})
明示的なカスタムcontainer
を設定する必要があるもう1つの状況は、モーダルダイアログ内のポップオーバーです。これにより、ポップオーバー自体がモーダルに追加されます。これは、インタラクティブな要素を含むポップオーバーに特に重要です。モーダルダイアログはフォーカスをトラップするため、ポップオーバーがモーダルの子要素でない限り、ユーザーはこれらのインタラクティブな要素にフォーカスしたりアクティブにしたりできません。
const popover = new bootstrap.Popover('.example-popover', {
container: '.modal-body'
})
カスタムポップオーバー 🔗
v5.2.0で追加CSS変数を使用して、ポップオーバーの外観をカスタマイズできます。data-bs-custom-class="custom-popover"
を使用してカスタムクラスを設定し、カスタムの外観をスコープし、一部のローカルCSS変数をオーバーライドするために使用します。
.custom-popover {
--bs-popover-max-width: 200px;
--bs-popover-border-color: var(--bd-violet-bg);
--bs-popover-header-bg: var(--bd-violet-bg);
--bs-popover-header-color: var(--bs-white);
--bs-popover-body-padding-x: 1rem;
--bs-popover-body-padding-y: .5rem;
}
<button type="button" class="btn btn-secondary"
data-bs-toggle="popover" data-bs-placement="right"
data-bs-custom-class="custom-popover"
data-bs-title="Custom popover"
data-bs-content="This popover is themed via CSS variables.">
Custom popover
</button>
次のクリックで閉じる 🔗
focus
トリガーを使用して、ユーザーがトグル要素以外の要素を次にクリックしたときにポップオーバーを閉じます。
<button>
ではなく<a>
要素のみを使用でき、tabindex
を含める必要があります。<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-bs-toggle="popover" data-bs-trigger="focus" data-bs-title="Dismissible popover" data-bs-content="And here's some amazing content. It's very engaging. Right?">Dismissible popover</a>
const popover = new bootstrap.Popover('.popover-dismiss', {
trigger: 'focus'
})
無効な要素 🔗
disabled
属性を持つ要素はインタラクティブではないため、ユーザーはポップオーバー(またはツールチップ)をトリガーするためにホバーまたはクリックできません。回避策として、tabindex="0"
を使用してキーボードでフォーカス可能なラッパー<div>
または<span>
からポップオーバーをトリガーする必要があります。
無効なポップオーバートリガーの場合、ユーザーは無効な要素をクリックすることを期待していないため、data-bs-trigger="hover focus"
の方が、ポップオーバーをすぐに視覚的なフィードバックとして表示する方が好ましい場合があります。
<span class="d-inline-block" tabindex="0" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-content="Disabled popover">
<button class="btn btn-primary" type="button" disabled>Disabled button</button>
</span>
CSS 🔗
変数 🔗
v5.2.0で追加Bootstrapの進化するCSS変数アプローチの一部として、ポップオーバーは、リアルタイムのカスタマイズを強化するために、.popover
でローカルCSS変数を使用するようになりました。CSS変数の値はSassで設定されるため、Sassのカスタマイズも引き続きサポートされています。
--#{$prefix}popover-zindex: #{$zindex-popover};
--#{$prefix}popover-max-width: #{$popover-max-width};
@include rfs($popover-font-size, --#{$prefix}popover-font-size);
--#{$prefix}popover-bg: #{$popover-bg};
--#{$prefix}popover-border-width: #{$popover-border-width};
--#{$prefix}popover-border-color: #{$popover-border-color};
--#{$prefix}popover-border-radius: #{$popover-border-radius};
--#{$prefix}popover-inner-border-radius: #{$popover-inner-border-radius};
--#{$prefix}popover-box-shadow: #{$popover-box-shadow};
--#{$prefix}popover-header-padding-x: #{$popover-header-padding-x};
--#{$prefix}popover-header-padding-y: #{$popover-header-padding-y};
@include rfs($popover-header-font-size, --#{$prefix}popover-header-font-size);
--#{$prefix}popover-header-color: #{$popover-header-color};
--#{$prefix}popover-header-bg: #{$popover-header-bg};
--#{$prefix}popover-body-padding-x: #{$popover-body-padding-x};
--#{$prefix}popover-body-padding-y: #{$popover-body-padding-y};
--#{$prefix}popover-body-color: #{$popover-body-color};
--#{$prefix}popover-arrow-width: #{$popover-arrow-width};
--#{$prefix}popover-arrow-height: #{$popover-arrow-height};
--#{$prefix}popover-arrow-border: var(--#{$prefix}popover-border-color);
Sass変数 🔗
$popover-font-size: $font-size-sm;
$popover-bg: var(--#{$prefix}body-bg);
$popover-max-width: 276px;
$popover-border-width: var(--#{$prefix}border-width);
$popover-border-color: var(--#{$prefix}border-color-translucent);
$popover-border-radius: var(--#{$prefix}border-radius-lg);
$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}); // stylelint-disable-line function-disallowed-list
$popover-box-shadow: var(--#{$prefix}box-shadow);
$popover-header-font-size: $font-size-base;
$popover-header-bg: var(--#{$prefix}secondary-bg);
$popover-header-color: $headings-color;
$popover-header-padding-y: .5rem;
$popover-header-padding-x: $spacer;
$popover-body-color: var(--#{$prefix}body-color);
$popover-body-padding-y: $spacer;
$popover-body-padding-x: $spacer;
$popover-arrow-width: 1rem;
$popover-arrow-height: .5rem;
使用方法 🔗
JavaScriptを使用してポップオーバーを有効にする
const exampleEl = document.getElementById('example')
const popover = new bootstrap.Popover(exampleEl, options)
キーボードと支援技術のユーザーがアクセスできるようにするには、伝統的にキーボードでフォーカス可能でインタラクティブなHTML要素(リンクやフォームコントロールなど)のみにポップオーバーを追加してください。他のHTML要素はtabindex="0"
を追加することでフォーカス可能にできますが、これはキーボードユーザーにとって非インタラクティブな要素に迷惑で混乱を招くタブストップを作成する可能性があり、ほとんどの支援技術は現在、この状況ではポップオーバーを発表しません。さらに、ポップオーバーのトリガーとしてhover
のみに依存しないでください。これは、キーボードユーザーがポップオーバーをトリガーできなくなるためです。
html
オプションを使用して、ポップオーバーに過剰なコンテンツを追加しないでください。ポップオーバーが表示されると、そのコンテンツはaria-describedby
属性を使用してトリガー要素に関連付けられ、ポップオーバーのすべてのコンテンツが支援技術ユーザーに1つの長い途切れないストリームとして発表される原因となります。
ポップオーバーはキーボードフォーカスの順序を管理せず、DOMでの配置はランダムである可能性があるため、インタラクティブな要素(フォームやリンクなど)を追加する際は注意してください。これは、論理的でないフォーカスの順序につながったり、ポップオーバーコンテンツ自体をキーボードユーザーにとって完全に到達不能にする可能性があります。これらの要素を使用する必要がある場合は、モーダルダイアログを使用することを検討してください。
オプション 🔗
オプションはデータ属性またはJavaScriptを介して渡すことができるため、data-bs-
にオプション名を付加できます(data-bs-animation="{value}"
など)。データ属性を介してオプションを渡す場合は、オプション名のケースタイプを「camelCase」から「kebab-case」に変更してください。たとえば、data-bs-customClass="beautifier"
ではなくdata-bs-custom-class="beautifier"
を使用します。
Bootstrap 5.2.0以降、すべてのコンポーネントは、JSON文字列として単純なコンポーネント構成を格納できる、**実験的な**予約済みデータ属性data-bs-config
をサポートしています。要素にdata-bs-config='{"delay":0, "title":123}'
およびdata-bs-title="456"
属性がある場合、最終的なtitle
値は456
になり、個別のデータ属性はdata-bs-config
で指定された値をオーバーライドします。さらに、既存のデータ属性はdata-bs-delay='{"show":0,"hide":150}'
のようなJSON値を格納できます。
最終的な構成オブジェクトは、data-bs-config
、data-bs-
、およびjsオブジェクト
の統合結果であり、最後に指定されたキー値が他の値をオーバーライドします。
sanitize
、sanitizeFn
、およびallowList
オプションはデータ属性を使用して提供できません。名称 | 型 | デフォルト | 説明 |
---|---|---|---|
allowList |
オブジェクト | デフォルト値 | 許可された属性とタグを含むオブジェクト。 |
animation |
ブール値 | true |
ポップオーバーにCSSフェードトランジションを適用します。 |
boundary |
文字列、要素 | 'clippingParents' |
ポップオーバーのオーバーフロー制約境界(PopperのpreventOverflow修飾子にのみ適用されます)。デフォルトでは'clippingParents' であり、(JavaScriptのみで)HTMLElement参照を受け入れることができます。詳細については、PopperのdetectOverflow ドキュメントを参照してください。 |
コンテナ |
文字列、要素、false | false |
ポップオーバーを特定の要素に追加します。例: container: 'body' 。このオプションは、トリガー要素の近くにドキュメントの流れの中でポップオーバーを配置できるため特に便利です。これにより、ウィンドウのリサイズ中にポップオーバーがトリガー要素から離れて浮いてしまうのを防ぎます。 |
コンテンツ |
文字列、要素、関数 | '' |
ポップオーバーのテキストコンテンツ。関数が指定されている場合、その関数は、ポップオーバーがアタッチされている要素に`this`参照を設定して呼び出されます。 |
カスタムクラス |
文字列、関数 | '' |
ポップオーバーが表示されるときにクラスを追加します。これらのクラスは、テンプレートで指定されたクラスに加えて追加されることに注意してください。複数のクラスを追加するには、スペースで区切ります: 'class-1 class-2' 。追加のクラス名を格納した単一の文字列を返す関数も渡すことができます。 |
遅延 |
数値、オブジェクト | 0 |
ポップオーバーの表示と非表示を遅らせます(ms) — 手動トリガータイプには適用されません。数値が指定されている場合、遅延は表示/非表示の両方に適用されます。オブジェクト構造は次のとおりです: delay: { "show": 500, "hide": 100 } 。 |
フォールバック配置 |
文字列、配列 | ['top', 'right', 'bottom', 'left'] |
配列で配置のリストを提供することにより、フォールバック配置を定義します(優先順位順)。詳細については、Popperの動作に関するドキュメントを参照してください。 |
HTML |
ブール値 | false |
ポップオーバーでHTMLを許可します。trueの場合、ポップオーバーのtitle 内のHTMLタグはポップオーバーでレンダリングされます。falseの場合、innerText プロパティを使用してコンテンツをDOMに挿入します。XSS攻撃が心配な場合は、テキストを使用してください。 |
オフセット |
数値、文字列、関数 | [0, 0] |
ターゲットに対するポップオーバーのオフセット。コンマ区切りの値でデータ属性に文字列を渡すことができます。例: data-bs-offset="10,20" 。オフセットを決定するために関数を使用する場合、関数は、popper配置、参照、popper四角形を含むオブジェクトを最初の引数として呼び出されます。トリガー要素のDOMノードは、2番目の引数として渡されます。関数は、2つの数値を含む配列を返す必要があります: スキッド、距離。詳細については、Popperのオフセットに関するドキュメントを参照してください。 |
配置 |
文字列、関数 | 'top' |
ポップオーバーの配置方法: auto、top、bottom、left、right。auto が指定されている場合、ポップオーバーは動的に再配置されます。配置を決定するために関数を使用する場合、関数は、最初の引数としてポップオーバーのDOMノード、2番目の引数としてトリガー要素のDOMノードを使用して呼び出されます。`this`コンテキストはポップオーバーインスタンスに設定されます。 |
popperConfig |
null、オブジェクト、関数 | null |
BootstrapのデフォルトのPopper設定を変更するには、Popperの設定を参照してください。関数を用いてPopperの設定を作成する場合、BootstrapのデフォルトのPopper設定を含むオブジェクトを用いて呼び出されます。これにより、デフォルトの設定と独自の設定を組み合わせて使用することができます。関数はPopperの設定オブジェクトを返す必要があります。 |
サニタイズ |
ブール値 | true |
サニタイゼーションを有効または無効にします。有効な場合、'template' 、'content' 、'title' オプションがサニタイズされます。 |
sanitizeFn |
null、関数 | null |
ここで独自のサニタイズ関数を指定できます。これは、サニタイゼーションを実行するために専用のライブラリを使用する場合に便利です。 |
セレクタ |
文字列、false | false |
セレクタが指定されている場合、ポップオーバーオブジェクトは指定されたターゲットに委任されます。実際には、これは動的に追加されたDOM要素にもポップオーバーを適用するために使用されます(jQuery.on サポート)。このissueと参考例を参照してください。**注記**: title 属性はセレクタとして使用できません。 |
テンプレート |
文字列 | '<div class="popover" role="tooltip"><div class="popover-arrow"></div><div class="popover-inner"></div></div>' |
ポップオーバーの作成時に使用する基本HTML。ポップオーバーのtitle は.popover-inner に挿入されます。.popover-arrow はポップオーバーの矢印になります。最外側のラッパー要素には、.popover クラスとrole="tooltip" が必要です。 |
タイトル |
文字列、要素、関数 | '' |
ポップオーバーのタイトル。関数が指定されている場合、その関数は、ポップオーバーがアタッチされている要素に`this`参照を設定して呼び出されます。 |
トリガー |
文字列 | 'hover focus' |
ポップオーバーのトリガー方法: click、hover、focus、manual。複数のトリガーを渡すことができます。スペースで区切ります。'manual' は、ポップオーバーが.popover('show') 、.popover('hide') 、.popover('toggle') メソッドを介してプログラムでトリガーされることを示します。この値は他のトリガーと組み合わせることはできません。'hover' のみでは、キーボードからポップオーバーをトリガーできず、キーボードユーザーに同じ情報を伝える代替方法が存在する場合にのみ使用する必要があります。 |
popperConfig
を使用した関数
const popover = new bootstrap.Popover(element, {
popperConfig(defaultBsPopperConfig) {
// const newPopperConfig = {...}
// use defaultBsPopperConfig if needed...
// return newPopperConfig
}
})
メソッド
メソッド | 説明 |
---|---|
無効化 |
要素のポップオーバーが表示される機能を削除します。ポップオーバーは、再度有効化された場合にのみ表示できるようになります。 |
破棄 |
要素のポップオーバーを非表示にして破棄します(DOM要素に保存されているデータを削除します)。委任を使用するポップオーバー( selector オプションを使用して作成されたもの)は、子孫のトリガー要素で個別に破棄することはできません。 |
有効化 |
要素のポップオーバーが表示される機能を与えます。**ポップオーバーはデフォルトで有効になっています。** |
getInstance |
静的メソッド。DOM要素に関連付けられたポップオーバーインスタンスを取得できます。 |
getOrCreateInstance |
静的メソッド。DOM要素に関連付けられたポップオーバーインスタンスを取得するか、初期化されていない場合は新しいポップオーバーインスタンスを作成します。 |
非表示 |
要素のポップオーバーを非表示にします。ポップオーバーが実際に非表示になる前(つまり、hidden.bs.popover イベントが発生する前)に呼び出し元に返ります。これはポップオーバーの「手動」トリガーと見なされます。 |
setContent |
初期化後にポップオーバーのコンテンツを変更する方法を提供します。 |
表示 |
要素のポップオーバーを表示します。ポップオーバーが実際に表示される前(つまり、shown.bs.popover イベントが発生する前)に呼び出し元に返ります。これはポップオーバーの「手動」トリガーと見なされます。タイトルとコンテンツの両方がゼロ長のポップオーバーは表示されません。 |
切り替え |
要素のポップオーバーを切り替えます。ポップオーバーが実際に表示または非表示になる前(つまり、shown.bs.popover またはhidden.bs.popover イベントが発生する前)に呼び出し元に返ります。これはポップオーバーの「手動」トリガーと見なされます。 |
toggleEnabled |
要素のポップオーバーが表示または非表示になる機能を切り替えます。 |
更新 |
要素のポップオーバーの位置を更新します。 |
// getOrCreateInstance example
const popover = bootstrap.Popover.getOrCreateInstance('#example') // Returns a Bootstrap popover instance
// setContent example
popover.setContent({
'.popover-header': 'another title',
'.popover-body': 'another content'
})
setContent
メソッドはobject
引数を受け入れます。各プロパティキーはポップオーバーテンプレート内の有効なstring
セレクタであり、関連する各プロパティ値はstring
| element
| function
| null
です。イベント
イベント | 説明 |
---|---|
hide.bs.popover |
hide インスタンスメソッドが呼び出されるとすぐに、このイベントが発生します。 |
hidden.bs.popover |
ポップオーバーがユーザーから非表示になったときに発生します(CSSトランジションが完了するまで待機します)。 |
inserted.bs.popover |
ポップオーバーテンプレートがDOMに追加されたときに、show.bs.popover イベント後に発生します。 |
show.bs.popover |
show インスタンスメソッドが呼び出されるとすぐに、このイベントが発生します。 |
shown.bs.popover |
ポップオーバーがユーザーに見えるようになったときに発生します(CSSトランジションが完了するまで待機します)。 |
const myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', () => {
// do something...
})