メインコンテンツへスキップ ドキュメントナビゲーションへスキップ

ポップオーバー

サイト上の任意の要素に、iOSのようなBootstrapポップオーバーを追加する方法に関するドキュメントと例です。

概要 🔗

ポップオーバープラグインを使用する際の注意事項

  • ポップオーバーは、配置のためにサードパーティライブラリPopperに依存しています。bootstrap.jsの前にpopper.min.jsを含めるか、Popperを含むbootstrap.bundle.min.jsを使用する必要があります。
  • ポップオーバーには、依存関係としてポップオーバープラグインが必要です。
  • パフォーマンス上の理由から、ポップオーバーはオプトインです。そのため、**自分で初期化する必要があります**。
  • 長さ0のtitlecontentの値では、ポップオーバーが表示されません。
  • より複雑なコンポーネント(入力グループ、ボタングループなど)でのレンダリングの問題を回避するには、container: 'body'を指定します。
  • 非表示の要素でポップオーバーをトリガーしても機能しません。
  • .disabledまたはdisabled属性を持つ要素のポップオーバーは、ラッパー要素でトリガーする必要があります。
  • 複数行にわたってラップされたアンカーからトリガーされた場合、ポップオーバーはアンカーの全体の幅の中央に配置されます。この動作を回避するには、<a>.text-nowrapを使用します。
  • 対応する要素がDOMから削除される前に、ポップオーバーを非表示にする必要があります。
  • ポップオーバーは、シャドウDOM内の要素からトリガーできます。
デフォルトでは、このコンポーネントは組み込みのコンテンツサニタイザーを使用しており、明示的に許可されていないHTML要素はすべて削除されます。詳細については、JavaScriptドキュメントのサニタイザーセクションを参照してください。
このコンポーネントのアニメーション効果は、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で設定されています。

HTMLではtitleまたはdata-bs-titleのいずれかを使用できます。titleが使用されている場合、要素がレンダリングされるとPopperによって自動的にdata-bs-titleに置き換えられます。
HTML
<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を設定します。

HTML
<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;
}
HTML
<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トリガーを使用して、ユーザーがトグル要素以外の要素を次にクリックしたときにポップオーバーを閉じます。

**次のクリックで閉じるには、ブラウザとプラットフォーム間で適切に動作するために、特定のHTMLが必要です。**<button>ではなく<a>要素のみを使用でき、tabindexを含める必要があります。
HTML
<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"の方が、ポップオーバーをすぐに視覚的なフィードバックとして表示する方が好ましい場合があります。

HTML
<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-configdata-bs-、およびjsオブジェクトの統合結果であり、最後に指定されたキー値が他の値をオーバーライドします。

セキュリティ上の理由から、sanitizesanitizeFn、および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
  }
})

メソッド

**すべてのAPIメソッドは非同期であり、トランジションを開始します。** トランジションが開始されるとすぐに呼び出し元に返りますが、終了する前です。さらに、トランジション中のコンポーネントへのメソッド呼び出しは無視されます。JavaScriptのドキュメントで詳細をご覧ください。
メソッド 説明
無効化 要素のポップオーバーが表示される機能を削除します。ポップオーバーは、再度有効化された場合にのみ表示できるようになります。
破棄 要素のポップオーバーを非表示にして破棄します(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...
})