# モーダルウィンドウ
props
で制御するタイプのモーダルウィンドウです。
# デモ
ボタンを押すとモーダルウィンドウが開きます
# 使用している主な機能
フォーム入力バインディング v-model 105ページ
コンポーネント 146ページ
スロット 169ページ
トランジション 194ページ
# ソースコード
<template>
<transition name="modal" appear>
<div class="modal modal-overlay" @click.self="$emit('close')">
<div class="modal-window">
<div class="modal-content">
<slot/>
</div>
<footer class="modal-footer">
<slot name="footer">
<button @click="$emit('close')">Close</button>
</slot>
</footer>
</div>
</div>
</transition>
</template>
<style lang="stylus" scoped>
.modal {
&.modal-overlay {
display: flex;
align-items: center;
justify-content: center;
position: fixed;
z-index: 30;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
}
&-window {
background: #fff;
border-radius: 4px;
overflow: hidden;
}
&-content {
padding: 10px 20px;
}
&-footer {
background: #ccc;
padding: 10px;
text-align: right;
}
}
// オーバーレイのトランジション
.modal-enter-active, .modal-leave-active {
transition: opacity 0.4s;
// オーバーレイに包含されているモーダルウィンドウのトランジション
.modal-window {
transition: opacity 0.4s, transform 0.4s;
}
}
// ディレイを付けるとモーダルウィンドウが消えた後にオーバーレイが消える
.modal-leave-active {
transition: opacity 0.6s ease 0.4s;
}
.modal-enter, .modal-leave-to {
opacity: 0;
.modal-window {
opacity: 0;
transform: translateY(-20px);
}
}
</style>
<template>
<div class="example-modal-window">
<p>ボタンを押すとモーダルウィンドウが開きます</p>
<button @click="openModal">開く</button>
<!-- コンポーネント MyModal -->
<MyModal @close="closeModal" v-if="modal">
<!-- default スロットコンテンツ -->
<p>Vue.js Modal Window!</p>
<div><input v-model="message"></div>
<!-- /default -->
<!-- footer スロットコンテンツ -->
<template slot="footer">
<button @click="doSend">送信</button>
</template>
<!-- /footer -->
</MyModal>
</div>
</template>
<script>
import MyModal from './MyModal.vue'
export default {
components: { MyModal },
data() {
return {
modal: false,
message: ''
}
},
methods: {
openModal() {
this.modal = true
},
closeModal() {
this.modal = false
},
doSend() {
if (this.message.length > 0) {
alert(this.message)
this.message = ''
this.closeModal()
} else {
alert('メッセージを入力してください')
}
}
}
}
</script>