ポップオーバー Popovers
iOSのようなBootstrap popoverをサイトの任意の要素に追加するためのドキュメントと例です。
概要
popoverプラグインを使用する際に知っておくべきこと:
- Popoverは、位置決めのためにサードパーティライブラリPopperに依存しています。
bootstrap.jsの前にpopper.min.jsを含めるか、Popperを含むbootstrap.bundle.min.jsを使用する必要があります。 - Popoverは依存関係としてpopoverプラグインを必要とします。
- Popoverはパフォーマンス上の理由からオプトインであるため、自分で初期化する必要があります。
- 長さがゼロの
titleとcontentの値は、popoverを表示しません。 - より複雑なコンポーネント(input groups、button groupsなど)でのレンダリングの問題を回避するために、
container: 'body'を指定してください。 - 非表示要素でpopoverをトリガーしても機能しません。
.disabledまたはdisabled要素のpopoverは、ラッパー要素でトリガーする必要があります。- 複数行にわたるアンカーからトリガーされた場合、popoverはアンカーの全体的な幅の間に中央配置されます。この動作を回避するには、
<a>に.text-nowrapを使用してください。 - Popoverは、対応する要素がDOMから削除される前に非表示にする必要があります。
- Popoverは、shadow DOM内の要素のおかげでトリガーできます。
デフォルトでは、このコンポーネントは組み込みのコンテンツサニタイザーを使用しており、明示的に許可されていないHTML要素を除去します。詳細については、JavaScriptドキュメントのsanitizerセクションを参照してください。
このコンポーネントのアニメーション効果は、prefers-reduced-motionメディアクエリに依存しています。詳細については、アクセシビリティドキュメントのreduced motionセクションを参照してください。
popoverがいくつかの例でどのように機能するかを見続けてください。
例
ポップオーバーを有効にする
上記のように、popoverを使用する前に初期化する必要があります。ページ上のすべてのpopoverを初期化する1つの方法は、次のようにdata-bs-toggle属性で選択することです:
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))
ライブデモ
上記のスニペットと同様のJavaScriptを使用して、次のライブpopoverをレンダリングします。タイトルはdata-bs-titleを介して設定され、本文のコンテンツはdata-bs-contentを介して設定されます。
HTMLでは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つのオプションが利用可能です: top、right、bottom、left。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
親要素にpopoverを妨げるスタイルがある場合、popoverのHTMLがその要素内に表示されるように、カスタムcontainerを指定する必要があります。これは、レスポンシブテーブル、input groups、およびその他の場合に一般的です。
const popover = new bootstrap.Popover('.example-popover', {
container: 'body'
})
明示的なカスタムcontainerを設定する必要があるもう1つの状況は、modal dialog内のpopoverで、popover自体がmodalに追加されるようにすることです。これは、インタラクティブ要素を含むpopoverにとって特に重要です。modal dialogはフォーカスをトラップするため、popoverがmodalの子要素でない限り、ユーザーはこれらのインタラクティブ要素をフォーカスまたはアクティブ化できません。
const popover = new bootstrap.Popover('.example-popover', {
container: '.modal-body'
})
カスタムポップオーバー
Added in v5.2.0CSS変数を使用して、popoverの外観をカスタマイズできます。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トリガーを使用して、ユーザーがトグル要素以外の要素を次にクリックしたときにpopoverを却下します。
次のクリックで却下するには、適切なクロスブラウザおよびクロスプラットフォームの動作のために特定のHTMLが必要です。 <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属性を持つ要素はインタラクティブではないため、ユーザーはそれらにカーソルを合わせたりクリックしたりして、popover(またはtooltip)をトリガーすることはできません。回避策として、ラッパー<div>または<span>からpopoverをトリガーし、理想的にはtabindex="0"を使用してキーボードフォーカス可能にします。
無効なpopoverトリガーの場合、ユーザーが無効な要素を_クリック_することを期待しない可能性があるため、即座の視覚的フィードバックとしてpopoverが表示されるように、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
変数
Added in v5.2.0BootstrapのCSS変数アプローチの進化の一環として、popoverは.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を介してpopoverを有効にします:
const exampleEl = document.getElementById('example')
const popover = new bootstrap.Popover(exampleEl, options)
キーボードおよび支援技術ユーザーがpopoverにアクセスできるようにするには、伝統的にキーボードフォーカス可能でインタラクティブなHTML要素(リンクやフォームコントロールなど)にのみ追加してください。他のHTML要素はtabindex="0"を追加することでフォーカス可能にできますが、これはキーボードユーザーにとって非インタラクティブ要素に煩わしく混乱を招くタブストップを作成する可能性があり、ほとんどの支援技術は現在この状況でpopoverをアナウンスしません。さらに、hoverだけをpopoverのトリガーとして頼らないでください。これにより、キーボードユーザーがトリガーすることが不可能になります。
htmlオプションを使用してpopoverに過度の量のコンテンツを追加しないでください。popoverが表示されると、そのコンテンツはaria-describedby属性を持つトリガー要素に結び付けられ、popoverのコンテンツすべてが支援技術ユーザーに1つの長い中断されないストリームとしてアナウンスされます。
Popoverはキーボードフォーカス順序を管理せず、DOM内でのその配置はランダムになる可能性があるため、インタラクティブ要素(フォームやリンクなど)を追加する際は注意してください。これにより、論理的でないフォーカス順序につながったり、popoverコンテンツ自体がキーボードユーザーにとって完全に到達不可能になったりする可能性があります。これらの要素を使用する必要がある場合は、代わりにmodal dialogの使用を検討してください。
オプション
オプションはdata属性またはJavaScriptを介して渡すことができます。data-bs-にオプション名を追加できます。例: data-bs-animation="{value}"。data属性を介してオプションを渡す場合は、オプション名の大文字小文字を"camelCase"から"kebab-case"に変更してください。例えば、data-bs-customClass="beautifier"の代わりにdata-bs-custom-class="beautifier"を使用します。
Bootstrap 5.2.0以降、すべてのコンポーネントは、JSON文字列として単純なコンポーネント設定を格納できる実験的な予約済みdata属性data-bs-configをサポートしています。要素にdata-bs-config='{"delay":0, "title":123}'とdata-bs-title="456"属性がある場合、最終的なtitle値は456になり、個別のdata属性はdata-bs-configで指定された値を上書きします。さらに、既存のdata属性はdata-bs-delay='{"show":0,"hide":150}'のようなJSON値を格納できます。
最終的な設定オブジェクトは、data-bs-config、data-bs-、およびjs objectのマージされた結果であり、最後に指定されたキー値が他の値を上書きします。
セキュリティ上の理由から、sanitize、sanitizeFn、およびallowListオプションはdata属性を使用して提供できないことに注意してください。
| Name | Type | Default | Description |
|---|---|---|---|
allowList | object | Default value | 許可されたタグと属性を含むオブジェクトです。明示的に許可されていないものは、the content sanitizerによって削除されます。 このリストに追加する際は注意してください。 詳細については、OWASP's Cross Site Scripting Prevention Cheat Sheetを参照してください。 |
animation | boolean | true | popoverにCSSフェードトランジションを適用します。 |
boundary | string, element | 'clippingParents' | popoverのオーバーフロー制約境界(Popperのpreventoverflow modifierにのみ適用されます)。デフォルトでは'clippingParents'であり、HTMLElement参照を受け入れることができます(JavaScriptのみ)。詳細については、PopperのdetectOverflow docsを参照してください。 |
container | string, element, false | false | popoverを特定の要素に追加します。例: container: 'body'。このオプションは、トリガー要素の近くのドキュメントのフローにpopoverを配置できるため、特に便利です。これにより、ウィンドウのサイズ変更中にトリガー要素からpopoverが離れるのを防ぎます。 |
content | string, element, function | '' | popoverのテキストコンテンツ。関数が与えられた場合、そのthis参照はpopoverがアタッチされている要素に設定されて呼び出されます。 |
customClass | string, function | '' | 表示時にpopoverにクラスを追加します。これらのクラスは、テンプレートで指定されたクラスに追加されることに注意してください。複数のクラスを追加するには、スペースで区切ります: 'class-1 class-2'。追加のクラス名を含む単一の文字列を返す関数を渡すこともできます。 |
delay | number, object | 0 | popoverの表示と非表示の遅延(ミリ秒)—手動トリガータイプには適用されません。数値が指定された場合、遅延はhide/showの両方に適用されます。オブジェクト構造は: delay: { "show": 500, "hide": 100 }。 |
fallbackPlacements | string, array | ['top', 'right', 'bottom', 'left'] | 配列で配置のリストを提供することにより、フォールバック配置を定義します(優先順)。詳細については、Popperのbehavior docsを参照してください。 |
html | boolean | false | popoverでHTMLを許可します。trueの場合、popoverのtitleのHTMLタグがpopoverでレンダリングされます。falseの場合、innerTextプロパティを使用してコンテンツをDOMに挿入します。XSS攻撃を防ぐために、ユーザー生成入力を扱う際はテキストを使用してください。 |
offset | number, string, function | [0, 8] | ターゲットに対するpopoverのオフセット。data属性でカンマ区切り値を持つ文字列を渡すことができます: data-bs-offset="10,20"。関数を使用してオフセットを決定する場合、ポッパーの配置、参照、およびポッパーのrectを含むオブジェクトが最初の引数として呼び出されます。トリガー要素のDOMノードは2番目の引数として渡されます。関数は2つの数値を持つ配列を返す必要があります: skidding、distance。詳細については、Popperのoffset docsを参照してください。 |
placement | string, function | 'right' | popoverの配置方法: auto、top、bottom、left、right。autoが指定されると、popoverを動的に再方向付けします。関数を使用して配置を決定する場合、popover DOMノードが最初の引数として、トリガー要素DOMノードが2番目として呼び出されます。thisコンテキストはpopoverインスタンスに設定されます。 |
popperConfig | null, object, function | null | Bootstrapのデフォルトpopper configを変更するには、Popper's configurationを参照してください。関数を使用してpopper configurationを作成する場合、Bootstrapのデフォルトpopper configurationを含むオブジェクトで呼び出されます。これにより、デフォルトを使用して独自の設定とマージできます。関数はpopperの設定オブジェクトを返す必要があります。 |
sanitize | boolean | true | content sanitizationを有効にします。trueの場合、template、content、およびtitleオプションがサニタイズされます。 コンテンツサニタイズを無効にする際は注意してください。 詳細については、OWASP's Cross Site Scripting Prevention Cheat Sheetを参照してください。コンテンツサニタイズを無効にすることのみによって引き起こされる脆弱性は、Bootstrapのセキュリティモデルの範囲内とは見なされません。 |
sanitizeFn | null, function | null | 代替content sanitization関数を提供します。サニタイズを実行するために専用のライブラリを使用したい場合に便利です。 |
selector | string, false | false | セレクタが提供されている場合、popoverオブジェクトは指定されたターゲットに委任されます。実際には、これは動的に追加されたDOM要素(jQuery.onサポート)にもpopoverを適用するために使用されます。this issueとan informative exampleを参照してください。注意: title属性はセレクタとして使用してはいけません。 |
template | string | '<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>' | popoverを作成する際に使用する基本HTML。popoverのtitleは.popover-headerに注入されます。popoverのcontentは.popover-bodyに注入されます。.popover-arrowはpopoverの矢印になります。最も外側のラッパー要素には.popoverクラスとrole="tooltip"が必要です。 |
title | string, element, function | '' | popoverタイトル。関数が与えられた場合、そのthis参照はpopoverがアタッチされている要素に設定されて呼び出されます。 |
trigger | string | 'click' | popoverのトリガー方法: click、hover、focus、manual。複数のトリガーを渡すことができます。スペースで区切ります。'manual'は、popoverが.popover('show')、.popover('hide')、.popover('toggle')メソッドを介してプログラム的にトリガーされることを示します。この値は他のトリガーと組み合わせることはできません。'hover'単独では、キーボードを介してトリガーできないpopoverになり、キーボードユーザーに同じ情報を伝える代替方法が存在する場合にのみ使用する必要があります。 |
popperConfigで関数を使用する
const popover = new bootstrap.Popover(element, {
popperConfig(defaultBsPopperConfig) {
// const newPopperConfig = {...}
// use defaultBsPopperConfig if needed...
// return newPopperConfig
}
})
メソッド
すべてのAPIメソッドは非同期でトランジションを開始します。 トランジションが開始されるとすぐに呼び出し元に戻りますが、終了する前に戻ります。さらに、トランジション中のコンポーネントに対するメソッド呼び出しは無視されます。JavaScriptドキュメントで詳細を確認してください。
| Method | Description |
|---|---|
disable | 要素のpopoverを表示する機能を削除します。popoverは、再度有効にされた場合にのみ表示できます。 |
dispose | 要素のpopoverを非表示にして破棄します(DOM要素に保存されたデータを削除します)。委任を使用するpopover(selectorオプションを使用して作成されたもの)は、子孫トリガー要素で個別に破棄することはできません。 |
enable | 要素のpopoverを表示する機能を付与します。Popoverはデフォルトで有効になっています。 |
getInstance | DOM要素に関連付けられたpopoverインスタンスを取得できる静的メソッドです。 |
getOrCreateInstance | DOM要素に関連付けられたpopoverインスタンスを取得するか、初期化されていない場合は新しいインスタンスを作成する静的メソッドです。 |
hide | 要素のpopoverを非表示にします。popoverが実際に非表示になる前に呼び出し元に戻ります(つまり、hidden.bs.popoverイベントが発生する前)。これはpopoverの「手動」トリガーと見なされます。 |
setContent | 初期化後にpopoverのコンテンツを変更する方法を提供します。 |
show | 要素のpopoverを表示します。popoverが実際に表示される前に呼び出し元に戻ります(つまり、shown.bs.popoverイベントが発生する前)。これはpopoverの「手動」トリガーと見なされます。タイトルとコンテンツの両方が長さゼロのpopoverは表示されません。 |
toggle | 要素のpopoverを切り替えます。popoverが実際に表示または非表示になる前に呼び出し元に戻ります(つまり、shown.bs.popoverまたはhidden.bs.popoverイベントが発生する前)。これはpopoverの「手動」トリガーと見なされます。 |
toggleEnabled | 要素のpopoverを表示または非表示にする機能を切り替えます。 |
update | 要素のpopoverの位置を更新します。 |
// 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引数を受け入れます。各プロパティキーはpopoverテンプレート内の有効なstringセレクタであり、各関連プロパティ値はstring | element | function | nullになります。
イベント
| Event | Description |
|---|---|
hide.bs.popover | このイベントは、hideインスタンスメソッドが呼び出されたときに即座に発生します。 |
hidden.bs.popover | このイベントは、popoverがユーザーから非表示にされたときに発生します(CSSトランジションの完了を待ちます)。 |
inserted.bs.popover | このイベントは、popoverテンプレートがDOMに追加されたときのshow.bs.popoverイベントの後に発生します。 |
show.bs.popover | このイベントは、showインスタンスメソッドが呼び出されたときに即座に発生します。 |
shown.bs.popover | このイベントは、popoverがユーザーに表示されたときに発生します(CSSトランジションの完了を待ちます)。 |
const myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', () => {
// do something...
})