<div id="app">
<modal
v-if="showModal"
@close="showModal = false"
></modal>
<button
class="button"
@click="showModal = true"
>
Show Modal
</button>
</div>
<script type="text/x-template" id="modal">
<transition
name="fade"
@after-enter="showContent = true"
>
<div
class="modal"
@click="showContent = false"
>
<transition
name="fade"
@after-leave="$emit('close')"
>
<div
v-if="showContent"
class="content"
@click.stop
>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quisquam, placeat, unde! Architecto laboriosam ducimus atque cum dolore doloribus obcaecati vero. Minus porro sapiente unde fuga incidunt quidem necessitatibus mollitia libero?
</div>
</transition>
</div>
</transition>
</script>
* {
box-sizing: border-box;
}
body {
margin: 0;
padding: 0;
height: 100vh;
width: 100vw;
display: flex;
align-items: center;
justify-content: center;
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.button {
border-radius: 2px;
background: #D55672;
border: none;
padding: 10px;
font-size: 14px;
font-weight: bold;
cursor: pointer;
color: #FFF;
outline: none;
transition: 0.1s background;
}
.button:hover {
background: #AA445B;
}
.modal {
position: absolute;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: rgba(0,0,0,0.6)
}
.content {
position: absolute;
top: 50%;
left: 50%;
width: calc(100% - 20px);
max-width: 500px;
transform: translate(-50%, -50%);
background: #FFF;
border-radius: 3px;
padding: 20px;
line-height: 1.5;
font-size: 18px;
color: #444;
box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
.fade-enter-active, .fade-leave-active {
transition: 0.2s opacity ease-out;
}
Vue.component('modal', {
template: '#modal',
data () {
return {
showContent: false
}
}
})
new Vue({
el: '#app',
data () {
return {
showModal: false
}
}
})
This Pen doesn't use any external CSS resources.