Dialog.vue 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <script setup lang="ts">
  2. import { ref } from 'vue'
  3. const dialogVisible = ref(false)
  4. interface DialogProps {
  5. width?: string
  6. alignCenter: boolean
  7. }
  8. withDefaults(defineProps<DialogProps>(), {
  9. width: '50%',
  10. alignCenter: false
  11. })
  12. defineEmits<{ (e: 'on-close', value: boolean): void }>()
  13. const DialogOpen = () => {
  14. dialogVisible.value = true
  15. }
  16. const DialogClose = () => {
  17. dialogVisible.value = false
  18. }
  19. // 导出方法
  20. defineExpose({
  21. DialogOpen,
  22. DialogClose
  23. })
  24. </script>
  25. <template>
  26. <el-dialog
  27. v-model="dialogVisible"
  28. @close="DialogClose"
  29. @closed="DialogClose"
  30. :align-center="alignCenter"
  31. :width="width"
  32. class="bottomD"
  33. >
  34. <!-- 默认插槽 -->
  35. <slot></slot>
  36. <!-- 弹框头部 -->
  37. <template #header>
  38. <slot name="header"></slot>
  39. </template>
  40. <!-- 弹框页脚 -->
  41. <template #footer>
  42. <slot name="footer"></slot>
  43. </template>
  44. </el-dialog>
  45. </template>
  46. <style scoped>
  47. :deep(.el-dialog) {
  48. animation: anim-open 1s linear !important;
  49. }
  50. .el-dialog__wrapper {
  51. transition-duration: 0.1s;
  52. }
  53. .el-dialog__wrapper.dialog-fade-enter-active,
  54. .el-dialog__wrapper.dialog-fade-leave-active {
  55. animation: none !important;
  56. }
  57. .bottomD {
  58. animation: anim-open 1s linear !important;
  59. }
  60. @keyframes anim-open {
  61. 0% {
  62. transform: translate3d(100%, 0, 0);
  63. opacity: 0;
  64. }
  65. 25% {
  66. transform: translate3d(60%, 0, 0);
  67. opacity: 0.5;
  68. }
  69. 50% {
  70. transform: translate3d(15%, 0, 0);
  71. opacity: 0.9;
  72. }
  73. 75% {
  74. transform: translate3d(5%, 0, 0);
  75. opacity: 0.95;
  76. }
  77. 100% {
  78. transform: translate3d(0, 0, 0);
  79. opacity: 1;
  80. }
  81. }
  82. </style>