Popover

ツールチップのような動作を提供するPopover機能は、<b-popover>コンポーネントまたはv-b-popoverディレクティブを使用して、あらゆるインタラクティブな要素に簡単に適用できます。

<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>

<!-- b-popover.vue -->

概要

Popoverコンポーネントを使用する場合の注意事項

  • Popoverは、配置のためにサードパーティライブラリPopper.jsに依存しています。
  • Popoverは、正しく機能し、バリエーションを使用するためには、BootstrapVueのカスタムSCSS/CSSが必要です。
  • containernull(デフォルト、<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のサポートされている子要素を指します。

配置

配置には、toptoplefttoprightrightrighttoprightbottombottombottomleftbottomrightleftlefttopleftbottomの12個のオプションがあります。配置はトリガー要素を基準としています。

Popover 上

Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

Popover 左上

Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

Popover 右上

Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

Popover 右

Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

Popover 右上

Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

Popover 右下

Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

Popover 下

Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

Popover 左下

Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

Popover 右下

Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

Popover 左

Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

Popover 左上

Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

Popover 左下

Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

配置のライブ例については、Popoverディレクティブのドキュメントを参照してください。

トリガー

Popoverは、clickhoverfocusの任意の組み合わせでトリガー(開閉)できます。デフォルトのトリガーはclickです。または、プログラムでのみPopoverを開閉できるmanualトリガーを指定できます。

Popoverに複数のトリガーがある場合、Popoverを閉じる前にすべてのトリガーをクリアする必要があります。つまり、Popoverにfocus clickトリガーがあり、focusで開かれた場合、ユーザーがトリガー要素をクリックしても、Popoverを閉じるにはもう一度クリックしフォーカスを移動する必要があります。

<button>要素でのfocusトリガーに関する注意点

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は、focusclickの両方で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>

<!-- b-popover-placements.vue -->

プロパティによるコンポーネントオプション

プロパティ デフォルト 説明 サポートされている値
target null Popoverをトリガーする要素の文字列ID、または要素またはコンポーネントへの参照。**必須** 有効なドキュメント内の一意の要素ID、またはドキュメント内要素/コンポーネント参照
title null Popoverのタイトル(テキストのみ、HTMLは使用できません)。HTMLまたはリアクティブが必要な場合は、title名前付きスロットを使用してください。 プレーンテキスト
content null Popoverの内容(テキストのみ、HTMLは使用できません)。HTMLまたはリアクティブが必要な場合は、デフォルトのスロットを使用してください。 プレーンテキスト
placement 'right' トリガー要素を基準としたPopoverの位置。 autotopbottomleftrighttoplefttoprightbottomleftbottomrightlefttopleftbottomrighttoprightbottom
fallback-placement 'flip' トリガー要素を基準としたPopoverの自動フリップ配置動作。 flipclockwisecounterclockwise、または左から右に評価される有効な配置の配列
disabled false Popoverの表示状態のプログラムによる制御。同期修飾子と併用することをお勧めします。 truefalse
triggers 'click' イベントのスペース区切りリスト。組み込みの処理を使用してPopoverの開閉をトリガーします。 hoverfocusclick。注: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>

<!-- b-popover-variant.vue -->

Bootstrapのデフォルトテーマのバリアントは、dangerwarningsuccessprimarysecondaryinfolight、および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>

variantcustom-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>

<!-- b-popover-show-sync.vue -->

プログラムによる制御は、参照によってポップオーバーに'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-event.vue -->

最初のレンダリング時にポップオーバーを表示するには、<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>

<!-- b-popover-show-open.vue -->

'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>

<!-- b-popover-advanced-caution.vue -->

$rootイベントを使用して、ポップオーバーの表示と非表示をトリガーすることもできます。詳細については、以下の**$rootイベントを使用したポップオーバーの非表示と表示**セクションを参照してください。

ポップオーバーのプログラムによる無効化

同期可能なブール型プロパティdisabled(デフォルト値はfalse)を使用して、ポップオーバーを無効化できます。trueに設定すると、ポップオーバーが無効になります。disabledfalseに設定されたときにポップオーバーが表示されている場合、有効化またはプログラムで閉じられるまで表示されたままになります。$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>

<!-- b-popover-disable.vue -->

プログラムによる制御は、参照によってポップオーバーに'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>

<!-- b-popover-disabled-event.vue -->

無効化されている場合、ポップオーバーはプログラムで開くことができます(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>

<!-- b-popover-directive-placement.vue -->

ディレクティブの使用の詳細については、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">
      <!-- Our triggering (target) element -->
      <b-button id="popover-reactive-1" variant="primary" ref="button">
        Reactive Content Using Slots
      </b-button>
    </div>

    <!-- Output from the popover interaction -->
    <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>

    <!-- Our popover title and content render container -->
    <!-- We use placement 'auto' so popover fits in the best spot on viewport -->
    <!-- We specify the same container as the trigger button, so that popover is close to button -->
    <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">&times;</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()
          // Return our popover form results
          this.input1Return = this.input1
          this.input2Return = this.input2
        }
      },
      onShow() {
        // This is called just before the popover is shown
        // Reset our popover form variables
        this.input1 = ''
        this.input2 = ''
        this.input1state = null
        this.input2state = null
        this.input1Return = ''
        this.input2Return = ''
      },
      onShown() {
        // Called just after the popover has been shown
        // Transfer focus to the first input
        this.focusRef(this.$refs.input1)
      },
      onHidden() {
        // Called just after the popover has finished hiding
        // Bring focus back to the button
        this.focusRef(this.$refs.button)
      },
      focusRef(ref) {
        // Some references may be a component, functional component, or plain element
        // This handles that check before focusing, assuming a `focus()` method exists
        // We do this in a double `$nextTick()` to ensure components have
        // updated & popover positioned first
        this.$nextTick(() => {
          this.$nextTick(() => {
            ;(ref.$el || ref).focus()
          })
        })
      }
    }
  }
