| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- <script src="../../dist/vue.global.js"></script>
- <!-- template for the modal component -->
- <script type="text/x-template" id="modal-template">
- <transition name="modal">
- <div v-if="show" class="modal-mask">
- <div class="modal-wrapper">
- <div class="modal-container">
- <div class="modal-header">
- <slot name="header">
- default header
- </slot>
- </div>
- <div class="modal-body">
- <slot name="body">
- default body
- </slot>
- </div>
- <div class="modal-footer">
- <slot name="footer">
- default footer
- <button class="modal-default-button" @click="$emit('close')">
- OK
- </button>
- </slot>
- </div>
- </div>
- </div>
- </div>
- </transition>
- </script>
- <script>
- const Modal = {
- template: '#modal-template',
- props: ['show'],
- }
- </script>
- <!-- modal container that lives outside of app root -->
- <div id="modal-container"></div>
- <!-- app -->
- <div id="app">
- <button id="show-modal" @click="showModal = true">Show Modal</button>
- <teleport to="#modal-container">
- <!-- use the modal component, pass in the prop -->
- <modal :show="showModal" @close="showModal = false">
- <template #header>
- <h3>custom header</h3>
- </template>
- </modal>
- </teleport>
- </div>
- <script>
- Vue.createApp({
- components: { Modal },
- data: () => ({
- showModal: false,
- }),
- }).mount('#app')
- </script>
- <style>
- .modal-mask {
- position: fixed;
- z-index: 9998;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-color: rgba(0, 0, 0, 0.5);
- display: table;
- transition: opacity 0.3s ease;
- }
- .modal-wrapper {
- display: table-cell;
- vertical-align: middle;
- }
- .modal-container {
- width: 300px;
- margin: 0px auto;
- padding: 20px 30px;
- background-color: #fff;
- border-radius: 2px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.33);
- transition: all 0.3s ease;
- font-family: Helvetica, Arial, sans-serif;
- }
- .modal-header h3 {
- margin-top: 0;
- color: #42b983;
- }
- .modal-body {
- margin: 20px 0;
- }
- .modal-default-button {
- float: right;
- }
- /*
- * The following styles are auto-applied to elements with
- * transition="modal" when their visibility is toggled
- * by Vue.js.
- *
- * You can easily play with the modal transition by editing
- * these styles.
- */
- .modal-enter-from {
- opacity: 0;
- }
- .modal-leave-to {
- opacity: 0;
- }
- .modal-enter-from .modal-container,
- .modal-leave-to .modal-container {
- -webkit-transform: scale(1.1);
- transform: scale(1.1);
- }
- </style>
|