GitHubで見る

ポップオーバー

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

概要

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

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

ポップオーバーがどのように機能するかをいくつかの例で見ていきましょう。

例: すべてのポップオーバーを有効にする

ページ上のすべてのポップオーバーを初期化する1つの方法は、data-toggle属性でそれらを選択することです

$(function () {
  $('[data-toggle="popover"]').popover()
})

例: container オプションを使用する

親要素にポップオーバーを妨害するスタイルがある場合は、ポップオーバーのHTMLがその要素内に表示されるように、カスタムのcontainerを指定する必要があります。

$(function () {
  $('.example-popover').popover({
    container: 'body'
  })
})

<button type="button" class="btn btn-lg btn-danger" data-toggle="popover" title="Popover title" data-content="And here's some amazing content. It's very engaging. Right?">Click to toggle popover</button>

4つの方向

上、右、下、左揃えの4つのオプションがあります。

<button type="button" class="btn btn-secondary" data-container="body" data-toggle="popover" data-placement="top" data-content="Top popover">
  Popover on top
</button>
<button type="button" class="btn btn-secondary" data-container="body" data-toggle="popover" data-placement="right" data-content="Right popover">
  Popover on right
</button>
<button type="button" class="btn btn-secondary" data-container="body" data-toggle="popover" data-placement="bottom" data-content="Bottom popover">
  Popover on bottom
</button>
<button type="button" class="btn btn-secondary" data-container="body" data-toggle="popover" data-placement="left" data-content="Left popover">
  Popover on left
</button>

次のクリックで消去

トグル要素以外の要素をユーザーが次にクリックしたときにポップオーバーを消去するには、focusトリガーを使用します。

次のクリックで消去するための特定のマークアップが必要です

ブラウザおよびプラットフォーム間での適切な動作のためには、<button>タグではなく<a>タグを使用し、tabindex属性を含める必要があります。

<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-toggle="popover" data-trigger="focus" title="Dismissible popover" data-content="And here's some amazing content. It's very engaging. Right?">Dismissible popover</a>
$('.popover-dismiss').popover({
  trigger: 'focus'
})

無効な要素

disabled属性を持つ要素はインタラクティブではないため、ユーザーはポップオーバー(またはツールチップ)をトリガーするためにホバーまたはクリックできません。回避策として、ラッパー<div>または<span>からポップオーバーをトリガーし、無効な要素のpointer-eventsをオーバーライドする必要があります。

無効なポップオーバートリガーの場合、ユーザーが無効な要素をクリックすることを期待していない可能性があるため、data-trigger="hover"を使用して、ポップオーバーがユーザーへの視覚的なフィードバックとしてすぐに表示されるようにすることもできます。

<span class="d-inline-block" data-toggle="popover" data-content="Disabled popover">
  <button class="btn btn-primary" style="pointer-events: none;" type="button" disabled>Disabled button</button>
</span>

使い方

JavaScriptでポップオーバーを有効にする

$('#example').popover(options)
GPUアクセラレーション

GPUアクセラレーションと変更されたシステムDPIにより、Windows 10デバイスでポップオーバーがぼやけて表示される場合があります。v4でのこの回避策は、必要に応じてポップオーバーでGPUアクセラレーションを無効にすることです。

推奨される修正

Popper.Defaults.modifiers.computeStyle.gpuAcceleration = !(window.devicePixelRatio < 1.5 && /Win/.test(navigator.platform))

キーボードおよび支援技術ユーザー向けにポップオーバーを機能させる

キーボードユーザーがポップオーバーをアクティブ化できるようにするには、従来キーボードでフォーカス可能でインタラクティブなHTML要素(リンクやフォームコントロールなど)にのみ追加する必要があります。任意のHTML要素(<span>など)は、tabindex="0"属性を追加することでフォーカス可能にすることができますが、これはキーボードユーザーにとって非インタラクティブな要素で潜在的に迷惑で紛らわしいタブストップを追加することになり、ほとんどの支援技術は現在この状況でポップオーバーのコンテンツをアナウンスしません。さらに、キーボードユーザーがトリガーできないため、ポップオーバーのトリガーとしてhoverのみに依存しないでください。

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

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

オプション

オプションは、データ属性またはJavaScriptを介して渡すことができます。データ属性の場合、data-animation=""のように、オプション名をdata-に追加します。

セキュリティ上の理由から、sanitizesanitizeFn、およびwhiteListオプションはデータ属性を使用して指定できないことに注意してください。
名前 タイプ デフォルト 説明
animation boolean true ポップオーバーにCSSフェードトランジションを適用する
container string | element | false false

ポップオーバーを特定の要素に追加します。例: container: 'body'。このオプションは、ポップオーバーをトリガー要素の近くのドキュメントフローに配置できるようにするため、特に便利です。これにより、ウィンドウサイズを変更中にポップオーバーがトリガー要素から離れて浮遊するのを防ぐことができます。

content string | element | function ''

data-content属性が存在しない場合のデフォルトのコンテンツ値。

関数が与えられた場合、ポップオーバーがアタッチされている要素にthis参照が設定された状態で呼び出されます。

delay number | object 0

ポップオーバーの表示と非表示の遅延(ms)- 手動トリガータイプには適用されません

数値が指定された場合、遅延は表示/非表示の両方に適用されます

オブジェクト構造は次のとおりです: delay: { "show": 500, "hide": 100 }

