ポップオーバー
iOSにあるようなBootstrapポップオーバーをサイト上の任意の要素に追加するためのドキュメントと例です。
概要
ポップオーバープラグインを使用する際の注意点
- ポップオーバーは、位置決めにサードパーティライブラリであるPopperに依存しています。ポップオーバーが機能するためには、bootstrap.js の前にpopper.min.jsを含めるか、Popperを含む
bootstrap.bundle.min.js
/bootstrap.bundle.js
を使用する必要があります。 - ポップオーバーには、依存関係としてツールチッププラグインが必要です。
- ソースからJavaScriptをビルドしている場合は、
util.js
が必要です。 - ポップオーバーはパフォーマンス上の理由からオプトインであるため、**自分で初期化する必要があります**。
- 長さがゼロの
title
とcontent
の値は、ポップオーバーを表示しません。 - 複雑なコンポーネント(インプットグループやボタングループなど)でレンダリングの問題を避けるために、
container: 'body'
を指定してください。 - 非表示の要素でポップオーバーをトリガーしても機能しません。
.disabled
またはdisabled
要素のポップオーバーは、ラッパー要素でトリガーする必要があります。- 複数行にわたって折り返すアンカーからトリガーした場合、ポップオーバーはアンカーの全体の幅の中央に配置されます。この動作を避けるには、
<a>
に.text-nowrap
を使用してください。 - ポップオーバーは、対応する要素がDOMから削除される前に非表示にする必要があります。
- ポップオーバーは、シャドウDOM内の要素のおかげでトリガーできます。
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-
に追加します。
sanitize
、sanitizeFn
、およびwhiteList
オプションはデータ属性を使用して指定できないことに注意してください。名前 | タイプ | デフォルト | 説明 |
---|---|---|---|
animation | boolean | true | ポップオーバーにCSSフェードトランジションを適用する |
container | string | element | false | false |
ポップオーバーを特定の要素に追加します。例: |
content | string | element | function | '' |
関数が与えられた場合、ポップオーバーがアタッチされている要素に |
delay | number | object | 0 |
ポップオーバーの表示と非表示の遅延(ms)- 手動トリガータイプには適用されません 数値が指定された場合、遅延は表示/非表示の両方に適用されます オブジェクト構造は次のとおりです: |
html | boolean | false | ポップオーバーにHTMLを挿入します。falseの場合、jQueryのtext メソッドを使用してコンテンツをDOMに挿入します。XSS攻撃が心配な場合は、textを使用してください。 |
placement | string | function | 'right' |
ポップオーバーの位置を決定する方法 - auto | top | bottom | left | right。 配置を決定するために関数が使用される場合、ポップオーバーのDOMノードが最初の引数として、トリガー要素のDOMノードが2番目の引数として呼び出されます。 |
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 | string | element | function | '' |
関数が与えられた場合、ポップオーバーがアタッチされている要素に |
trigger | string | 'click' | ポップオーバーがトリガーされる方法 - click | hover | focus | manual。複数のトリガーを渡すことができます。それらをスペースで区切ります。manual は他のトリガーと組み合わせることはできません。 |
offset | number | string | 0 | ポップオーバーのターゲットからのオフセット。詳細については、Popperのオフセットドキュメントを参照してください。 |
fallbackPlacement | string | array | 'flip' | フォールバック時にPopperが使用する位置を指定できます。詳細については、Popperの動作ドキュメントを参照してください。 |
customClass | string | function | '' |
ポップオーバーが表示されたときにクラスを追加します。これらのクラスは、テンプレートで指定されたクラスに加えて追加されることに注意してください。複数のクラスを追加するには、スペースで区切ります: 追加のクラス名を含む単一の文字列を返す関数を渡すこともできます。 |
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メソッドは非同期であり、トランジションを開始します。トランジションが開始されるとすぐに呼び出し元に制御が戻りますが、トランジションが終了する前です。さらに、トランジション中のコンポーネントに対するメソッド呼び出しは無視されます。
$().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...
})