У меня есть всплывающее окно с предупреждением, если в системе регистрации произошел успех / ошибка.
У меня проблема с анимацией, когда после завершения анимации всплывающее окно с предупреждением переходит наверх его родительского div называется registration-alert
Я пытался использовать forwards
, как описано здесь , но мой всплывающий компонент не отвечает на это. Какие могут быть проблемы?
Во время анимации
После завершения анимации
В идеале, когда анимация заканчивается, я бы хотел, чтобы всплывающее окно оставалось там, где оно заканчивается на отметке keyframes 100%
.
В приведенном ниже коде страница Registration
содержит ToastManager
Компонент, который содержит Toast
Компонент. реквизит toast
передается в ToastManager в зависимости от статуса reg, который ToastManger передает в Toast. Идея для этого кода была взята из здесь
Регистрация. vue
<template>
<v-app class="register-container">
<div class="registration-alert">
<ToastManager :toast="registrationToast" />
</div>
<v-card width="400" class="mx-auto mt-5 register-card">
<v-card-title>
<h1 class="display-1">Register</h1>
</v-card-title>
<v-card-text>
<v-form>
..reg form
</v-card>
</v-app>
</template>
<style lang="scss">
.register-card {
position: fixed !important;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.registration-alert {
margin-top: 3rem;
display: flex;
align-items: center;
justify-content: center;
}
</style>
ToastManager. vue
<template>
<transition name="toasts" tag="div" class="c-toasts">
<Toast v-if="toast.show" :toast="toast"></Toast>
</transition>
</template>
<script lang="ts">
import Vue from "vue";
import { Component, Prop } from "vue-property-decorator";
import Toast from "@/components/Toast.vue";
@Component({
components: { Toast }
})
export default class ToastManager extends Vue {
@Prop() toast!: any;
duration = 3000;
addToast() {
setTimeout(() => {
this.removeToast();
}, this.duration);
}
removeToast() {
this.toast.show = false;
clearInterval();
}
mounted() {
setInterval(() => {
this.addToast();
}, this.duration);
}
}
</script>
<style lang="scss">
.c-toasts {
top: -25rem;
}
.toasts-enter-active {
animation: bounce-in 20s ease forwards;
}
.toasts-leave-active {
// transition: opacity 0.2s ease-in-out, ;
animation: bounce-in 1s reverse forwards transform 1s ease;
}
@keyframes bounce-in {
0% {
opacity: 0;
}
25% {
opacity: 0.25;
transform: translateY(3rem);
}
50% {
opacity: 0.5;
transform: translateY(1.5rem);
}
75% {
opacity: 0.75;
transform: translateY(2.5rem);
}
100% {
opacity: 1;
transform: translateY(2rem);
}
}
</style>
Тост. vue
<template>
<div :class="['c-toasts__item', 'c-toasts__item--' + toast.type]">
<span class="c-toasts__item-text">{{ toast.text }}</span>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import { Component, Prop } from "vue-property-decorator";
@Component
export default class Toast extends Vue {
@Prop() toast!: object;
}
</script>
<style lang="scss">
// Element
.c-toasts__item {
display: flex;
align-items: center;
width: 50%;
margin-bottom: 10px;
padding: 15px;
border-radius: 5px;
color: #fff;
}
.c-toasts__item-text {
font-size: 14px;
line-height: 1.5;
}
.c-toasts__item--success {
background-color: #339900;
}
.c-toasts__item--error {
background-color: #cc3300;
}
.c-toasts__item--warning {
background-color: #ffcc00;
}
.c-toasts__item--info {
background-color: #40a6ce;
}
</style>