メインコンテンツにスキップ ドキュメント ナビゲーションにスキップ
Check
in English

ポップオーバー

iOS に見られるような Bootstrap ポップオーバーをサイトの任意の要素に追加するためのドキュメントと例。

概要

popover プラグインを使用する際に知っておくべきこと:

  • ポップオーバーは、サード パーティのライブラリPopperを使用してポジショニングを行います。の前にpopper.min.jsを含めるbootstrap.jsか、Popper を含むものを使用する必要がありbootstrap.bundle.min.jsます。
  • ポップオーバーには、依存関係としてポップオーバー プラグインが必要です。
  • ポップオーバーはパフォーマンス上の理由からオプトインであるため、自分で初期化する必要があります
  • 長さtitlecontent値がゼロの場合、ポップオーバーは表示されません。
  • container: 'body'より複雑なコンポーネント (入力グループ、ボタン グループなど) でのレンダリングの問題を回避するために指定します。
  • 非表示の要素でポップオーバーをトリガーしても機能しません。
  • .disabledまたは要素のポップオーバーはdisabled、ラッパー要素でトリガーする必要があります。
  • 複数の行にまたがるアンカーからトリガーされると、ポップオーバーはアンカーの幅全体の中央に配置されます。この動作を回避するには、 でを使用.text-nowrapします。<a>
  • 対応する要素が 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ます。

titleまたは data-bs-titleHTML で 自由に使用 してください。を使用する と、Popper は要素がレンダリングされるとき 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 つのオプションを使用できます。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

親要素にポップオーバーに干渉するスタイルがある場合、container代わりにポップオーバーの HTML がその要素内に表示されるようにカスタムを指定する必要があります。これは、レスポンシブ テーブル、入力グループなどで一般的です。

const popover = new bootstrap.Popover('.example-popover', {
  container: 'body'
})

明示的なカスタムを設定したい別の状況は、モーダル ダイアログcontainer内のポップオーバーで、ポップオーバー自体がモーダルに追加されるようにします。これは、インタラクティブな要素を含むポップオーバーにとって特に重要です。モーダル ダイアログはフォーカスをトラップするため、ポップオーバーがモーダルの子要素でない限り、ユーザーはこれらのインタラクティブな要素にフォーカスしたりアクティブにしたりすることができません。

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(--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、トグル要素とは異なる要素をユーザーが次にクリックしたときにポップオーバーを閉じます。

次のクリックで閉じるには特定のマークアップが必要

クロスブラウザーおよびクロスプラットフォームで適切に動作させるには、タグではなくタグを使用する必要<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-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);
  

サス変数

