<div class="text-center my-3">
<b-button v-b-popover.hover.top="'I am popover directive content!'" title="Popover Title">
Hover Me
</b-button>
<b-button id="popover-target-1">
Hover Me
</b-button>
<b-popover target="popover-target-1" triggers="hover" placement="top">
<template #title>Popover Title</template>
I am popover <b>component</b> content!
</b-popover>
</div>
概要
Popoverコンポーネントを使用する場合の注意事項
- Popoverは、配置のためにサードパーティライブラリPopper.jsに依存しています。
- Popoverは、正しく機能し、バリエーションを使用するためには、BootstrapVueのカスタムSCSS/CSSが必要です。
container
をnull
(デフォルト、<body>
に追加)に指定して、より複雑なコンポーネント(入力グループ、ボタングループなど)でのレンダリングの問題を回避できます。container
を使用して、レンダリングされたPopoverを追加する別の要素をオプションで指定できます。 - 非表示の要素でPopoverをトリガーしても機能しません。
disabled
要素のPopoverは、ラッパー要素でトリガーする必要があります。 - 複数行にまたがるハイパーリンクからトリガーされた場合、Popoverは中央揃えになります。この動作を回避するには、
<a>
、<b-link>
、<router-link>
にwhite-space: nowrap;
を使用してください。
ターゲット
ターゲットは、Popoverをトリガーするトリガー要素(またはコンポーネント)です。ターゲットはtarget
プロパティで指定され、次のいずれかになります。
- トリガー要素のID(またはコンポーネントのルート要素のID)を識別する文字列
HTMLElement
またはSVGElement
への参照(例:this.$refs.refName
) HTMLElement
またはSVGElement
をルート要素とするコンポーネントへの参照(例:this.$refs.refName
) HTMLElement
またはSVGElement
への参照を返す関数(コールバック)
参照の詳細については、公式のVueドキュメントを参照してください。
注意事項
ターゲット要素は、<b-popover>
がマウントされる前にドキュメントに存在する必要があります。マウント時にターゲット要素が見つからない場合、Popoverは決して開きません。常に<b-popover>
コンポーネントをターゲット要素よりもDOMの下部に配置してください。このルールは、コールバック関数がターゲット要素として使用される場合にも適用されます。これは、そのコールバックがマウント時に一度だけ呼び出されるためです。
HTMLElement
は<div>
、<button>
などの標準HTML要素を指し、SVGElement
は<svg>
またはSVGのサポートされている子要素を指します。
配置
配置には、top
、topleft
、topright
、right
、righttop
、rightbottom
、bottom
、bottomleft
、bottomright
、left
、lefttop
、leftbottom
の12個のオプションがあります。配置はトリガー要素を基準としています。
Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
配置のライブ例については、Popoverディレクティブのドキュメントを参照してください。
トリガー
Popoverは、click
、hover
、focus
の任意の組み合わせでトリガー(開閉)できます。デフォルトのトリガーはclick
です。または、プログラムでのみPopoverを開閉できるmanual
トリガーを指定できます。
Popoverに複数のトリガーがある場合、Popoverを閉じる前にすべてのトリガーをクリアする必要があります。つまり、Popoverにfocus click
トリガーがあり、focus
で開かれた場合、ユーザーがトリガー要素をクリックしても、Popoverを閉じるにはもう一度クリックしてフォーカスを移動する必要があります。
focus
トリガーのみを使用する場合の適切なクロスブラウザおよびクロスプラットフォームの動作のためには、<button>
タグではなく<a>
タグをレンダリングする要素を使用する必要があり、tabindex="0"
属性を含める必要もあります。
次のコードは、ボタンのように見える<a>
を生成します。
<b-button
href="#"
tabindex="0"
v-b-popover.focus="'Popover content'"
title="Popover title"
>
Link button with popover directive
</b-button>
<b-button id="link-button" href="#" tabindex="0">
Link button with popover component
</b-button>
<b-popover target="link-button" title="Popover title" triggers="focus">
Popover content
</b-popover>
次のクリックで閉じる(自動閉じ)
focus
トリガーを単独で使用して、ユーザーが行った次のクリックでPopoverを閉じます。focus
は、focus
とclick
の両方でPopoverをアクティブ化します(ほとんどのブラウザでは、クリックすると要素がフォーカスを受け取るので、ページのタブシーケンスにあると仮定します)。
ただし、トリガーをclick blur
として指定することもできます。これにより、クリックのみでPopoverがアクティブになり、要素をクリックするか、またはフォーカスをドキュメントの別の要素または部分に失うとPopoverが閉じます。
特別なblur
トリガーは、click
トリガーと組み合わせて使用する必要があります。
<b-popover>
コンポーネントの基本的な使用方法
<template>
<b-container fluid>
<h5 class="my-3">Placement</h5>
<b-row>
<b-col
v-for="placement in placements"
:key="placement"
md="4"
class="py-4 text-center"
>
<b-button :id="`popover-1-${placement}`" variant="primary">{{ placement }}</b-button>
<b-popover
:target="`popover-1-${placement}`"
:placement="placement"
title="Popover!"
triggers="hover focus"
:content="`Placement ${placement}`"
></b-popover>
</b-col>
</b-row>
<h5 class="my-3">Content via properties or slots</h5>
<b-row>
<b-col md="6" class="py-4 text-center">
<b-button id="popover-2" variant="primary">Using properties</b-button>
<b-popover
target="popover-2"
title="Prop Examples"
triggers="hover focus"
content="Embedding content using properties is easy"
></b-popover>
</b-col>
<b-col md="6" class="py-4 text-center">
<b-button id="popover-3" variant="primary">Using slots</b-button>
<b-popover target="popover-3" triggers="hover focus">
<template #title>Content via Slots</template>
Embedding content <span class="text-danger">using slots</span> affords you
<em>greater <strong>control.</strong></em> and basic HTML support.
</b-popover>
</b-col>
</b-row>
</b-container>
</template>
<script>
export default {
data() {
return {
placements: [
'topright',
'top',
'topleft',
'bottomright',
'bottom',
'bottomleft',
'righttop',
'right',
'lefttop',
'rightbottom',
'left',
'leftbottom'
]
}
}
}
</script>
プロパティによるコンポーネントオプション
プロパティ | デフォルト | 説明 | サポートされている値 |
target | null | Popoverをトリガーする要素の文字列ID、または要素またはコンポーネントへの参照。**必須** | 有効なドキュメント内の一意の要素ID、またはドキュメント内要素/コンポーネント参照 |
title | null | Popoverのタイトル(テキストのみ、HTMLは使用できません)。HTMLまたはリアクティブが必要な場合は、title 名前付きスロットを使用してください。 | プレーンテキスト |
content | null | Popoverの内容(テキストのみ、HTMLは使用できません)。HTMLまたはリアクティブが必要な場合は、デフォルトのスロットを使用してください。 | プレーンテキスト |
placement | 'right' | トリガー要素を基準としたPopoverの位置。 | auto 、top 、bottom 、left 、right 、topleft 、topright 、bottomleft 、bottomright 、lefttop 、leftbottom 、righttop 、rightbottom |
fallback-placement | 'flip' | トリガー要素を基準としたPopoverの自動フリップ配置動作。 | flip 、clockwise 、counterclockwise 、または左から右に評価される有効な配置の配列 |
disabled | false | Popoverの表示状態のプログラムによる制御。同期修飾子と併用することをお勧めします。 | true 、false |
triggers | 'click' | イベントのスペース区切りリスト。組み込みの処理を使用してPopoverの開閉をトリガーします。 | hover 、focus 、click 。注:blur は、次のクリックでPopoverを閉じるための特別なケースです。 |
no-fade | false | true に設定すると、フェードアニメーションが無効になります。 | true またはfalse |
delay | 50 | Popoverの表示と非表示をミリ秒単位で遅延させる。 { show: 100, hide: 400 } 形式のオブジェクトとして定義することもでき、表示と非表示の遅延をそれぞれ設定できます。 | 0 以上、整数のみ。 |
offset | 0 | Popoverの中心を指定したピクセル数だけシフトします。Popoverのアローの位置にも影響します。 | 任意の負または正の整数 |
container | null | レンダリングされたPopoverを追加する要素の文字列ID。null の場合、または要素が見つからない場合は、Popoverは<body> に追加されます(デフォルト)。 | 有効なドキュメント内の一意の要素ID。 |
boundary | 'scrollParent' | Popoverが視覚的に制限されるコンテナ。ほとんどの場合、デフォルトで十分ですが、ターゲット要素がオーバーフロースクロールのある小さなコンテナ内にある場合は、これを変更する必要がある場合があります。 | 'scrollParent' (デフォルト)、'viewport' 、'window' 、またはHTML要素への参照。 |
boundary-padding | 5 | 境界とポップオーバー間の最小距離を定義するために使用されるピクセル数。これにより、ポップオーバーが常にコンテナのエッジとの間にわずかなパディングを持つことが保証されます。 | 任意の正の数 |
variant | null | ポップオーバーのコンテキストカラーバリアント | 任意のコンテキストテーマカラーバリアント名 |
custom-class | null | ポップオーバーの外側のラッパー要素に適用するカスタムクラス名 | 文字列 |
id | null | ポップオーバーのルート要素に使用するID。指定しない場合は、自動的に生成されます。IDを指定する場合は、レンダリングされたページ上で一意であることが必須です。 | 有効な一意の要素ID文字列 |
バリアントとカスタムクラス
BootstrapVueのポップオーバーは、カスタムCSSを介して、variant
プロパティを介してコンテキストカラーバリアントをサポートしています。
<div class="text-center">
<b-button id="popover-button-variant" href="#" tabindex="0">Button</b-button>
<b-popover target="popover-button-variant" variant="danger" triggers="focus">
<template #title>Danger!</template>
Danger variant popover
</b-popover>
</div>
Bootstrapのデフォルトテーマのバリアントは、danger
、warning
、success
、primary
、secondary
、info
、light
、およびdark
です。BootstrapのSCSS変数を使用して、バリアントを変更または追加できます。
custom-class
プロパティを使用して、ポップオーバーの外側のラッパー<div>
にカスタムクラスを適用できます。
<div class="text-center">
<b-button id="my-button">Button</b-button>
<b-popover target="my-button" custom-class="my-popover-class">
<template #title>Popover Title</template>
Popover content
</b-popover>
</div>
variant
とcustom-class
はリアクティブであり、ポップオーバーが開いている間も変更できます。
バリアントとカスタムクラスをディレクティブバージョンに適用する方法については、ポップオーバーディレクティブのドキュメントを参照してください。
ポップオーバーのプログラムによる表示と非表示
同期可能なブール型のshow
プロパティを使用して、ポップオーバーの表示をマニュアルで制御できます。true
に設定するとポップオーバーが表示され、false
に設定するとポップオーバーが非表示になります。
<template>
<div class="d-flex flex-column text-md-center">
<div class="p-2">
<b-button id="popover-button-sync" variant="primary">I have a popover</b-button>
</div>
<div class="p-2">
<b-button class="px-1" @click="show = !show">Toggle Popover</b-button>
<b-popover :show.sync="show" target="popover-button-sync" title="Popover">
Hello <strong>World!</strong>
</b-popover>
</div>
</div>
</template>
<script>
export default {
data() {
return {
show: false
}
}
}
</script>
プログラムによる制御は、参照によってポップオーバーに'open'
および'close'
イベントを送信することによっても行うことができます。
<template>
<div class="d-flex flex-column text-md-center">
<div class="p-2">
<b-button id="popover-button-event" variant="primary">I have a popover</b-button>
</div>
<div class="p-2">
<b-button class="px-1" @click="onOpen">Open</b-button>
<b-button class="px-1" @click="onClose">Close</b-button>
</div>
<b-popover ref="popover" target="popover-button-event" title="Popover">
Hello <strong>World!</strong>
</b-popover>
</div>
</template>
<script>
export default {
methods: {
onOpen() {
this.$refs.popover.$emit('open')
},
onClose() {
this.$refs.popover.$emit('close')
}
}
}
</script>
最初のレンダリング時にポップオーバーを表示するには、<b-popover>
にshow
プロパティを追加するだけです。
<div class="text-center">
<b-button id="popover-button-open" variant="primary">Button</b-button>
<b-popover show target="popover-button-open" title="Popover">
I start <strong>open</strong>
</b-popover>
</div>
'show'プロパティまたはイベント呼び出しによってプログラムで開かれたポップオーバーは、プログラムでしか閉じることができません。組み込みのトリガーは不十分に機能します。トリガーイベントは、ポップオーバーが既に開いている場合でも、ポップオーバーを開こうと試みるためです。
以下の例では、最初のポップオーバーが'open'イベントで開かれると、閉じるのにボタンを2回クリックする必要があります。このデモを操作して理解してください。ポップオーバーコンポーネントのプログラムによる制御とユーザーインタラクショントリガーの両方を適切に処理したい場合は、組み込みのトリガーを無効にして、2番目のポップオーバーで示されているように自分で制御する必要があります。
<template>
<div class="d-flex flex-column text-md-center">
<div class="p-2">
<b-button id="popover-manual-1" variant="primary" ref="button">Unreliable</b-button>
<b-popover target="popover-manual-1" :show.sync="pop1" triggers="click">
I can be stubborn sometimes.
</b-popover>
</div>
<div class="p-2">
<b-button id="popover-manual-2" variant="primary" ref="button" @click="pop2 = !pop2">
Comfortably Numb
</b-button>
<b-popover target="popover-manual-2" :show.sync="pop2" triggers="">
I do believe it's working, good.
</b-popover>
</div>
<div class="p-2">
<b-button class="px-1" @click="popOpen">Open</b-button>
<b-button class="px-1" @click="popClose">Close</b-button>
<b-button class="px-1" @click="popToggle">Toggle</b-button>
</div>
</div>
</template>
<script>
export default {
data() {
return {
pop1: false,
pop2: false
}
},
methods: {
popOpen() {
this.pop1 = this.pop2 = true
},
popClose() {
this.pop1 = this.pop2 = false
},
popToggle() {
this.pop1 = !this.pop1
this.pop2 = !this.pop2
}
}
}
</script>
$root
イベントを使用して、ポップオーバーの表示と非表示をトリガーすることもできます。詳細については、以下の**$rootイベントを使用したポップオーバーの非表示と表示**セクションを参照してください。
ポップオーバーのプログラムによる無効化
同期可能なブール型プロパティdisabled
(デフォルト値はfalse
)を使用して、ポップオーバーを無効化できます。true
に設定すると、ポップオーバーが無効になります。disabled
がfalse
に設定されたときにポップオーバーが表示されている場合、有効化またはプログラムで閉じられるまで表示されたままになります。$root
イベントを介してポップオーバーが無効化/有効化される場合(以下を参照)、.sync
プロパティ修飾子を指定している限り、disabled
の値は更新されます。
<template>
<div class="d-flex flex-column text-md-center">
<div class="p-2">
<b-button id="popover-button-disable" variant="primary">I have a popover</b-button>
</div>
<div class="p-2">
<b-button @click="disabled = !disabled">
{{ disabled ? 'Enable' : 'Disable' }} Popover by prop
</b-button>
<b-button @click="disableByRef">
{{ disabled ? 'Enable' : 'Disable' }} Popover by $ref event
</b-button>
<b-popover
:disabled.sync="disabled"
target="popover-button-disable"
title="Popover"
ref="popover"
>
Hello <strong>World!</strong>
</b-popover>
</div>
</div>
</template>
<script>
export default {
data() {
return {
disabled: false
}
},
methods: {
disableByRef() {
if (this.disabled) {
this.$refs.popover.$emit('enable')
} else {
this.$refs.popover.$emit('disable')
}
}
}
}
</script>
プログラムによる制御は、参照によってポップオーバーに'enable'
および'disable'
イベントを送信することによっても行うことができます。
<template>
<div class="d-flex flex-column text-md-center">
<div class="p-2">
<b-button id="popover-button-disable-event" variant="primary">I have a popover</b-button>
</div>
<div class="p-2">
<b-button class="px-1" @click="onEnable">Enable</b-button>
<b-button class="px-1" @click="onDisable">Disable</b-button>
</div>
<b-popover ref="popover" target="popover-button-disable-event" title="Popover">
Hello <strong>World!</strong>
</b-popover>
</div>
</template>
<script>
export default {
methods: {
onEnable() {
this.$refs.popover.$emit('enable')
},
onDisable() {
this.$refs.popover.$emit('disable')
}
}
}
</script>
無効化されている場合、ポップオーバーはプログラムで開くことができます(show
プロパティ、メソッド、またはイベントのいずれかを使用)。
$root
イベントを使用して、ポップオーバーの無効化と有効化をトリガーすることもできます。詳細については、以下の**$rootイベントを使用したポップオーバーの無効化と有効化**セクションを参照してください。
v-b-popover
ディレクティブの使用
マークアップをあまり使わずに、すぐにポップオーバーが必要ですか?v-b-popover
ディレクティブを使用してください。
<div>
<b-container fluid>
<b-row class="text-center">
<b-col md="3" class="py-3">
<b-button v-b-popover.hover.top="'Popover!'" title="Title" variant="primary">Top</b-button>
</b-col>
<b-col md="3" class="py-3">
<b-button v-b-popover.hover.right="'Popover!'" title="Title" variant="primary">Right</b-button>
</b-col>
<b-col md="3" class="py-3">
<b-button v-b-popover.hover.left="'Popover!'" title="Title" variant="primary">Left</b-button>
</b-col>
<b-col md="3" class="py-3">
<b-button v-b-popover.hover.bottom="'Popover!'" title="Title" variant="primary">Bottom</b-button>
</b-col>
</b-row>
</b-container>
</div>
ディレクティブの使用の詳細については、v-b-popover
ディレクティブのドキュメントを参照してください。
リアクティブコンテンツを使用した高度な<b-popover>
の使用
<b-popover>
のコンテンツをインタラクティブにすることもできます。focus
またはトリガーを使用しないようにしてください(click
のみを使用してください)。
click
以外のトリガーをどうしても使用しなければならない場合(またはトリガー要素を2回クリックしたときにポップオーバーの閉じを無効にしたい場合)、次のいずれかを実行できます。
<b-popover>
要素でhide
イベントをリッスンし、hide
ハンドラーに渡されたBvEvent
オブジェクトでpreventDefault()
メソッドを(適切な場合に)呼び出します。 - ポップオーバーが開き始めるとすぐに(
show
イベントを介して)、トリガー要素を無効化し(可能な場合)、適切なときに(つまり、hide
またはhidden
イベントを介して)再度有効化します。
実際的な目的から、**インタラクティブコンテンツのポップオーバーは最小限にする必要があります**。ポップオーバーの最大幅は、Bootstrap v4 CSSによって276px
にハードコードされています。小さな画面での背の高いポップオーバーは、スマートフォンなどのモバイルデバイスでは処理が難しくなる可能性があります。
<template>
<div id="my-container">
<div class="my-3">
<b-button id="popover-reactive-1" variant="primary" ref="button">
Reactive Content Using Slots
</b-button>
</div>
<b-card title="Returned values:" v-if="input1Return && input2Return">
<p class="card-text" style="max-width: 20rem;">
Name: <strong>{{ input1Return }}</strong><br>
Color: <strong>{{ input2Return }}</strong>
</p>
</b-card>
<b-popover
target="popover-reactive-1"
triggers="click"
:show.sync="popoverShow"
placement="auto"
container="my-container"
ref="popover"
@show="onShow"
@shown="onShown"
@hidden="onHidden"
>
<template #title>
<b-button @click="onClose" class="close" aria-label="Close">
<span class="d-inline-block" aria-hidden="true">×</span>
</b-button>
Interactive Content
</template>
<div>
<b-form-group
label="Name"
label-for="popover-input-1"
label-cols="3"
:state="input1state"
class="mb-1"
description="Enter your name"
invalid-feedback="This field is required"
>
<b-form-input
ref="input1"
id="popover-input-1"
v-model="input1"
:state="input1state"
size="sm"
></b-form-input>
</b-form-group>
<b-form-group
label="Color"
label-for="popover-input-2"
label-cols="3"
:state="input2state"
class="mb-1"
description="Pick a color"
invalid-feedback="This field is required"
>
<b-form-select
id="popover-input-2"
v-model="input2"
:state="input2state"
:options="options"
size="sm"
></b-form-select>
</b-form-group>
<b-alert show class="small">
<strong>Current Values:</strong><br>
Name: <strong>{{ input1 }}</strong><br>
Color: <strong>{{ input2 }}</strong>
</b-alert>
<b-button @click="onClose" size="sm" variant="danger">Cancel</b-button>
<b-button @click="onOk" size="sm" variant="primary">Ok</b-button>
</div>
</b-popover>
</div>
</template>
<script>
export default {
data() {
return {
input1: '',
input1state: null,
input2: '',
input2state: null,
options: [{ text: '- Choose 1 -', value: '' }, 'Red', 'Green', 'Blue'],
input1Return: '',
input2Return: '',
popoverShow: false
}
},
watch: {
input1(val) {
if (val) {
this.input1state = true
}
},
input2(val) {
if (val) {
this.input2state = true
}
}
},
methods: {
onClose() {
this.popoverShow = false
},
onOk() {
if (!this.input1) {
this.input1state = false
}
if (!this.input2) {
this.input2state = false
}
if (this.input1 && this.input2) {
this.onClose()
this.input1Return = this.input1
this.input2Return = this.input2
}
},
onShow() {
this.input1 = ''
this.input2 = ''
this.input1state = null
this.input2state = null
this.input1Return = ''
this.input2Return = ''
},
onShown() {
this.focusRef(this.$refs.input1)
},
onHidden() {
this.focusRef(this.$refs.button)
},
focusRef(ref) {
this.$nextTick(() => {
this.$nextTick(() => {
;(ref.$el || ref).focus()
})
})
}
}
}
</script>
'グローバル' $rootインスタンスイベント
$root
インスタンスを使用すると、<b-collapse>
が使用されているコンポーネントの外側でイベントを発行およびリッスンできます。簡単に言うと、$root
はグローバルイベントエミッターおよびリスナーのように動作します。$root
インスタンスの詳細については、公式Vueドキュメントを参照してください。
$rootイベントを使用したポップオーバーの非表示と表示
$rootでbv::hide::popover
イベントを発行することにより、開いているすべてのポップオーバーを閉じる(非表示にする)ことができます。
this.$root.$emit('bv::hide::popover')
特定のポップオーバーを閉じるには、トリガー要素のid
、または(id
プロパティを介して指定された場合)ポップオーバーのid
を最初の引数として渡します。
this.$root.$emit('bv::hide::popover', 'my-trigger-button-id')
特定のポップオーバーを開く(表示する)には、bv::show::popover
イベントを発行するときに、トリガー要素のid
、または(id
プロパティを介して指定された場合)ポップオーバーのid
を最初の引数として渡します。
this.$root.$emit('bv::show::popover', 'my-trigger-button-id')
すべてのポップオーバーを同時に開くには、bv::show::popover
イベントを発行するときにid
引数を省略します。
これらのイベントは、コンポーネントとディレクティブの両方のポップオーバーバージョンで機能します。
注:ポップオーバーをインスタンス化して表示するには、トリガー要素がDOMに存在し、表示されている必要があります。
$rootイベントを使用したポップオーバーの無効化と有効化
$rootでbv::disable::popover
イベントを発行することにより、すべてのポップオーバーを無効化できます。
this.$root.$emit('bv::disable::popover')
特定のポップオーバーを無効化するには、トリガー要素のid
、または(id
プロパティを介して指定された場合)ポップオーバーのid
を最初の引数として渡します。
this.$root.$emit('bv::disable::popover', 'my-trigger-button-id')
特定のポップオーバーを有効化するには、bv::enable::popover
イベントを発行するときに、トリガー要素のid
、または(id
プロパティを介して指定された場合)ポップオーバーのid
を最初の引数として渡します。
this.$root.$emit('bv::enable::popover', 'my-trigger-button-id')
すべてのポップオーバーを同時に有効化するには、bv::enable::popover
イベントを発行するときにid
引数を省略します。
これらのイベントは、コンポーネントとディレクティブの両方のポップオーバーバージョンで機能します。
注:ポップオーバーを有効化または無効化するには、トリガー要素がDOMに存在する必要があります。
$rootイベントを使用したポップオーバーの変更のリスニング
ポップオーバーの開閉をリスニングするには、以下を使用します。
export default {
mounted() {
this.$root.$on('bv::popover::show', bvEventObj => {
console.log('bvEventObj:', bvEventObj)
})
}
}
イベントの完全なリストについては、ドキュメントのイベントセクションを参照してください。
アクセシビリティ
現在の実装では、ポップオーバーはインタラクティブコンポーネントとして使用する場合、アクセシビリティが十分ではありません。スクリーンリーダーユーザーにはコンテンツがアクティブに読み上げられない可能性があり、ポップオーバーのマークアップがDOM内のトリガー要素の近くに配置されていない可能性があります(ポップオーバーは通常`<body>
の最後に追加されるため)。
ポップオーバーをインタラクティブコンポーネントとして使用する場合、可能であればフォーカスをポップオーバーに移動する必要があります。ポップオーバーが閉じられた場合、上記の例で行ったように、トリガー要素にフォーカスを戻す必要があります(`focus
`がトリガーメソッドとして使用されていないと仮定します)。
ユーザーがポップオーバーと対話している間、ポップオーバーコンテンツ内にフォーカスを閉じ込めることもできます(ユーザーがポップオーバーを閉じるまでフォーカスをポップオーバー内に維持します)。
注記:このコンポーネントのアニメーション効果は、`prefers-reduced-motion
`メディアクエリに依存します。詳細は、アクセシビリティドキュメントの低モーションに関するセクションを参照してください。
キーボードと支援技術ユーザー向けにポップオーバーを機能させる
キーボードユーザーがポップオーバーをアクティブ化できるようにするには、従来からキーボードでフォーカス可能でインタラクティブなHTML要素(リンクやフォームコントロールなど)にのみ追加する必要があります。`tabindex="0"
`属性を追加することで、`<span>
`のような任意のHTML要素をフォーカス可能にすることができますが、これにより、キーボードユーザーにとって不要で混乱を招くタブストップが非インタラクティブ要素に追加され、ほとんどの支援技術は現在この状況ではポップオーバーのコンテンツを読み上げません。さらに、ポップオーバーのトリガーとして`hover
`のみに依存しないでください。これは、キーボードユーザーにとってトリガー不可能になります。
スロットを介してリッチで構造化されたHTMLやコンポーネントをポップオーバーに挿入できますが、過剰なコンテンツの追加は強くお勧めしません。現在のポップオーバーの動作は、表示されると、そのコンテンツが`aria-describedby
`属性を使用してトリガー要素に関連付けられることです。その結果、ポップオーバーのコンテンツ全体が、支援技術ユーザーに対して長く途切れることのないストリームとして読み上げられます。
さらに、ポップオーバーにインタラクティブコントロール(フォーム要素やリンクなど)を含めることもできますが、現在ポップオーバーはキーボードフォーカスの順序を管理していないことに注意してください。キーボードユーザーがポップオーバーを開くと、フォーカスはトリガー要素に残ります。また、ポップオーバーは通常ドキュメントの構造でトリガーの直後に表示されないため、前方へ移動したり`Tab`キーを押したりしても、キーボードユーザーがポップオーバー自体に移動できるとは限りません。簡単に言うと、ポップオーバーにインタラクティブコントロールを追加するだけで、キーボードユーザーや支援技術ユーザーにとってこれらのコントロールにアクセスできなくなったり、使用できなくなったり、あるいは少なくとも論理的でないフォーカスの順序になる可能性が高いです。これらの場合は、代わりに`<b-modal>
`ダイアログを使用することを検討してください。