feat: 页面切换动画

This commit is contained in:
ZhuRui
2026-07-28 15:24:42 +08:00
parent a7399c997d
commit 49dbde11e0
3 changed files with 52 additions and 11 deletions
+29
View File
@@ -114,3 +114,32 @@ a {
.ant-tag { .ant-tag {
margin-right: 0; margin-right: 0;
} }
// ===== 页面切换动画(KeepAlive + RouterView =====
.page-fade-slide-enter-active,
.page-fade-slide-leave-active {
width: 100%;
height: 100%;
min-height: 0;
transition:
opacity 0.22s cubic-bezier(0.4, 0, 0.2, 1),
transform 0.22s cubic-bezier(0.4, 0, 0.2, 1);
}
.page-fade-slide-enter-from {
opacity: 0;
transform: translateX(12px);
}
.page-fade-slide-leave-to {
opacity: 0;
transform: translateX(-12px);
}
.page-fade-slide-leave-active {
position: absolute;
inset: 0;
width: 100%;
overflow: hidden;
}
+9
View File
@@ -103,6 +103,15 @@
overflow: hidden; overflow: hidden;
} }
.pageView {
position: relative;
flex: 1;
min-height: 0;
overflow: hidden;
display: flex;
flex-direction: column;
}
.main { .main {
flex: 1; flex: 1;
min-height: 0; min-height: 0;
+7 -4
View File
@@ -1,6 +1,5 @@
import { computed, defineComponent, h, ref } from 'vue'; import { computed, defineComponent, h, ref, Transition, KeepAlive } from 'vue';
import type { CSSProperties } from 'vue'; import type { CSSProperties } from 'vue';
import { KeepAlive } from 'vue';
import { useRouter, useRoute, RouterView } from 'vue-router'; import { useRouter, useRoute, RouterView } from 'vue-router';
import { Layout, Menu, Modal, Breadcrumb, Dropdown, message } from 'ant-design-vue'; import { Layout, Menu, Modal, Breadcrumb, Dropdown, message } from 'ant-design-vue';
import type { MenuProps } from 'ant-design-vue'; import type { MenuProps } from 'ant-design-vue';
@@ -263,15 +262,19 @@ export default defineComponent({
include 是组件 name 列表,所以页面组件需要在 defineComponent 中显式给出 name include 是组件 name 列表,所以页面组件需要在 defineComponent 中显式给出 name
*/} */}
<Content class={styles.content}> <Content class={styles.content}>
<div class={styles.pageView}>
<RouterView <RouterView
v-slots={{ v-slots={{
default: ({ Component }: any) => ( default: ({ Component, route }: any) => (
<KeepAlive include={cachedViews.value}> <KeepAlive include={cachedViews.value}>
<Component /> <Transition name="page-fade-slide" mode="out-in">
{Component ? h(Component, { key: route.path }) : null}
</Transition>
</KeepAlive> </KeepAlive>
), ),
}} }}
/> />
</div>
</Content> </Content>
<Footer style={footerStyle}> ©{new Date().getFullYear()}</Footer> <Footer style={footerStyle}> ©{new Date().getFullYear()}</Footer>