| <template> | |
| <div class="fullscreen-spin" :class="{ 'mask': mask }" v-if="loading"> | |
| <div class="spin"> | |
| <div class="spinner"></div> | |
| <div class="text">{{tip}}</div> | |
| </div> | |
| </div> | |
| </template> | |
| <script lang="ts" setup> | |
| withDefaults(defineProps<{ | |
| loading?: boolean | |
| mask?: boolean | |
| tip?: string | |
| }>(), { | |
| loading: false, | |
| mask: true, | |
| tip: '', | |
| }) | |
| </script> | |
| <style lang="scss" scoped> | |
| .fullscreen-spin { | |
| position: fixed; | |
| top: 0; | |
| bottom: 0; | |
| left: 0; | |
| right: 0; | |
| z-index: 100; | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| &.mask { | |
| background-color: rgba($color: #f1f1f1, $alpha: .7); | |
| } | |
| } | |
| .spin { | |
| width: 200px; | |
| height: 200px; | |
| position: fixed; | |
| top: 50%; | |
| left: 50%; | |
| margin-top: -100px; | |
| margin-left: -100px; | |
| display: flex; | |
| flex-direction: column; | |
| justify-content: center; | |
| align-items: center; | |
| } | |
| .spinner { | |
| width: 36px; | |
| height: 36px; | |
| border: 3px solid $themeColor; | |
| border-top-color: transparent; | |
| border-radius: 50%; | |
| animation: spinner .8s linear infinite; | |
| } | |
| .text { | |
| margin-top: 20px; | |
| color: $themeColor; | |
| } | |
| @keyframes spinner { | |
| 0% { | |
| transform: rotate(0deg); | |
| } | |
| 100% { | |
| transform: rotate(360deg); | |
| } | |
| } | |
| </style> |