</script>

<!-- b-popover-advanced.vue -->

'グローバル' $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>`ダイアログを使用することを検討してください

コンポーネントリファレンス

<b-popover>

プロパティ

すべてのプロパティのデフォルト値はグローバルに設定可能です。

プロパティ
(昇順でソートするにはクリック)
タイプ
(昇順でソートするにはクリック)
デフォルト
説明
boundary
HTMLElement または Object または String'scrollParent'ポップオーバーの境界制約:「scrollParent」、「window」、「viewport」、またはHTMLElementまたはコンポーネントへの参照
boundary-padding
Number または String50ポップオーバーは、指定されたピクセル数だけ境界要素のエッジから離れようとします。
container
HTMLElement または Object または String表示時にレンダリングされたポップオーバーを追加するコンテナー要素。デフォルトではbody要素。
content
文字列ポップオーバーの本文に配置するテキスト
custom-class
文字列ポップオーバーのルート要素に適用するCSSクラス(またはクラスの集合)
delay
Number または Object または String50表示と非表示の遅延の値。数値または文字列として指定された場合は、表示と非表示の両方に適用されます。オブジェクト形式を使用して、表示と非表示の遅延を個別に設定します。
disabled
ブール値false`true`に設定すると、コンポーネントの機能が無効になり、無効状態になります。
fallback-placement
Array または String'flip'ポップオーバーが境界外にある場合に使用される配置。詳細はドキュメントを参照してください。
id
文字列レンダリングされたコンテンツの`id`属性を設定するために使用され、必要に応じて追加の要素IDを生成するためのベースとして使用されます。
no-fade
ブール値false`true`に設定すると、コンポーネントのフェードアニメーション/トランジションが無効になります。
非インタラクティブ
ブール値false
offset
Number または String0トリガーターゲット要素に対するアローセンターのオフセット(ピクセル単位)
placement
文字列'right'ポップオーバーの配置:「top」、「bottom」、「right」、「left」、「topleft」、「topright」、「bottomleft」、「bottomright」、「lefttop」、「leftbottom」、「righttop」、「rightbottom」のいずれか
表示
ブール値false設定すると、ポップオーバーが表示されます。
target
必須
HTMLElement または SVGElement または Function または Object または Stringポップオーバーをトリガーする要素の要素文字列ID、または要素またはコンポーネントへの参照
title
文字列ポップオーバーのタイトルに配置するテキスト
triggers
Array または String'click'ポップオーバーを表示するトリガーを指定します。サポートされる値は「click」、「hover」、「focus」です。「blur」と「manual」の特殊なトリガーについては、ドキュメントを参照してください。
variant
文字列Bootstrapテーマの色のバリアントの1つをコンポーネントに適用します。

スロット

名前
説明
デフォルト コンテンツのスロット(HTML/コンポーネントをサポート)
title タイトルのオプションのスロット(HTML/コンポーネントをサポート)

イベント

イベント
(昇順でソートするにはクリック)
引数
説明
bv::popover::disabled
  1. bvEvent - BvEventオブジェクト
$rootでポップオーバーが無効になったときに送信されます。
bv::popover::enabled
  1. bvEvent - BvEventオブジェクト
$rootでポップオーバーが有効になったときに送信されます。
bv::popover::hidden
  1. bvEvent - BvEventオブジェクト
$rootでポップオーバーが非表示になったときに送信されます。
bv::popover::hide
  1. bvEvent - BvEventオブジェクト
$rootでポップオーバーが非表示になる直前に送信されます。キャンセル可能です。bvEvent.preventDefault()を呼び出して非表示をキャンセルします。
bv::popover::show
  1. bvEvent - BvEventオブジェクト
$rootでポップオーバーが表示される直前に送信されます。キャンセル可能です。bvEvent.preventDefault()を呼び出して表示をキャンセルします。
bv::popover::shown
  1. bvEvent - BvEventオブジェクト
$rootでポップオーバーが表示されたときに送信されます。
disabled
  1. bvEvent - BvEventオブジェクト
ポップオーバーが無効になったときに送信されます。
有効
  1. bvEvent - BvEventオブジェクト
ポップオーバーが有効になったときに送信されます。
非表示
  1. bvEvent - BvEventオブジェクト
ポップオーバーが非表示になったときに送信されます。
非表示
  1. bvEvent - BvEventオブジェクト
ポップオーバーが非表示になる直前に送信されます。キャンセル可能です。bvEvent.preventDefault()を呼び出して非表示をキャンセルします。
表示
  1. bvEvent - BvEventオブジェクト
ポップオーバーが表示される直前に送信されます。キャンセル可能です。bvEvent.preventDefault()を呼び出して表示をキャンセルします。
表示
  1. bvEvent - BvEventオブジェクト
ポップオーバーが表示されたときに送信されます。

$root イベントリスナー

$rootで次のイベントを送信することにより、`<b-popover>`を制御できます。

イベント
引数
説明
bv::disable::popover

id - 無効にするポップオーバーID(オプション)

$rootでこのイベントが送信されると、すべてのポップオーバーまたは特定のポップオーバーが無効になります。
bv::enable::popover

id - 有効にするポップオーバーID(オプション)

$rootでこのイベントが送信されると、すべてのポップオーバーまたは特定のポップオーバーが有効になります。
bv::hide::popover

id - 非表示にするポップオーバーID(オプション)

$rootでこのイベントが送信されると、すべての開いているポップオーバーまたは特定の開いているポップオーバーが閉じます(非表示になります)。
bv::show::popover

id - 表示するポップオーバーID(オプション)

$rootでこのイベントが送信されると、すべてのポップオーバーまたは特定のポップオーバーが開きます(表示されます)。

個々のコンポーネントのインポート

次の名前付きエクスポートを使用して、個々のコンポーネントをプロジェクトにインポートできます。

コンポーネント
名前付きエクスポート
インポートパス
<b-popover>BPopoverbootstrap-vue

import { BPopover } from 'bootstrap-vue'
Vue.component('b-popover', BPopover)

Vue.jsプラグインとしてのインポート

このプラグインには、上記のすべての個々のコンポーネントが含まれています。プラグインには、コンポーネントのエイリアスも含まれています。

名前付きエクスポート
インポートパス
PopoverPluginbootstrap-vue

このプラグインは、次のプラグインも自動的に含んでいます。

  • VBPopoverPlugin

import { PopoverPlugin } from 'bootstrap-vue'
Vue.use(PopoverPlugin)