概要
ポップオーバープラグインを使うときに知っておきたいこと
- ポップオーバーはサードパーティ製のライブラリPopperに依存しています。
- ポップオーバーを動作させるには、bootstrap.jsの前にpopper.min.jsをインクルードするか、
popper.js
を含むbootstrap.bundle.min.js
/bootstrap.bundle.js
を使用しなければなりません。 - ポップオーバーは、依存関係としてtooltip pluginが必要です。
- ポップオーバーはパフォーマンス上の理由からオプトインになっているので、自分で初期化する必要があります。
title
とcontent
の値の長さがゼロの場合はポップオーバーを表示しません。- 複雑なコンポーネント(入力グループやボタングループなど)でのレンダリングの問題を避けるために
container: 'body'
を指定します。 - 隠された要素でポップアップオーバーをトリガーすると動作しません。
.disabled
要素のポップオーバーは、ラッパー要素上でトリガされなければなりません。- 複数の行にまたがるアンカーからトリガーされると、ポップオーバーはアンカーの全幅の中央に配置されます。 この動作を回避するには、
<a>
で.text-nowrap
を使用します。 - ポップオーバーは、対応する要素がDOMから削除される前に非表示にする必要があります。
- ポップオーバーはshadow DOM内の要素のおかげでトリガーすることができます。
prefers-reduced-motion
メディアクエリに依存します。アクセシビリティのドキュメントのモーションの低減セクション を参照してください。
ポップオーバーがどのように機能するかを確認するために読んでください。
例
ポップオーバーの有効化
上記のように、ポップオーバーを使用する前に初期化する必要があります。ページ上のすべてのポップオーバーを初期化する1つの方法は、次のように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
を使用した場合、ポップオーバーは要素がレンダリングされるときに自動的に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つのオプションが利用可能です。BootstrapをRTLで使用する場合、方向はミラーリングされます。方向を変更するには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
のカスタム
親要素にポップオーバーの邪魔になるスタイルがある場合、カスタムしたcontainer
を指定して、ポップオーバーのHTMLをその要素内に表示させることができます。これはレスポンシブテーブルや入力グループなどでよくあることです。
const popover = new bootstrap.Popover('.example-popover', {
container: 'body'
})
モーダル内のポップオーバーでは、明示的にカスタムcontainer
を設定する必要があります。モーダルダイアログはフォーカスをトラップするので、ポップオーバーがモーダルの子要素でない限り、ユーザーはこれらのインタラクティブな要素にフォーカスを当てたり、アクティブにしたりすることができません。
const popover = new bootstrap.Popover('.example-popover', {
container: '.modal-body'
})
カスタムポップオーバー
Added in v5.2.0CSS変数を使ってポップオーバーの外観をカスタマイズすることができます。data-bs-custom-class="custom-popover"
でカスタムクラスを設定して、カスタムした外観をスコープし、ローカルCSS変数の一部をオーバーライドするために使用します。
.custom-popover {
--bs-popover-max-width: 200px;
--bs-popover-border-color: var(--bs-primary);
--bs-popover-header-bg: var(--bs-primary);
--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
トリガーを使用します。
<a>
タグを使用し、<button>
タグを使用しないでください。また、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
属性を持つ要素はインタラクティブではありません。つまり、ユーザーがカーソルを合わせたりクリックしたりしても、ポップオーバー(またはツールチップ)が表示されません。回避策としては、ラッパーの<div>
または<span>
からポップオーバーをトリガーし、 理想的には、tabindex="0"
を使ってキーボード・フォーカスを可能します。
無効化された ポップオーバーのトリガーについては、`data-trigger=“hover"を使用できます。これにより、ユーザーは無効化された要素を click することを期待していないため、ポップオーバーがすぐに視覚的なフィードバックとしてユーザーに表示されます。
<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
変数
Added in v5.2.0Bootstrapの進化する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: $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
オプションでリッチで構造化されたHTMLをポップオーバーに挿入することができますが、過剰な量のコンテンツ追加は避けることを強くお勧めします。ポップオーバーが現在機能する方法は、一度表示されると、そのコンテンツはaria-describedby
属性を持つトリガー要素に結び付けられます。その結果、 ポップオーバーのコンテンツ全体が、スクリーンリーダーを利用するユーザーに長くて途切れることのないストリームとしてアナウンスされることになります。
ポップオーバーはキーボードフォーカスの順序を管理せず、その配置は DOM 内でランダムになり得ます。そのため、インタラクティブな要素(フォームやリンクなど)を追加する際には注意が必要です。非論理的なフォーカスの順序になったり、キーボードユーザがポップオーバーのコンテンツ自体に完全に到達できなくなったりする可能性があります。これらの要素を使用しなければならない場合、代わりにモーダルダイアログを使用することを検討してください。
オプション
オプションはデータ属性やJavaScriptで渡すことができるので、data-bs-animation="{value}"
のように、data-bs-
にオプション名を付加することができる。データ属性でオプションを渡す場合は、オプション名の大文字と小文字を"camelCase“から”kebab-case“に変更することを忘れないようにしましょう。例えば、data-bs-customClass="beautifier"
の代わりに data-bs-custom-class="beautifier"
を使用します。
Bootstrap 5.2.0では、全てのコンポーネントが 実験的 予約データ属性 data-bs-config
をサポートしており、JSON文字列として簡単なコンポーネント設定を収容することができます。要素に 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 object
のマージ結果であり、最新のキー値が他の値を上書きする。
sanitize
,sanitizeFn
およびallowList
オプションはデータ属性を用いて指定することができないことに注意してください。
Name | Type | Default | Description |
---|---|---|---|
allowList |
object | Default value | 許可された属性とタグを含むオブジェクト |
animation |
boolean | true |
ポップオーバーにCSSのフェード遷移を適用します。 |
boundary |
string, element | 'clippingParents' |
ポップオーバーのオーバフロー制約境界(PopperのpreventOverflowモディファイアにのみ適用されます)。デフォルトでは'clippingParents' で、HTML要素の参照を受け取ることができます(JavaScript経由のみ)。詳しくはPopperのdetectOverflow docsを参照してください。 |
container |
string, element, false | false |
指定した要素にポップオーバーを付加する。例:container: 'body' . このオプションは、ポップオーバーを文書の流れの中でトリガーとなる要素の近くに配置することができるという点で特に有用です。 |
content |
string, element, function | '' |
data-bs-content 属性が存在しない場合のデフォルトのコンテンツ値です。関数が指定された場合、その関数はポップオーバーがアタッチされている要素にthis リファレンスが設定された状態で呼び出されます。 |
customClass |
string, function | '' |
ポップオーバーが表示されるときにクラスを追加します。これらのクラスはテンプレートで指定されたクラスに加えて追加されることに注意してください。複数のクラスを追加するには、空白で区切ります:'class-1 class-2' . また、追加のクラス名を含む単一の文字列を返す関数を渡すこともできます。 |
delay |
number, object | 0 |
ポップオーバーの表示と非表示の遅延(ms)は手動トリガータイプには適用されません。数値が指定された場合、表示/非表示の両方にディレイが適用されます。オブジェクトの構造は次のとおりです。:delay: { "show": 500, "hide": 100 } |
fallbackPlacements |
string, array | ['top', 'right', 'bottom', 'left'] |
フォールバック・プレイスメントを定義するには、プレイスメントのリストを配列で指定します(優先順)。詳しくはPopperのbehavior docsを参照してください。 |
html |
boolean | false |
ポップオーバーにHTMLを許可します。trueの場合、ポップオーバーのtitle に含まれるHTMLタグがポップオーバー内にレンダリングされます。falseの場合、innerText プロパティがDOMにコンテンツを挿入するために使用されます。XSS攻撃が心配な場合はテキストを使用してください。 |
offset |
number, string, function | [0, 0] |
ターゲットに対するポップオーバーのオフセットです。データ属性にカンマ区切りの文字列を渡すことができます:data-bs-offset="10,20" . オフセットを決定するために関数が使用される場合、その関数はポッパーの配置、参照、ポッパー rects を含むオブジェクトを第一引数として呼び出されます。トリガーとなる要素のDOMノードは第二引数として渡されます。この関数は、2つの数値からなる配列を返さなければなりません:skidding,distance。 詳しくはPopperのoffset docsを参照してください。 |
placement |
string, function | 'top' |
auto、top、bottom、left、rightのポップオーバーの配置方法があります。auto が指定された場合、動的にポップオーバーの向きを変更します。配置を決定するために関数が使用される場合、その関数はポップオーバーのDOMノードを第一引数として、トリガーとなる要素DOMノードを第二引数として呼び出されます。this コンテキストはポップオーバーインスタンスに設定されます。 |
popperConfig |
null, object, function | null |
BootstrapのデフォルトPopperコンフィギュレーションを変更するには、Popperのコンフィギュレーションを参照してください。Popperコンフィギュレーションを作成するために関数が使われるとき、 BootstrapのデフォルトPopperコンフィギュレーションを含むオブジェクトで呼び出されます。これは、デフォルトとあなた自身のコンフィギュレーションを使用したりマージしたりするのに役立ちます。関数はPopperのためのコンフィギュレーション・オブジェクトを返さなければなりません。 |
sanitize |
boolean | true |
サニタイズ処理を有効または無効にする。有効にするとtemplate' 、content' 、title' オプションがサニタイズされます。 |
sanitizeFn |
null, function | null |
ここでは、独自のサニタイズ関数を指定することができます。これは、サニタイズ処理に専用のライブラリを使いたい場合に便利です。 |
selector |
string, false | false |
セレクタが指定された場合、ポップオーバーオブジェクトは指定されたターゲットに委譲されます。実際には、これは動的に追加されたDOM要素にもポップオーバーを適用するために使用されます(jQuery.on をサポート)。この問題と参考例を参照してください。注意:title 属性はセレクタとして使用しないでください。 |
template |
string | '<div class="popover" role="popover"><div class="popover-arrow"></div><div class="popover-inner"></div></div>' |
ポップオーバーを作成するときに使用するベースのHTML。ポップオーバーのtitle は.popover-inner に入ります。.popover-arrow はポップオーバーの矢印になります。一番外側のラッパー要素は.popover クラスとrole="popover" を持つ必要があります。 |
title |
string, element, function | '' |
title 属性が存在しない場合のデフォルトのタイトル値です。関数が指定された場合、その関数はポップオーバーがアタッチされている要素にthis リファレンスが設定された状態で呼び出されます。 |
trigger |
string | '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
}
})
Methods
Method | Description |
---|---|
disable |
要素のポップオーバーを表示する機能を削除します。ポップオーバーは、再度有効にした場合にのみ表示されるようになります。 |
dispose |
要素のポップオーバーを非表示にして破棄する(DOM要素に保存されているデータを削除する)。デリゲーションを使用するポップオーバー(selector オプションを使用して作成される)は、子孫のトリガー要素で個別に破棄することはできません。 |
enable |
要素のポップオーバーを表示する機能を付与します。ポップオーバーはデフォルトで有効です。 |
getInstance |
DOM要素に関連付けられたポップオーバーのインスタンスを取得できる_Static_ メソッドです。 |
getOrCreateInstance |
DOM要素に関連付けられたポップオーバーのインスタンスを取得したり、初期化されていない場合に新しいインスタンスを作成したりすることができる_Static_ メソッドです。 |
hide |
要素のポップオーバーを非表示にします。ポップオーバーが実際に隠される前に(すなわちhidden.bs.popover イベントが発生する前に)呼び出し元に返されます。これは、ポップオーバーの「手動」トリガーとみなされます。 |
setContent |
初期化後にポップオーバーの内容を変更する方法を提供します。 |
show |
要素のポップオーバーを表示します。ポップオーバーが実際に表示される前に(つまりshown.bs.popover イベントが発生する前に)呼び出し元に返されます。これは、ポップオーバーの「手動」トリガーとみなされます。タイトルとコンテンツの両方がゼロ長のポップオーバーは決して表示されません。 |
toggle |
popover要素をトグルします。ポップオーバーが実際に表示または非表示になる前に呼び出し元に戻ります(shown.bs.popover やhidden.bs.popover が発生する前). これはPopoverの"manual" トリガーとみなされます。 |
toggleEnabled |
要素のポップオーバーの表示・非表示を切り替えます。 |
update |
要素のポップオーバーの位置を更新する。 |
// getOrCreateInstance example
const popover = bootstrap.Popover.getOrCreateInstance('#example') // Returns a Bootstrap popover instance
// setContent example
myPopover.setContent({
'.popover-header': 'another title',
'.popover-body': 'another content'
})
setContent
メソッドはobject
引数を受け取ります。それぞれのproperty-keyはポップオーバーテンプレートの中で有効なstring
セレクタで、関連する property-value はstring
| element
| function
| null
です。
イベント
Event | Description |
---|---|
hide.bs.popover |
hide インスタンスメソッドが呼び出されたときにすぐに発生します。 |
hidden.bs.popover |
Popoverの非表示が完了したときに発生します(CSSトランジションが完了するのを待ちます)。 |
inserted.bs.popover |
show.bs.popover イベントの後に、PopoverのテンプレートがDOMに追加されたときに発生します。 |
show.bs.popover |
show インスタンスメソッドが呼び出されたときにすぐに発生します。 |
shown.bs.popover |
Popoverがユーザーに見えるようになったときに発生します(CSSトランジションが完了するのを待ちます)。 |
const myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', () => {
// do something...
})