html boolean false ポップオーバーにHTMLを挿入します。falseの場合、jQueryのtextメソッドを使用してコンテンツをDOMに挿入します。XSS攻撃が心配な場合は、textを使用してください。
placement string | function 'right'

ポップオーバーの位置を決定する方法 - auto | top | bottom | left | right。
autoが指定されている場合、ポップオーバーを動的に再配置します。

配置を決定するために関数が使用される場合、ポップオーバーのDOMノードが最初の引数として、トリガー要素のDOMノードが2番目の引数として呼び出されます。thisコンテキストは、ポップオーバーインスタンスに設定されます。

selector string | false false セレクターが指定されている場合、ポップオーバーオブジェクトは指定されたターゲットに委任されます。実際には、これはダイナミックHTMLコンテンツにポップオーバーを追加するために使用されます。これ有益な例を参照してください。
template string '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'

ポップオーバーを作成するときに使用するベースHTML。

ポップオーバーのtitle.popover-headerに挿入されます。

ポップオーバーのcontent.popover-bodyに挿入されます。

.arrowがポップオーバーの矢印になります。

最も外側のラッパー要素には、.popoverクラスが必要です。

title string | element | function ''

title属性が存在しない場合のデフォルトのタイトル値。

関数が与えられた場合、ポップオーバーがアタッチされている要素にthis参照が設定された状態で呼び出されます。

trigger string 'click' ポップオーバーがトリガーされる方法 - click | hover | focus | manual。複数のトリガーを渡すことができます。それらをスペースで区切ります。manualは他のトリガーと組み合わせることはできません。
offset number | string 0 ポップオーバーのターゲットからのオフセット。詳細については、Popperのオフセットドキュメントを参照してください。
fallbackPlacement string | array 'flip' フォールバック時にPopperが使用する位置を指定できます。詳細については、Popperの動作ドキュメントを参照してください。
customClass string | function ''

ポップオーバーが表示されたときにクラスを追加します。これらのクラスは、テンプレートで指定されたクラスに加えて追加されることに注意してください。複数のクラスを追加するには、スペースで区切ります: 'a b'

追加のクラス名を含む単一の文字列を返す関数を渡すこともできます。

boundary string | element 'scrollParent' ポップオーバーのオーバーフロー制約境界。'viewport''window''scrollParent'、またはHTMLElement参照(JavaScriptのみ)の値を受け入れます。詳細については、PopperのpreventOverflowドキュメントを参照してください。
sanitize boolean true サニタイズを有効または無効にします。有効にすると、'template''content'、および'title'オプションがサニタイズされます。詳細は、JavaScriptドキュメントのサニタイザーセクションを参照してください。
whiteList object デフォルト値 許可される属性とタグを含むオブジェクト
sanitizeFn null | function null 独自のサニタイズ関数を提供できます。サニタイズを実行するために専用のライブラリを使用したい場合に便利です。
popperConfig null | object null BootstrapのデフォルトのPopper設定を変更するには、Popperの構成を参照してください。

個々のポップオーバーのデータ属性

個々のポップオーバーのオプションは、上記で説明したように、データ属性を使用して指定することもできます。

メソッド

非同期メソッドとトランジション

すべてのAPIメソッドは非同期であり、トランジションを開始します。トランジションが開始されるとすぐに呼び出し元に制御が戻りますが、トランジションが終了する前です。さらに、トランジション中のコンポーネントに対するメソッド呼び出しは無視されます

詳細については、JavaScriptドキュメントを参照してください。.

$().popover(options)

要素コレクションのポップオーバーを初期化します。

.popover('show')

要素のポップオーバーを表示します。ポップオーバーが実際に表示される前(つまり、shown.bs.popoverイベントが発生する前)に、呼び出し元に制御が戻ります。これはポップオーバーの「手動」トリガーと見なされます。タイトルとコンテンツの両方がゼロ長のポップオーバーは表示されません。

$('#element').popover('show')

.popover('hide')

要素のポップオーバーを非表示にします。ポップオーバーが実際に非表示になる前(つまり、hidden.bs.popoverイベントが発生する前)に、呼び出し元に制御が戻ります。これはポップオーバーの「手動」トリガーと見なされます。

$('#element').popover('hide')

.popover('toggle')

要素のポップオーバーを切り替えます。ポップオーバーが実際に表示または非表示になる前(つまり、shown.bs.popoverまたはhidden.bs.popoverイベントが発生する前)に、呼び出し元に制御が戻ります。これはポップオーバーの「手動」トリガーと見なされます。

$('#element').popover('toggle')

.popover('dispose')

要素のポップオーバーを非表示にして破棄します。デリゲーションを使用するポップオーバー(selectorオプションを使用して作成されたポップオーバー)は、子孫のトリガー要素で個別に破棄することはできません。

$('#element').popover('dispose')

.popover('enable')

要素のポップオーバーを表示できるようにします。ポップオーバーはデフォルトで有効になっています。

$('#element').popover('enable')

.popover('disable')

要素のポップオーバーを表示する機能を削除します。ポップオーバーは、再度有効にされた場合にのみ表示できます。

$('#element').popover('disable')

.popover('toggleEnabled')

要素のポップオーバーを表示または非表示にする機能を切り替えます。

$('#element').popover('toggleEnabled')

.popover('update')

要素のポップオーバーの位置を更新します。

$('#element').popover('update')

イベント

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