<div>
<b-button v-b-modal.modal-1>Launch demo modal</b-button>
<b-modal id="modal-1" title="BootstrapVue">
<p class="my-4">Hello from modal!</p>
</b-modal>
</div>
概要
<b-modal>
は、デフォルトでフッターにOKボタンとキャンセルボタンがあります。これらのボタンは、コンポーネントのさまざまなプロパティを設定することでカスタマイズできます。ボタンのサイズをカスタマイズしたり、ボタンを無効にしたり、キャンセルボタンを非表示にしたり(つまり、ok-only
)、ok-variant
およびcancel-variant
プロパティを使用してバリエーション(赤いOKボタンのdanger
など)を選択したり、ok-title
およびcancel-title
プロパティ、または名前付きスロットmodal-ok
とmodal-cancel
を使用してカスタムボタンコンテンツを提供できます。
<b-modal>
は、ESCキーでのクローズ(デフォルトで有効)、背景クリックでのクローズ(デフォルトで有効)、およびヘッダーのX
クローズボタン(デフォルトで有効)をサポートしています。これらの機能は、それぞれno-close-on-esc
、no-close-on-backdrop
、およびhide-header-close
プロパティを設定することで無効にできます。
名前付きスロットmodal-title
でモーダルタイトルをオーバーライドしたり、modal-header
スロットでヘッダーを完全にオーバーライドしたり、modal-footer
スロットでフッターを完全にオーバーライドしたりできます。
注:modal-footer
スロットを使用すると、デフォルトのOKボタンとキャンセルボタンは表示されません。また、modal-header
スロットを使用すると、デフォルトのヘッダーX
クローズボタンは表示されず、modal-title
スロットも使用できません。
モーダルは、表示されるまでドキュメントにコンテンツをレンダリングしません(遅延レンダリング)。モーダルは、表示されると、<body>
要素に追加されてレンダリングされます。<b-modal>
コンポーネントの配置は、常にプレースホルダーコメントノード(<!---->
)としてレンダリングされるため、レイアウトに影響を与えません。static
プロパティを使用することで、古いBootstrapVueバージョンの動作に戻すことができます。
モーダルの表示を切り替える
<b-modal>
の表示を切り替えるために使用できるいくつかの方法があります。
v-b-modal
ディレクティブの使用
他の要素は、v-b-modal
ディレクティブを使用して簡単にモーダルを表示できます。
<div>
<b-button v-b-modal.my-modal>Show Modal</b-button>
<b-button v-b-modal="'my-modal'">Show Modal</b-button>
<b-modal id="my-modal">Hello From My Modal!</b-modal>
</div>
このアプローチでは、モーダルが閉じると、フォーカスがトリガー要素に自動的に戻ります(デフォルトのBootstrap機能と同様)。モーダルの表示を切り替える他のアプローチでは、このアクセシビリティ機能を実装するために追加のコードが必要になる場合があります。
詳細については、以下のアクセシビリティセクションを参照してください。
this.$bvModal.show()
およびthis.$bvModal.hide()
インスタンスメソッドの使用
BootstrapVueがプラグインとしてインストールされている場合、またはModalPlugin
プラグインが使用されている場合、BootstrapVueは$bvModal
オブジェクトをすべてのVueインスタンス(コンポーネント、アプリ)に挿入します。this.$bvModal
は、いくつかのメソッドを公開し、そのうち2つはモーダルを表示および非表示にするためのものです。
メソッド | 説明 |
this.$bvModal.show(id) | 指定されたid を持つモーダルを表示します |
this.$bvModal.hide(id) | 指定されたid を持つモーダルを非表示にします |
両方のメソッドは、呼び出された直後に戻ります。
<div>
<b-button id="show-btn" @click="$bvModal.show('bv-modal-example')">Open Modal</b-button>
<b-modal id="bv-modal-example" hide-footer>
<template #modal-title>
Using <code>$bvModal</code> Methods
</template>
<div class="d-block text-center">
<h3>Hello From This Modal!</h3>
</div>
<b-button class="mt-3" block @click="$bvModal.hide('bv-modal-example')">Close Me</b-button>
</b-modal>
</div>
this.$bvModal
オブジェクトは、モーダルメッセージボックスを表示するためにも使用されます。
show()
、hide()
、およびtoggle()
コンポーネントメソッドの使用
ref
属性を使用してモーダルにアクセスし、show()
、hide()
、またはtoggle()
メソッドを呼び出すことができます。
<template>
<div>
<b-button id="show-btn" @click="showModal">Open Modal</b-button>
<b-button id="toggle-btn" @click="toggleModal">Toggle Modal</b-button>
<b-modal ref="my-modal" hide-footer title="Using Component Methods">
<div class="d-block text-center">
<h3>Hello From My Modal!</h3>
</div>
<b-button class="mt-3" variant="outline-danger" block @click="hideModal">Close Me</b-button>
<b-button class="mt-2" variant="outline-warning" block @click="toggleModal">Toggle Me</b-button>
</b-modal>
</div>
</template>
<script>
export default {
methods: {
showModal() {
this.$refs['my-modal'].show()
},
hideModal() {
this.$refs['my-modal'].hide()
},
toggleModal() {
this.$refs['my-modal'].toggle('#toggle-btn')
}
}
}
</script>
hide()
メソッドは、モーダルを閉じるトリガーを定義するためのオプションの文字列trigger
引数を受け入れます。詳細については、以下の閉じるのを防ぐセクションを参照してください。
注: $ref
メソッドを使用する代わりに、this.$bvModal.show()
およびthis.$bvModal.hide()
メソッド(前のセクションで言及)を使用することをお勧めします。
v-model
プロパティの使用
v-model
プロパティは、常に<b-modal>
の表示状態と自動的に同期され、v-model
を使用して表示/非表示を切り替えることができます。
<template>
<div>
<b-button @click="modalShow = !modalShow">Open Modal</b-button>
<b-modal v-model="modalShow">Hello From Modal!</b-modal>
</div>
</template>
<script>
export default {
data() {
return {
modalShow: false
}
}
}
</script>
v-model
プロパティを使用する場合、visible
プロパティを同時に使用しないでください。
スコープ付きスロットスコープメソッドの使用
モーダルを閉じるためにスコープ付きスロットに渡されるさまざまなメソッドの使用については、スロットを使用したカスタムレンダリングセクションを参照してください。
$rootでのイベントの発行
bv::show::modal
、bv::hide::modal
、およびbv::toggle::modal
イベントを$root
で発行できます。最初の引数はモーダルのIDに設定されます。オプションの2番目の引数は、モーダルが閉じられた後にフォーカスを戻す要素を指定できます。2番目の引数には、CSSセレクター、要素参照、またはコンポーネント参照(コンポーネントのルート要素にフォーカスが当てられます)を指定できます。
<div>
<b-button @click="showModal" ref="btnShow">Open Modal</b-button>
<b-button @click="toggleModal" ref="btnToggle">Toggle Modal</b-button>
<b-modal id="modal-1">
<div class="d-block">Hello From My Modal!</div>
<b-button @click="hideModal">Close Me</b-button>
<b-button @click="toggleModal">Toggle Me</b-button>
</b-modal>
</div>
export default {
methods: {
showModal() {
this.$root.$emit('bv::show::modal', 'modal-1', '#btnShow')
},
hideModal() {
this.$root.$emit('bv::hide::modal', 'modal-1', '#btnShow')
},
toggleModal() {
this.$root.$emit('bv::toggle::modal', 'modal-1', '#btnToggle')
}
}
}
注: $root
イベントを発行する代わりに、this.$bvModal.show()
およびthis.$bvModal.hide()
メソッド(前のセクションで言及)を使用することをお勧めします。
閉じるのを防ぐ
<b-modal>
が閉じるのを防ぐため(たとえば、検証が失敗した場合)、ok
(OKボタン)、cancel
(キャンセルボタン)、close
(モーダルヘッダーのクローズボタン)、およびhide
イベントハンドラーに渡されるイベントオブジェクトの.preventDefault()
メソッドを呼び出すことができます。 .preventDefault()
は、使用する場合は、非同期はサポートされていないため、必ず同期的に呼び出す必要があることに注意してください。
<template>
<div>
<b-button v-b-modal.modal-prevent-closing>Open Modal</b-button>
<div class="mt-3">
Submitted Names:
<div v-if="submittedNames.length === 0">--</div>
<ul v-else class="mb-0 pl-3">
<li v-for="name in submittedNames">{{ name }}</li>
</ul>
</div>
<b-modal
id="modal-prevent-closing"
ref="modal"
title="Submit Your Name"
@show="resetModal"
@hidden="resetModal"
@ok="handleOk"
>
<form ref="form" @submit.stop.prevent="handleSubmit">
<b-form-group
label="Name"
label-for="name-input"
invalid-feedback="Name is required"
:state="nameState"
>
<b-form-input
id="name-input"
v-model="name"
:state="nameState"
required
></b-form-input>
</b-form-group>
</form>
</b-modal>
</div>
</template>
<script>
export default {
data() {
return {
name: '',
nameState: null,
submittedNames: []
}
},
methods: {
checkFormValidity() {
const valid = this.$refs.form.checkValidity()
this.nameState = valid
return valid
},
resetModal() {
this.name = ''
this.nameState = null
},
handleOk(bvModalEvent) {
bvModalEvent.preventDefault()
this.handleSubmit()
},
handleSubmit() {
if (!this.checkFormValidity()) {
return
}
this.submittedNames.push(this.name)
this.$nextTick(() => {
this.$bvModal.hide('modal-prevent-closing')
})
}
}
}
</script>
注:イベントok
、cancel
、およびclose
は、モーダル組み込みのOK、キャンセル、およびヘッダーのクローズ(X)ボタンによってそれぞれ発行されます。modal-footer
スロットに独自のボタンを指定した場合、またはフッターを非表示にした場合、デフォルトではこれらのイベントは発行されません。この場合、hide
イベントを使用して、モーダルのクローズのキャンセルを制御します。イベントhide
は、ok
、cancel
、およびclose
が発行された場合でも常に発行されます。
ok
、cancel
、close
およびhide
イベントオブジェクト(BvModalEvent
)には、いくつかのプロパティとメソッドが含まれています
プロパティまたはメソッド | タイプ | 説明 |
preventDefault() | メソッド | 呼び出されると、モーダルが閉じるのを防ぎます |
trigger | プロパティ | 次のいずれかになります: ok (デフォルトの OK がクリックされた場合), cancel (デフォルトの キャンセル がクリックされた場合), esc (Escキーが押された場合), backdrop (背景がクリックされた場合), headerclose (ヘッダーの X ボタンがクリックされた場合)、hide() メソッドに提供された最初の引数、またはそれ以外の場合は null 。 |
target | プロパティ | モーダル要素への参照 |
vueTarget | プロパティ | モーダルの Vue VM インスタンスへの参照 |
componentId | プロパティ | モーダルの ID |
trigger
の値は、コンポーネントの hide()
メソッドに引数を渡すことで、詳細な制御(モーダルを非表示にしたボタンやアクションの検出など)が可能です。
注: ok
, cancel
, または close
イベントは、hide()
の引数がそれぞれ厳密に 'ok'
, 'cancel'
, または 'headerclose'
の場合にのみ発生します。hide()
に渡された引数は、イベントオブジェクトの trigger
プロパティに格納されます。
モーダルコンテンツ
グリッドの使用
モーダル内で Bootstrap グリッドシステムを使用するには、modal-body 内に <b-container fluid>
をネストします。その後、通常のグリッドシステム <b-row>
(または <b-form-row>
) と <b-col>
を他の場所と同じように使用します。
ツールチップとポップオーバーは、必要に応じてモーダル内に配置できます。モーダルが閉じられると、内部にあるツールチップとポップオーバーも自動的に閉じられます。ツールチップとポップオーバーは、モーダル要素に自動的に追加されます(正しいz-indexを確保するため)。ただし、コンテナIDを指定することで、追加先をオーバーライドできます(詳細はツールチップとポップオーバーのドキュメントを参照)。
<div>
<b-button v-b-modal.modalPopover>Show Modal</b-button>
<b-modal id="modalPopover" title="Modal with Popover" ok-only>
<p>
This
<b-button v-b-popover="'Popover inside a modal!'" title="Popover">Button</b-button>
triggers a popover on click.
</p>
<p>
This <a href="#" v-b-tooltip title="Tooltip in a modal!">Link</a> will show a tooltip on
hover.
</p>
</b-modal>
</div>
遅延読み込みと静的モーダル
デフォルトでは、モーダルは表示されるまでドキュメント内にコンテンツをレンダリングしません(遅延レンダリング)。表示されている場合、モーダルは <body>
要素に追加されてレンダリングされます。<b-modal>
コンポーネントは、DOM 内に配置された場所にプレースホルダーのコメントノード (<!---->
) としてレンダリングされるため、レイアウトには影響しません。ポータリング処理のため、コンテンツの変更をターゲットにレンダリングするには、2回以上の $nextTick
が必要になる場合があります。
static
プロパティを true
に設定することで、モーダルをドキュメントのその場(<b-modal>
コンポーネントがドキュメント内に配置された場所)にレンダリングできます。 static
が true
の場合、モーダルが表示されていない/表示されていない場合でも、モーダルのコンテンツは DOM にレンダリングされることに注意してください。static
モーダルを遅延レンダリングするには、lazy
プロパティも true
に設定します。その後、モーダルは表示されている場合にのみドキュメントに表示されます。static
モードの場合、<b-modal>
コンポーネントの配置がドキュメントとモーダルのレイアウトに影響を与える可能性があることに注意してください。
static
プロパティが true
でない場合、lazy
プロパティは効果がありません(非静的モーダルは常に遅延レンダリングされます)。
スタイル、オプション、およびカスタマイズ
モーダルサイズ
モーダルには、プロパティ size
を介して利用できる3つのオプションサイズがあります。これらのサイズは、狭いビューポートで水平スクロールバーを避けるために、特定のブレークポイントで有効になります。有効なオプションサイズは、sm
、lg
、および xl
です。
<div>
<b-button v-b-modal.modal-xl variant="primary">xl modal</b-button>
<b-button v-b-modal.modal-lg variant="primary">lg modal</b-button>
<b-button v-b-modal.modal-sm variant="primary">sm modal</b-button>
<b-modal id="modal-xl" size="xl" title="Extra Large Modal">Hello Extra Large Modal!</b-modal>
<b-modal id="modal-lg" size="lg" title="Large Modal">Hello Large Modal!</b-modal>
<b-modal id="modal-sm" size="sm" title="Small Modal">Hello Small Modal!</b-modal>
</div>
size
プロパティは、サイズを .modal-<size>
クラスにマッピングします。
長いコンテンツのスクロール
モーダルがユーザーのビューポートまたはデバイスに対して長すぎる場合、ページ自体とは独立してスクロールします。意味を理解するために、以下のデモを試してみてください。
<div>
<b-button v-b-modal.modal-tall>Launch overflowing modal</b-button>
<b-modal id="modal-tall" title="Overflowing Content">
<p class="my-4" v-for="i in 20" :key="i">
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
</b-modal>
</div>
プロパティ scrollable
を true
に設定して、モーダル本体のスクロールを可能にするスクロール可能なモーダルを作成することもできます。
<div>
<b-button v-b-modal.modal-scrollable>Launch scrolling modal</b-button>
<b-modal id="modal-scrollable" scrollable title="Scrollable Content">
<p class="my-4" v-for="i in 20" :key="i">
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
</b-modal>
</div>
垂直方向に中央揃えのモーダル
centered
プロパティを設定して、ビューポートでモーダルを垂直方向に中央揃えにします。
<div>
<b-button v-b-modal.modal-center>Launch centered modal</b-button>
<b-modal id="modal-center" centered title="BootstrapVue">
<p class="my-4">Vertically centered modal!</p>
</b-modal>
</div>
垂直方向に centered
を scrollable
と組み合わせて使用してもかまいません。
バリアント
header-bg-variant
, header-text-variant
, body-bg-variant
, body-text-variant
, footer-bg-variant
, そして footer-text-variant
プロパティを設定して、ヘッダー、フッター、および本文の背景とテキストのバリアントを制御します。 danger
, warning
, info
, success
, dark
, light
など、標準の Bootstrap バリアントを使用します。
ヘッダーの下部ボーダーとフッターの上部ボーダーのバリアントは、それぞれ header-border-variant
と footer-border-variant
プロパティで制御できます。
<template>
<div>
<b-button @click="show=true" variant="primary">Show Modal</b-button>
<b-modal
v-model="show"
title="Modal Variants"
:header-bg-variant="headerBgVariant"
:header-text-variant="headerTextVariant"
:body-bg-variant="bodyBgVariant"
:body-text-variant="bodyTextVariant"
:footer-bg-variant="footerBgVariant"
:footer-text-variant="footerTextVariant"
>
<b-container fluid>
<b-row class="mb-1 text-center">
<b-col cols="3"></b-col>
<b-col>Background</b-col>
<b-col>Text</b-col>
</b-row>
<b-row class="mb-1">
<b-col cols="3">Header</b-col>
<b-col>
<b-form-select
v-model="headerBgVariant"
:options="variants"
></b-form-select>
</b-col>
<b-col>
<b-form-select
v-model="headerTextVariant"
:options="variants"
></b-form-select>
</b-col>
</b-row>
<b-row class="mb-1">
<b-col cols="3">Body</b-col>
<b-col>
<b-form-select
v-model="bodyBgVariant"
:options="variants"
></b-form-select>
</b-col>
<b-col>
<b-form-select
v-model="bodyTextVariant"
:options="variants"
></b-form-select>
</b-col>
</b-row>
<b-row>
<b-col cols="3">Footer</b-col>
<b-col>
<b-form-select
v-model="footerBgVariant"
:options="variants"
></b-form-select>
</b-col>
<b-col>
<b-form-select
v-model="footerTextVariant"
:options="variants"
></b-form-select>
</b-col>
</b-row>
</b-container>
<template #modal-footer>
<div class="w-100">
<p class="float-left">Modal Footer Content</p>
<b-button
variant="primary"
size="sm"
class="float-right"
@click="show=false"
>
Close
</b-button>
</div>
</template>
</b-modal>
</div>
</template>
<script>
export default {
data() {
return {
show: false,
variants: ['primary', 'secondary', 'success', 'warning', 'danger', 'info', 'light', 'dark'],
headerBgVariant: 'dark',
headerTextVariant: 'light',
bodyBgVariant: 'light',
bodyTextVariant: 'dark',
footerBgVariant: 'warning',
footerTextVariant: 'dark'
}
}
}
</script>
modal-class
, content-class
, header-class
, body-class
そして footer-class
プロパティを介して、モーダルダイアログコンテナ、コンテンツ(モーダルウィンドウ自体)、ヘッダー、本文、およびフッターに任意のクラスを適用することもできます。プロパティは、文字列または文字列の配列を受け入れます。
背景の非表示
hide-backdrop
プロパティを設定して、モーダルの背景を非表示にします。
<div>
<b-button v-b-modal.modal-no-backdrop>Open modal</b-button>
<b-modal id="modal-no-backdrop" hide-backdrop content-class="shadow" title="BootstrapVue">
<p class="my-2">
We've added the utility class <code>'shadow'</code>
to the modal content for added effect.
</p>
</b-modal>
</div>
背景が非表示になっている場合でも、モーダルの外側をクリックするとモーダルが閉じることに注意してください。 <b-modal>
に no-close-on-backdrop
プロパティを設定することで、この動作を無効にできます。
開閉アニメーションの無効化
モーダルが開閉するときのフェードトランジション/アニメーションを無効にするには、<b-modal>
コンポーネントにプロパティ no-fade
を設定するだけです。
デフォルトフッターのボタンを小さくまたは大きくしたいですか?小さいボタンには button-size
プロパティを 'sm'
に、大きいボタンには 'lg'
に設定するだけです。
<div>
<b-button v-b-modal.modal-footer-sm>Small Footer Buttons</b-button>
<b-button v-b-modal.modal-footer-lg>Large Footer Buttons</b-button>
<b-modal id="modal-footer-sm" title="BootstrapVue" button-size="sm">
<p class="my-2">This modal has small footer buttons</p>
</b-modal>
<b-modal id="modal-footer-lg" title="BootstrapVue" button-size="lg">
<p class="my-2">This modal has large footer buttons</p>
</b-modal>
</div>
modal-footer
スロットを使用して独自のフッターを提供した場合、プロパティ button-size
は効果がありません。
組み込みのフッターボタンをプログラムで無効にできます。
cancel-disabled
プロパティと ok-disabled
プロパティをそれぞれ true
に設定することにより、キャンセルボタンと OK ボタンを個別に無効にできます。ボタンを再度有効にするには、プロパティを false
に設定します。
キャンセルボタンと OK ボタンの両方を同時に無効にするには、busy
プロパティを true
に設定するだけです。両方のボタンを再度有効にするには、false
に設定します。
スロットを使用したカスタムレンダリング
<b-modal>
は、モーダルのさまざまなセクションのコンテンツをカスタマイズするために使用できる、いくつかの名前付きスロット(そのうちのいくつかはオプションでスコープ指定されています)を提供します。
スロット | オプションでスコープ指定 | 説明 |
default | はい | モーダルのメインコンテンツ |
modal-title | はい | モーダルのタイトルに配置するコンテンツ |
modal-header | はい | ヘッダーに配置するコンテンツ。閉じるボタンを含むヘッダー全体を置き換えます |
modal-footer | はい | フッターに配置するコンテンツ。ボタンを含むフッター全体を置き換えます |
modal-ok | いいえ | フッターのOKボタンの内側に配置するコンテンツ |
modal-cancel | いいえ | フッターのキャンセルボタンの内側に配置するコンテンツ |
modal-header-close | いいえ | ヘッダーの閉じる(x )ボタンの内側に配置するコンテンツ |
オプションのスコープ指定をサポートするスロットで利用可能なスコープは次のとおりです。
メソッドまたはプロパティ | 説明 |
ok() | モーダルを閉じ、ok イベントと hide イベントを発生させます。bvModalEvent.trigger = 'ok' |
cancel() | モーダルを閉じ、cancel イベントと hide イベントを発生させます。bvModalEvent.trigger = 'cancel' |
close() | モーダルを閉じ、close イベントと hide イベントを発生させます。bvModalEvent.trigger = 'headerclose' |
hide(trigger) | モーダルを閉じ、hide イベントを発生させます。bvModalEvent.trigger = trigger (triggerはオプション) |
visible | モーダルの可視状態。モーダルが表示されている場合は true 、表示されていない場合は false |
カスタムスコープスロットを使用したモーダルの例
<template>
<b-button @click="$bvModal.show('modal-scoped')">Open Modal</b-button>
<b-modal id="modal-scoped">
<template #modal-header="{ close }">
<b-button size="sm" variant="outline-danger" @click="close()">
Close Modal
</b-button>
<h5>Modal Header</h5>
</template>
<template #default="{ hide }">
<p>Modal Body with button</p>
<b-button @click="hide()">Hide Modal</b-button>
</template>
<template #modal-footer="{ ok, cancel, hide }">
<b>Custom Footer</b>
<b-button size="sm" variant="success" @click="ok()">
OK
</b-button>
<b-button size="sm" variant="danger" @click="cancel()">
Cancel
</b-button>
<b-button size="sm" variant="outline-secondary" @click="hide('forget')">
Forget it
</b-button>
</template>
</b-modal>
</template>
複数のモーダルサポート
ネイティブな Bootstrap v4 とは異なり、BootstrapVue は同時に複数のモーダルを開くことをサポートしています。
特定のモーダルのスタックを無効にするには、<b-modal>
コンポーネントにプロップno-stacking
を設定してください。これにより、別のモーダルが表示される前にモーダルが非表示になります。
<div>
<b-button v-b-modal.modal-multi-1>Open First Modal</b-button>
<b-modal id="modal-multi-1" size="lg" title="First Modal" ok-only no-stacking>
<p class="my-2">First Modal</p>
<b-button v-b-modal.modal-multi-2>Open Second Modal</b-button>
</b-modal>
<b-modal id="modal-multi-2" title="Second Modal" ok-only>
<p class="my-2">Second Modal</p>
<b-button v-b-modal.modal-multi-3 size="sm">Open Third Modal</b-button>
</b-modal>
<b-modal id="modal-multi-3" size="sm" title="Third Modal" ok-only>
<p class="my-1">Third Modal</p>
</b-modal>
</div>
注意点
<b-modal>
を別の<b-modal>
の内部にネストすることは避けてください。親モーダルダイアログの境界に「制約される」可能性があるためです(特に静的モーダルを使用する場合)。 - 不透明な背景は、開かれる各モーダルに対して徐々に暗くなります。これは、各背景が他のモーダルと背景の上に開かれるため、想定される動作です。
モーダルメッセージボックス
BootstrapVueは、公開されているthis.$bvModal
オブジェクトに、いくつかの組み込みメッセージボックスメソッドを提供します。これらのメソッドは、ページに明示的に<b-modal>
コンポーネントを配置することなく、アプリのどこからでもシンプルなOKおよび確認スタイルのモーダルメッセージを生成する方法を提供します。
メソッド | 説明 |
this.$bvModal.msgBoxOk(message, options) | コンテンツとしてmessage と単一のOKボタンを持つモーダルを開きます |
this.$bvModal.msgBoxConfirm(message, options) | コンテンツとしてmessage とCANCELボタンとOKボタンを持つモーダルを開きます |
options
引数は、メッセージボックスモーダルにタイトルを追加したり、スタイルを設定したりするためのオプションの構成オブジェクトです。オブジェクトのプロパティは、<b-modal>
のプロパティに対応しますが、kebab-caseの代わりにcamelCase形式になります。
両方のメソッドは、モーダルが非表示になったときに値に解決するPromise
を返します(IE 11および古いブラウザのサポートにはポリフィルが必要です)。.msgBoxOk()
は常に値true
に解決しますが、.msgBoxConfirm()
はtrue
(OKボタンが押された場合)、false
(CANCELボタンが押された場合)、またはnull
(背景クリック、Escキーを押す、またはその他の手段でモーダルが閉じられた場合)に解決します。
message
が指定されていない場合、両方のメソッドはすぐに値undefined
を返します。
.then(..).catch(...)
または非同期await
コードスタイルのいずれかを使用できます(非同期await
は最新のブラウザまたはトランスパイラが必要です)。
OKメッセージボックス
OKメッセージボックスの例
<template>
<div>
<div class="mb-2">
<b-button @click="showMsgBoxOne">Simple msgBoxOk</b-button>
Return value: {{ String(boxOne) }}
</div>
<div class="mb-1">
<b-button @click="showMsgBoxTwo">msgBoxOk with options</b-button>
Return value: {{ String(boxTwo) }}
</div>
</div>
</template>
<script>
export default {
data() {
return {
boxOne: '',
boxTwo: ''
}
},
methods: {
showMsgBoxOne() {
this.boxOne = ''
this.$bvModal.msgBoxOk('Action completed')
.then(value => {
this.boxOne = value
})
.catch(err => {
})
},
showMsgBoxTwo() {
this.boxTwo = ''
this.$bvModal.msgBoxOk('Data was submitted successfully', {
title: 'Confirmation',
size: 'sm',
buttonSize: 'sm',
okVariant: 'success',
headerClass: 'p-2 border-bottom-0',
footerClass: 'p-2 border-top-0',
centered: true
})
.then(value => {
this.boxTwo = value
})
.catch(err => {
})
}
}
}
</script>
確認メッセージボックス
確認メッセージボックスの例
<template>
<div>
<div class="mb-2">
<b-button @click="showMsgBoxOne">Simple msgBoxConfirm</b-button>
Return value: {{ String(boxOne) }}
</div>
<div class="mb-1">
<b-button @click="showMsgBoxTwo">msgBoxConfirm with options</b-button>
Return value: {{ String(boxTwo) }}
</div>
</div>
</template>
<script>
export default {
data() {
return {
boxOne: '',
boxTwo: ''
}
},
methods: {
showMsgBoxOne() {
this.boxOne = ''
this.$bvModal.msgBoxConfirm('Are you sure?')
.then(value => {
this.boxOne = value
})
.catch(err => {
})
},
showMsgBoxTwo() {
this.boxTwo = ''
this.$bvModal.msgBoxConfirm('Please confirm that you want to delete everything.', {
title: 'Please Confirm',
size: 'sm',
buttonSize: 'sm',
okVariant: 'danger',
okTitle: 'YES',
cancelTitle: 'NO',
footerClass: 'p-2',
hideHeaderClose: false,
centered: true
})
.then(value => {
this.boxTwo = value
})
.catch(err => {
})
}
}
}
</script>
メッセージボックスの注意点
this.$bvModal
インジェクションは、完全なBootstrapVue
プラグインまたはModalPlugin
プラグインを使用している場合にのみ使用できます。b-modal
コンポーネントのみをインポートしている場合は使用できません。インジェクションのみをインポートするには、BVModalPlugin
プラグインを使用してください。 - 新しい
$bvModal
インジェクション(mixin)は、各Vue仮想マシン(つまり、インスタンス化された各コンポーネント)に対して作成され、インスタンスのthis
および$root
コンテキストへのアクセスが必要なため、Vue.prototype
への直接アクセスを介しては使用できません。 - メッセージボックスには、ブラウザでの
Promise
サポートが必要です。IE 11など古いブラウザをアプリのターゲットにしている場合は、Promise
サポートを提供するポリフィルを含めてください。Promise
サポートが検出されない場合、メッセージボックスメソッドはすぐにundefined
を返します。 - メッセージボックスは、
<b-modal>
コンポーネントの拡張であり、したがって、次のプロパティを除いて、ほとんどの<b-modal>
プロパティ(camelCase形式を使用)をサポートします。lazy
、static
、busy
、visible
、noStacking
、okOnly
、okDisabled
、およびcancelDisabled
。 - オプションで
title
(またはtitleHtml
)が指定されていない場合、ヘッダーは表示されません。 - オプションで
title
(またはtitleHtml
)が指定されている場合、ヘッダークローズボタンはデフォルトでは表示されません。オプションでhideHeaderClose: false
を設定することで、ヘッダークローズボタンを有効にできます。 - メッセージボックスは、非表示になる前に閉じたり破棄されたりすると、エラー(Promiseのリジェクト)をスローします。非同期の
await
スタイルのコードを使用している場合でも、常に.catch(errHandler)
リジェクトハンドラーを含めてください。 - Vue Router(または同様のもの)を使用する場合、モーダルが非表示になる前にルートが変更されると、メッセージボックスは閉じてリジェクトされます。ルートが変更されたときにメッセージボックスを開いたままにする場合は、
this.$bvModal
の代わりにthis.$root.$bvModal
を使用します。 - メッセージボックスは、サーバーサイドレンダリング(SSR)中に生成することはできません。
- メッセージボックスの
message
は現在、HTML文字列をサポートしていませんが、マークアップを細かく制御するために、VNodes
の配列をmessage
として渡すことができます。Vueのthis.$createElement
メソッドを使用してVNodesを生成できます。これは、モーダルタイトル(VNodesをtitle
オプションに渡すことによって)、OKボタンのテキスト(okTitle
オプションを介して)、およびCANCELボタンのテキスト(cancelTitle
オプションを介して)にも行うことができます。
メッセージボックスの高度な使用法
モーダルを生成するためのthis.$bvModal.msgBoxOk(...)
またはthis.$bvModal.msgBoxConfirm(...)
メソッドを使用する場合、モーダルコンテンツは単なる文字列メッセージ以上のものにしたい場合があります。メッセージボックスの注意点セクションで説明したように、より複雑なコンテンツのために、メッセージとタイトルとしてVNodesの配列を渡すことができます。
Vueのthis.$createElement
メソッドを使用してVNodesを生成します。
<template>
<div>
<b-button @click="showMsgOk">Show OK message box with custom content</b-button>
</div>
</template>
<script>
export default {
methods: {
showMsgOk() {
const h = this.$createElement
const titleVNode = h('div', { domProps: { innerHTML: 'Title from <i>HTML<i> string' } })
const messageVNode = h('div', { class: ['foobar'] }, [
h('p', { class: ['text-center'] }, [
' Flashy ',
h('strong', 'msgBoxOk'),
' message ',
]),
h('p', { class: ['text-center'] }, [h('b-spinner')]),
h('b-img', {
props: {
src: 'https://picsum.photos/id/20/250/250',
thumbnail: true,
center: true,
fluid: true, rounded: 'circle'
}
})
])
this.$bvModal.msgBoxOk([messageVNode], {
title: [titleVNode],
buttonSize: 'sm',
centered: true, size: 'sm'
})
}
}
}
</script>
$rootイベントを介したモーダル変更のリスニング
モーダルが開くのをリッスンするには、次を使用します
export default {
mounted() {
this.$root.$on('bv::modal::show', (bvEvent, modalId) => {
console.log('Modal is about to be shown', bvEvent, modalId)
})
}
}
発行されるイベントの完全なリストについては、このドキュメントのイベントセクションを参照してください。
アクセシビリティ
<b-modal>
は、自動フォーカス、フォーカス復帰、キーボード(タブ)フォーカスコンテインメント、および自動aria-*
属性を含む、いくつかのアクセシビリティ機能を提供します。
注:このコンポーネントのアニメーション効果は、prefers-reduced-motion
メディアクエリに依存します。詳細については、アクセシビリティドキュメントの低減された動きセクションを参照してください。
モーダルARIA属性
aria-labelledby
属性とaria-describedby
属性は、ほとんどの場合、モーダルに自動的に表示されます。
- ヘッダーを非表示にしたり、独自のヘッダーを提供したり、モーダルタイトルを提供していない場合は、
aria-labelledby
属性は表示されません。(組み込みヘッダーを使用している場合は)モーダルにタイトルを提供することをお勧めします。title-sr-only
プロパティを設定することで、ヘッダータイトルを視覚的に非表示にしながら、スクリーンリーダーで利用できるようにすることができます。ヘッダーがない場合は、aria-label
プロパティに文字列を渡すことで、モーダルのラベルを提供できます。 aria-describedby
属性は、常にモーダルの本文コンテンツを指します。 aria-label
プロパティが文字列値で指定されている場合、モーダルにタイトル/ヘッダーがある場合でも、aria-labelledby
属性はレンダリングされません。
aria-label
プロパティとtitle-sr-only
プロパティは、バージョンv2.0.0-rc.27
で追加されました。
開いたときに自動フォーカス
<b-modal>
は、開いたときにモーダルコンテナを自動フォーカスします。
<b-modal>
内の要素を事前にフォーカスするには、<b-modal>
のshown
イベントをリッスンし、要素のfocus()
メソッドを呼び出します。<b-modal>
は、<b-modal>
内に要素がすでにフォーカスを持っている場合、自動フォーカスを試行しません。
<b-modal @shown="focusMyElement">
<div>
<b-button>I Don't Have Focus</b-button>
</div>
<div>
<b-form-input></b-form-input>
</div>
<div>
<b-form-input ref="focusThis"></b-form-input>
</div>
<div>
<b-form-input></b-form-input>
</div>
</b-modal>
export default {
methods: {
focusMyElement() {
this.$refs.focusThis.focus()
}
}
}
または、b-form-*
フォームコントロールを使用している場合は、モーダルが開いたときにフォームコントロールを自動的にフォーカスするために、autofocus
プロパティを使用できます。autofocus
は、b-form-*
コントロールがDOMにマウントされたときに発生するため、lazy
プロパティが設定されていないstatic
プロパティを使用すると、autofocus
プロパティはb-modal
では機能しないことに注意してください。
組み込みのモーダルボタン(ok
、cancel
、またはヘッダーのclose
ボタン)のいずれかを自動フォーカスする場合は、プロパティauto-focus-button
を'ok'
、'cancel'
、または'close'
の値のいずれかに設定できます。そして、<b-modal>
は、指定されたボタンが存在する場合にそれをフォーカスします。この機能は、モーダルメッセージボックスでも利用できます。
注:アクセシビリティ上の理由から、モーダル内の入力またはコントロールを自動フォーカスすることは推奨されません。スクリーンリーダーのユーザーは、入力がどこにあるかのコンテキストを知ることができないためです(モーダルのアナウンスが発音されない場合があります)。<b-modal>
にモーダルのコンテナをフォーカスさせ、モーダル情報がユーザーに伝えられるようにし、その後、ユーザーがタブで入力を移動できるようにするのが最善です。
トリガー要素へのフォーカス復帰
アクセシビリティ上の理由から、モーダルを閉じたときに、モーダルの開くをトリガーした要素にフォーカスを戻すことが望ましいです。
<b-modal>
は、モーダルが開かれる前にフォーカスを持っていた要素を自動的に判別し、可能であればモーダルが非表示になったときにその要素にフォーカスを戻そうとします。ただし、モーダルが非表示になったときにフォーカスを戻す要素を指定するためのいくつかのメソッドとオプションが用意されています。
return-focus
プロパティによるフォーカスを戻す要素の指定
モーダルが閉じるときにフォーカスを戻す要素は、return-focus
プロパティに以下のいずれかを設定することで指定することもできます。
- CSSクエリセレクター文字列(または
#
が前に付いた要素ID) - コンポーネント参照(
<b-button>
など、フォーカス可能な要素にマウントされているもの) - フォーカス可能なDOM要素への参照
渡された要素がフォーカス可能でない場合、ブラウザが何にフォーカスがあるかを判断します(通常は <body>
になり、望ましくありません)。
このフォーカスを戻す方法は、<b-modal>
のメソッド show()
および hide()
、または v-model
プロパティを使用する場合に便利です。このプロパティは、フォーカスを戻す要素を指定する他の方法よりも優先されることに注意してください。
自動フォーカス復帰
<b-modal>
が要素の v-b-modal
ディレクティブを介して開かれた場合、return-focus
プロパティで要素が指定されていない限り、<b-modal>
が閉じるときにフォーカスはこの要素に自動的に戻されます。
イベントによるフォーカスを戻す要素の指定
bv::show::modal
イベント($root
で発行)を使用する場合、2番目の引数としてフォーカスを戻す要素を指定できます。この引数は、return-focus
プロパティと同じ型を受け入れます。
this.$root.$emit('bv::show::modal', 'modal-1', '#focusThisOnClose')
ヒント: クリックイベント(または同様のイベント)を使用してモーダルを開くトリガーにする場合は、イベントの target
プロパティを渡してください。
<div>
<b-button @click="$root.$emit('bv::show::modal', 'modal-1', $event.target)">Open Modal</b-button>
</div>
注意: <b-modal>
に return-focus
プロパティが設定されている場合、イベントを介して指定された要素は無視されます。
キーボードナビゲーション
<b-modal>
内の要素をタブで移動する際、フォーカスがモーダルからドキュメントに移動しようとすると、モーダル内に戻されます。
モーダル内の要素に tabindex
を 0
または -1
以外の値に設定することは避けてください。そうすると、支援技術に依存する人がページコンテンツをナビゲートおよび操作するのが困難になり、キーボードナビゲーションで一部の要素に到達できなくなる可能性があります。
モーダルの外部のいくつかの要素をフォーカス可能にする必要がある場合(例:TinyMCE)、それらをCSSセレクターとして ignore-enforce-focus-selector
プロパティに追加できます 2.4.0+。例:
<b-modal
id="some-modal-id"
title="Modal with TinyMCE Editor"
ignore-enforce-focus-selector=".tox-tinymce-aux, .moxman-window, .tam-assetmanager-root"
>
</b-modal>
場合によっては、フォーカス強制機能を完全に無効にする必要がある場合があります。これは、プロパティ no-enforce-focus
を設定することで可能ですが、アクセシビリティ上の理由から強く推奨されません。
v-b-modal
ディレクティブのアクセシビリティ
v-b-modal
ディレクティブのアクセシビリティに関する注意事項
- 要素が
<button>
(または <button>
をレンダリングするコンポーネント)以外の場合、ARIA role
が button
に設定され、Enter および Space のkeydownイベントリスナーが、click
リスナーとともに追加されます。 - 要素が
<button>
または <a>
(またはどちらかをレンダリングするコンポーネント)以外の場合、tabindex
が 0
に設定され、アクセシビリティが確保されます。ただし、すでに tabindex
が設定されている場合は除きます。