Skip to main content Skip to docs navigation

ポップオーバー

Popovers

ポップオーバーをサイト上の任意の要素に追加するためのドキュメントと例を示します。

概要

ポップオーバープラグインを使うときに知っておきたいこと

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

HTML内ではtitledata-bs-titleのどちらかを使用して下さい。titleを使用した場合、ポップオーバーは要素がレンダリングされるときに自動的に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つのオプションが利用可能です。BootstrapをRTLで使用する場合、方向はミラーリングされます。方向を変更するには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のカスタム

親要素にポップオーバーの邪魔になるスタイルがある場合、カスタムした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.0

CSS変数を使ってポップオーバーの外観をカスタマイズすることができます。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;
}
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が必要です。 ブラウザーやプラットフォームに関係なく適切に動作させるには、<a>タグを使用し、<button>タグを使用しないでください。また、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属性を持つ要素はインタラクティブではありません。つまり、ユーザーがカーソルを合わせたりクリックしたりしても、ポップオーバー(またはツールチップ)が表示されません。回避策としては、ラッパーの<div>または<span>からポップオーバーをトリガーし、 理想的には、tabindex="0"を使ってキーボード・フォーカスを可能します。

無効化された ポップオーバーのトリガーについては、`data-trigger=“hover"を使用できます。これにより、ユーザーは無効化された要素を click することを期待していないため、ポップオーバーがすぐに視覚的なフィードバックとしてユーザーに表示されます。

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

変数

Added in 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:                $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-configdata-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

すべてのAPIメソッドは非同期でトランジションを開始します。 トランジションが開始されるとすぐに、しかし終了する前に、呼び出し元に戻ります。また、遷移中のコンポーネントに対するメソッド呼び出しは無視されます。詳しくはJavaScriptのドキュメントをご覧ください
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.popoverhidden.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...
})