Vue.js CSS 使用 v-if 时动画无法正常工作
Vue.js CSS animation not working correctly when using v-if
目前,在我的 Laravel 应用程序中使用最新版本的 Vue.js。预期的结果是当用户点击一个按钮时,它会显示一个带有页面内容的div,并且会显示一个淡入淡出的动画。具体来说,我想让它做的是,当点击一个按钮时,页面会显示,每次在页面之间切换时都会显示淡入淡出的动画。
问题
我将使用下面的示例来简化我的问题。当用户单击带有 @click='productsPageBtn'
的按钮时,它会显示动画。当我单击仪表板(默认)@click='dashboardPageBtn'
时,它不显示动画。但是,当我再次单击 productsPageBtn 时,它再次起作用并再次显示动画。
它们的工作方式相同,点击按钮时 v-if
和 :class
会添加动画 class。仪表板动画在它首先加载到页面上时会显示,但当我从产品单击到仪表板时不显示动画。
我该如何解决这个问题,以便在我点击仪表板时,它还会显示动画而不仅仅是产品?
提前感谢您的帮助。
HTML
<div id="app">
<button @click="dashboardPageBtn" class="">Dashboard</button>
<button @click="productsPageBtn">Products</button>
<div v-if="page == 'dashboard-page'" id="dashboard" class="" :class="{'content-fade-up-animation' : page == 'dashboard-page'}">
<h1 class="top-menu-header-title">Dashboard</h1>
</div>
<div v-if="page == 'products-page'" id="product" class="" :class="{'content-fade-up-animation' : page == 'products-page'}">
<div class="mt-10 text-4xl mb-10">
<h1 class="top-menu-header-title">Test</h1>
</div>
</div>
</div>
JS
var app = new Vue({
el: "#app",
data() {
return {
page: "dashboard-page",
headerTitle: "Dashboard"
};
},
methods: {
productsPageBtn(e) {
this.page = "products-page";
this.headerTitle = "Products";
},
dashboardPageBtn() {
this.page = "dashboard-page";
this.headerTitle = "Dashboard";
}
}
});
CSS
.content-fade-up-animation {
animation-duration: 1s;
animation-fill-mode: both;
-webkit-animation-duration: 1s;
-webkit-animation-fill-mode: both;
opacity: 0;
animation-name: fadeInUp;
-webkit-animation-name: fadeInUp;
}
/* Content fade up animation */
@keyframes fadeInUp {
from {
transform: translate3d(0,40px,0)
}
to {
transform: translate3d(0,0,0);
opacity: 1
}
}
@-webkit-keyframes fadeInUp {
from {
transform: translate3d(0,40px,0)
}
to {
transform: translate3d(0,0,0);
opacity: 1
}
}
像下面的片段一样尝试,使用 v-show 并在未显示时删除 class :class="page == 'dashboard-page' ? 'content-fade-up-animation' : ''"
:
var app = new Vue({
el: "#app",
data() {
return {
page: "dashboard-page",
headerTitle: "Dashboard"
};
},
methods: {
productsPageBtn() {
this.page = "products-page";
this.headerTitle = "Products";
},
dashboardPageBtn() {
this.page = "dashboard-page";
this.headerTitle = "Dashboard";
}
}
});
.content-fade-up-animation {
animation-duration: 1s;
animation-fill-mode: both;
-webkit-animation-duration: 1s;
-webkit-animation-fill-mode: both;
opacity: 0;
animation-name: fadeInUp;
-webkit-animation-name: fadeInUp;
}
/* Content fade up animation */
@keyframes fadeInUp {
from {
transform: translate3d(0,40px,0)
}
to {
transform: translate3d(0,0,0);
opacity: 1
}
}
@-webkit-keyframes fadeInUp {
from {
transform: translate3d(0,40px,0)
}
to {
transform: translate3d(0,0,0);
opacity: 1
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<button @click="dashboardPageBtn">Dashboard</button>
<button @click="productsPageBtn">Products</button>
<div v-show="page == 'dashboard-page'" id="dashboard" :class="page == 'dashboard-page' ? 'content-fade-up-animation' : ''">
<h1 class="top-menu-header-title">Dashboard</h1>
</div>
<div v-show="page == 'products-page'" id="product" :class="page == 'products-page' && 'content-fade-up-animation'">
<div class="mt-10 text-4xl mb-10">
<h1 class="top-menu-header-title">Test</h1>
</div>
</div>
</div>
目前,在我的 Laravel 应用程序中使用最新版本的 Vue.js。预期的结果是当用户点击一个按钮时,它会显示一个带有页面内容的div,并且会显示一个淡入淡出的动画。具体来说,我想让它做的是,当点击一个按钮时,页面会显示,每次在页面之间切换时都会显示淡入淡出的动画。
问题
我将使用下面的示例来简化我的问题。当用户单击带有 @click='productsPageBtn'
的按钮时,它会显示动画。当我单击仪表板(默认)@click='dashboardPageBtn'
时,它不显示动画。但是,当我再次单击 productsPageBtn 时,它再次起作用并再次显示动画。
它们的工作方式相同,点击按钮时 v-if
和 :class
会添加动画 class。仪表板动画在它首先加载到页面上时会显示,但当我从产品单击到仪表板时不显示动画。
我该如何解决这个问题,以便在我点击仪表板时,它还会显示动画而不仅仅是产品?
提前感谢您的帮助。
HTML
<div id="app">
<button @click="dashboardPageBtn" class="">Dashboard</button>
<button @click="productsPageBtn">Products</button>
<div v-if="page == 'dashboard-page'" id="dashboard" class="" :class="{'content-fade-up-animation' : page == 'dashboard-page'}">
<h1 class="top-menu-header-title">Dashboard</h1>
</div>
<div v-if="page == 'products-page'" id="product" class="" :class="{'content-fade-up-animation' : page == 'products-page'}">
<div class="mt-10 text-4xl mb-10">
<h1 class="top-menu-header-title">Test</h1>
</div>
</div>
</div>
JS
var app = new Vue({
el: "#app",
data() {
return {
page: "dashboard-page",
headerTitle: "Dashboard"
};
},
methods: {
productsPageBtn(e) {
this.page = "products-page";
this.headerTitle = "Products";
},
dashboardPageBtn() {
this.page = "dashboard-page";
this.headerTitle = "Dashboard";
}
}
});
CSS
.content-fade-up-animation {
animation-duration: 1s;
animation-fill-mode: both;
-webkit-animation-duration: 1s;
-webkit-animation-fill-mode: both;
opacity: 0;
animation-name: fadeInUp;
-webkit-animation-name: fadeInUp;
}
/* Content fade up animation */
@keyframes fadeInUp {
from {
transform: translate3d(0,40px,0)
}
to {
transform: translate3d(0,0,0);
opacity: 1
}
}
@-webkit-keyframes fadeInUp {
from {
transform: translate3d(0,40px,0)
}
to {
transform: translate3d(0,0,0);
opacity: 1
}
}
像下面的片段一样尝试,使用 v-show 并在未显示时删除 class :class="page == 'dashboard-page' ? 'content-fade-up-animation' : ''"
:
var app = new Vue({
el: "#app",
data() {
return {
page: "dashboard-page",
headerTitle: "Dashboard"
};
},
methods: {
productsPageBtn() {
this.page = "products-page";
this.headerTitle = "Products";
},
dashboardPageBtn() {
this.page = "dashboard-page";
this.headerTitle = "Dashboard";
}
}
});
.content-fade-up-animation {
animation-duration: 1s;
animation-fill-mode: both;
-webkit-animation-duration: 1s;
-webkit-animation-fill-mode: both;
opacity: 0;
animation-name: fadeInUp;
-webkit-animation-name: fadeInUp;
}
/* Content fade up animation */
@keyframes fadeInUp {
from {
transform: translate3d(0,40px,0)
}
to {
transform: translate3d(0,0,0);
opacity: 1
}
}
@-webkit-keyframes fadeInUp {
from {
transform: translate3d(0,40px,0)
}
to {
transform: translate3d(0,0,0);
opacity: 1
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<button @click="dashboardPageBtn">Dashboard</button>
<button @click="productsPageBtn">Products</button>
<div v-show="page == 'dashboard-page'" id="dashboard" :class="page == 'dashboard-page' ? 'content-fade-up-animation' : ''">
<h1 class="top-menu-header-title">Dashboard</h1>
</div>
<div v-show="page == 'products-page'" id="product" :class="page == 'products-page' && 'content-fade-up-animation'">
<div class="mt-10 text-4xl mb-10">
<h1 class="top-menu-header-title">Test</h1>
</div>
</div>
</div>