$popover-font-size:                 $font-size-sm;
$popover-bg:                        $white;
$popover-max-width:                 276px;
$popover-border-width:              $border-width;
$popover-border-color:              var(--#{$prefix}border-color-translucent);
$popover-border-radius:             $border-radius-lg;
$popover-inner-border-radius:       subtract($popover-border-radius, $popover-border-width);
$popover-box-shadow:                $box-shadow;

$popover-header-font-size:          $font-size-base;
$popover-header-bg:                 shade-color($popover-bg, 6%);
$popover-header-color:              $headings-color;
$popover-header-padding-y:          .5rem;
$popover-header-padding-x:          $spacer;

$popover-body-color:                $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 要素 ( <span>s など) をフォーカス可能にできますがtabindex="0"、これにより、キーボード ユーザーの非対話型要素に迷惑で紛らわしいタブ ストップが追加される可能性があります。現在、ほとんどの支援技術は、この状況でポップオーバーのコンテンツを通知しません。 . hoverさらに、ポップオーバーのトリガーとしてのみに依存しないでください。キーボード ユーザーがポップオーバーをトリガーできなくなります。

オプションを使用してリッチで構造化された HTML をポップオーバーに挿入できますがhtml、過剰な量のコンテンツを追加しないことを強くお勧めします。ポップオーバーが現在機能する方法は、一度表示されると、それらのコンテンツがaria-describedby属性を持つトリガー要素に結び付けられるというものです。その結果、ポップオーバーのコンテンツ全体が、1 つの長く途切れのないストリームとして支援技術ユーザーに通知されます。

さらに、(フォーム要素やリンクなどの) 対話型コントロールをポップオーバーに含めることもできますが (これらの要素をallowList許可された属性とタグに追加することによって)、現在、ポップオーバーはキーボード フォーカスの順序を管理していないことに注意してください。キーボード ユーザーがポップオーバーを開くと、フォーカスはトリガー要素に残ります。ポップオーバーは通常、ドキュメントの構造内でトリガーのすぐ後に続くわけではないため、前方に移動したり押したりする保証はありません。TABキーボード ユーザーをポップオーバー自体に移動します。要するに、単純にインタラクティブなコントロールをポップオーバーに追加すると、キーボード ユーザーや支援技術のユーザーがこれらのコントロールにアクセスできなくなったり、使用できなくなったり、少なくとも全体的なフォーカス順序が非論理的になる可能性があります。このような場合は、代わりにモーダル ダイアログの使用を検討してください。

オプション

オプションはデータ属性または JavaScript を介して渡すことができるためdata-bs-、 のようにオプション名を に追加できますdata-bs-animation="{value}"。データ属性を介してオプションを渡すときは、オプション名のケース タイプを「camelCase」から「kebab-case 」に変更してください。たとえば、data-bs-custom-class="beautifier"の代わりに を使用しdata-bs-customClass="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。さらに、既存のデータ属性は、 のような JSON 値を格納できますdata-bs-delay='{"show":0,"hide":150}'

セキュリティ上の理由から、、、およびオプションは、データ属性を使用して提供できないことに注意し sanitizesanitizeFnください allowList
名前 タイプ デフォルト 説明
allowList 物体 デフォルト値 許可された属性とタグを含むオブジェクト。
animation ブール値 true ポップオーバーに CSS フェード トランジションを適用します。
boundary 文字列、要素 'clippingParents' ポップオーバーのオーバーフロー制約境界 (Popper の preventOverflow 修飾子にのみ適用されます)。デフォルトで'clippingParents'は、HTMLElement 参照を受け入れることができます (JavaScript 経由のみ)。詳細については、Popper のdetectOverflow docsを参照してください。
container 文字列、要素、false false ポップオーバーを特定の要素に追加します。例: container: 'body'. このオプションは、ドキュメントのフロー内でトリガー要素の近くにポップオーバーを配置できるという点で特に便利です。これにより、ウィンドウのサイズ変更中にポップオーバーがトリガー要素から離れてしまうのを防ぐことができます。
content 文字列、要素、関数 '' data-bs-content属性が存在しない場合のデフォルトのコンテンツ値。関数が指定されている場合this、ポップオーバーがアタッチされている要素に設定された参照で呼び出されます。
customClass 文字列、関数 '' ポップオーバーが表示されたらクラスを追加します。これらのクラスは、テンプレートで指定されたクラスに加えて追加されることに注意してください。複数のクラスを追加するには、クラスをスペースで区切ります: 'class-1 class-2'. 追加のクラス名を含む単一の文字列を返す関数を渡すこともできます。
delay 数、オブジェクト 0 ポップオーバーの表示と非表示の遅延 (ミリ秒) — 手動トリガー タイプには適用されません。数値を指定すると、hide/show の両方に遅延が適用されます。オブジェクト構造: delay: { "show": 500, "hide": 100 }.
fallbackPlacements 文字列、配列 ['top', 'right', 'bottom', 'left'] プレースメントのリストを配列 (優先順) で指定して、フォールバック プレースメントを定義します。詳細については、Popper の動作に関するドキュメントを参照してください。
html ブール値 false ポップオーバーで HTML を許可します。true の場合、ポップオーバーの HTML タグがポップオーバーtitleにレンダリングされます。false の場合、innerTextプロパティを使用してコンテンツを DOM に挿入します。XSS 攻撃が心配な場合は、テキストを使用してください。
offset 数値、文字列、関数 [0, 0] ターゲットに対するポップオーバーのオフセット。次のようなカンマ区切りの値を使用して、データ属性に文字列を渡すことができますdata-bs-offset="10,20"。オフセットを決定するために関数が使用される場合、その関数は、最初の引数としてポッパーの配置、参照、およびポッパーの四角形を含むオブジェクトで呼び出されます。トリガー要素の DOM ノードは、2 番目の引数として渡されます。この関数は、 skiddingdistanceの 2 つの数値を含む配列を返さなければなりません。詳細については、Popper のオフセット ドキュメントを参照してください。
placement 文字列、関数 'top' ポップオーバーの配置方法: 自動、上、下、左、右。を指定するautoと、ポップオーバーの向きが動的に変更されます。配置を決定するために関数が使用される場合、最初の引数として popover DOM ノード、2 番目の引数としてトリガー要素 DOM ノードで関数が呼び出されます。thisコンテキストは popover インスタンスに設定されます。
popperConfig null、オブジェクト、関数 null Bootstrap のデフォルトの Popper 設定を変更するには、Popper の設定を参照してください。関数を使用して Popper 構成を作成する場合、Bootstrap のデフォルトの Popper 構成を含むオブジェクトで呼び出されます。デフォルトを使用して独自の構成にマージするのに役立ちます。この関数は、Popper の構成オブジェクトを返さなければなりません。
sanitize ブール値 true サニタイズを有効または無効にします。有効'template'にする'content'と、'title'オプションがサニタイズされます。
sanitizeFn null、関数 null ここでは、独自のサニタイズ関数を指定できます。これは、専用のライブラリを使用してサニタイズを実行したい場合に役立ちます。
selector 文字列、偽 false セレクターが提供されている場合、ポップオーバー オブジェクトは指定されたターゲットに委譲されます。実際には、これは、動的に追加された DOM 要素 (jQuery.onサポート) にポップオーバーを適用するためにも使用されます。この問題有益な例を参照してください。
template ストリング '<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 文字列、要素、関数 '' title属性が存在しない場合のデフォルトのタイトル値。関数が指定されている場合this、ポップオーバーがアタッチされている要素に設定された参照で呼び出されます。
trigger ストリング 'hover focus' ポップオーバーのトリガー方法: クリック、ホバー、フォーカス、手動。複数のトリガーを渡すことができます。スペースで区切ります。、およびメソッド'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 のドキュメントを参照してください

方法 説明
disable 要素のポップオーバーを表示する機能を削除します。ポップオーバーは、再度有効にした場合にのみ表示できます。
dispose 要素のポップオーバーを非表示にして破棄します (DOM 要素に格納されたデータを削除します)。委任を使用するポップオーバー (オプションを使用selectorて作成される) は、子孫トリガー要素で個別に破棄できません。
enable 要素のポップオーバーを表示できるようにします。ポップオーバーはデフォルトで有効になっています。
getInstance DOM 要素に関連付けられたポップオーバー インスタンスを取得できる静的メソッド。
getOrCreateInstance DOM 要素に関連付けられたポップオーバー インスタンスを取得したり、初期化されていない場合に新しいインスタンスを作成したりできる静的メソッド。
hide 要素のポップオーバーを非表示にします。ポップオーバーが実際に非表示になる前 (つまり、イベントが発生する前)に呼び出し元に戻ります。hidden.bs.popoverこれは、ポップオーバーの「手動」トリガーと見なされます。
setContent 初期化後にポップオーバーのコンテンツを変更する方法を提供します。
show 要素のポップオーバーを表示します。ポップオーバーが実際に表示される前 (つまり、イベントが発生する前)に呼び出し元に戻ります。shown.bs.popoverこれは、ポップオーバーの「手動」トリガーと見なされます。タイトルとコンテンツの長さがどちらもゼロのポップオーバーは表示されません。
toggle 要素のポップオーバーを切り替えます。ポップオーバーが実際に表示または非表示になる前 (つまり、orイベントが発生する前)に呼び出し元に戻ります。これは、ポップオーバーの「手動」トリガーと見なされます。shown.bs.popoverhidden.bs.popover
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ます。ここで、各プロパティ キーは stringポップオーバー テンプレート内の有効なセレクターであり、関連する各プロパティ値は string| にすることができます。element| | function| | null

イベント

イベント 説明
hide.bs.popover hideこのイベントは、インスタンス メソッドが呼び出されるとすぐに発生します。
hidden.bs.popover このイベントは、ポップオーバーがユーザーから非表示になったときに発生します (CSS トランジションが完了するのを待ちます)。
inserted.bs.popover このイベントはshow.bs.popover、ポップオーバー テンプレートが DOM に追加されたときに、イベントの後に発生します。
show.bs.popover showこのイベントは、インスタンス メソッドが呼び出されるとすぐに発生します。
shown.bs.popover このイベントは、ポップオーバーがユーザーに表示されるようになったときに発生します (CSS トランジションが完了するのを待ちます)。
const myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', () => {
  // do something...
})