动手实现H5仿原生app前进后退切换效果

动手实现H5仿原生app前进后退切换效果

前言

最近在优化H5页面,我注意到当开发完成的移动端H5页面嵌入到微信小程序或者原生app中时,当触发页面路由切换会与原生app看上去有点格格不入,因为H5页面<router-view>切换路由时是直接替换了原来页面的内容,在视觉效果上看到的是页面的跳转变化都是在同一个页面上,并没有一级二级页面这种视觉差,因此,参考了原生app中的页面切换效果,我打算将已经成熟的H5项目改造一下,优化视觉上的体验效果。
话不多说,先上效果:
在这里插入图片描述

实现思路

在观察原生APP页面切换时不难发现,其实就两个效果,在路由前进时旧的页面需要从中心往左平移直至隐藏,新的页面则需要右边隐藏状态平移到屏幕中央。在页面返回到时候做相反的操作,要返回的页面从左边隐藏平移到屏幕上,原来的页面平移到右边隐藏。由于项目用的是Vue3,我就用vue作为代码演示。

transition 组件

由于vue提供了一个过渡动画的标签transition,那么在这里我就不重复造轮子了,直接用这个标签来实现过度效果。简单介绍下transition这个标签。
1、必需只能包含一个根元素
2、主要是针对于v-if、v-show或路由动态组件,增加动态过渡效果
3、可根据name自定义过渡动画效果
4、自定义动画类名 -enter、-leave、-enter-active、-leave-active、-enter-to、-enter-to

具体使用方法可到官网查看,这就不过多介绍了。

开始实现

App.vue 改造

为了实现全局的页面切换效果,所以直接在App.vue中将router-view包裹,实现代码如下:

  <router-view v-slot="{ Component }"><transition :name="transName"><keep-alive :include="includeRoute"><component :is="Component" :key="$route.name" v-if="$route.meta.keepAlive" /></keep-alive></transition><transition :name="transName + 'normal'"><component :is="Component" :key="$route.name" v-if="!$route.meta.keepAlive" /></transition></router-view>

注意,这里使用两个transition是需要考虑如果有部分页面是keep-alive,有部分不是的情况,需要赋予不同的name值

判断当前路由前进还是后退

1、首先在定义路由时需要增加路由层级,用于后续判断页面是前进还是后退。代码如下:

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';const routes: Array<RouteRecordRaw> = [{path: '/',name: 'app',redirect:'/home',},{path: '/home',name: 'home',component: () => import(/* webpackChunkName: "home" */ './home.vue'),meta: {title: '首页',keepAlive: true,deepth: -1}},{path: '/page1',name: 'page1',component: () => import(/* webpackChunkName: "page1" */ './page1.vue'),meta: {title: 'page1',keepAlive: true,deepth: 1}},{path: '/page2',name: 'page2',component: () => import(/* webpackChunkName: "page2" */ './page2.vue'),meta: {title: 'page2',keepAlive: false,deepth: 2}},];const router = createRouter({history: createWebHistory('/'),routes
});export default router;

2、根据路由切换,判断页面的前进后退状态,动态改变transition的name,用来实现不同的过渡效果

// 监听当前路由的变化
watch(() => router.currentRoute.value,(newValue: any, oldValue: any) => {if (newValue?.meta?.deepth && oldValue?.meta?.deepth) {if (oldValue.meta.deepth <= newValue.meta.deepth) {transName.value = 'push';} else {transName.value = 'back';}}},{ immediate: true }
);

3、css部分实现,主要定义页面前进后退时的动画效果

.push-enter-active {animation-name: push-in;animation-duration: 0.5s;
}.push-leave-active {animation-name: push-out;animation-duration: 0.5s;
}.pushnormal-enter-active {animation-name: push-in;animation-duration: 0.5s;
}.pushnormal-leave-active {animation-name: push-out;animation-duration: 0.5s;
}@keyframes push-in {0% {transform: translate(100%, 0);}100% {transform: translate(0, 0);}
}@keyframes push-out {0% {transform: translate(0, 0);}100% {transform: translate(-100%, 0);}
}.back-enter-active {animation-name: back-in;animation-duration: 0.5s;
}.back-leave-active {animation-name: back-out;animation-duration: 0.5s;
}.backnormal-enter-active {animation-name: push-in;animation-duration: 0.5s;
}.backnormal-leave-active {animation-name: back-out;animation-duration: 0.5s;
}@keyframes back-in {0% {width: 100%;transform: translate(-100%, 0);}100% {width: 100%;transform: translate(0, 0);}
}@keyframes back-out {0% {width: 100%;transform: translate(0, 0);}100% {width: 100%;transform: translate(100%, 0);}
}

注意

为了实现两个页面能左右切换,所以在定义每个页面样式时需要使用fixed布局

#app>div {position: fixed;top: 0;left: 0;width: 100%;height: 100%;
}

写在最后

在前端开发中通过实现一些动态效果,在用户使用体验上都能得到较大的改善,作为前端页面优化的一部分,有更多的动画效果值得我们花时间去研究。欢迎点赞收藏,关注我,了解更多的前端知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/139297.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【视觉大模型SAM系列】PerSAM:Personalize Segment Anything Model with One Shot

【版权声明】 本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 更多算法总结请关注我的博客&#xff1a;https://blog.csdn.net/suiyingy&#xff0c;或”乐乐感知学堂“公众号。 本文章来自于专栏《大模型》的系列文章&#xff0c;专…

软件外包开发文档

编写软件开发文档是项目开发过程中的关键步骤&#xff0c;它有助于组织、记录和分享项目的信息和进展。以下是编写软件开发文档的一般步骤和建议&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.文档…

千兆光模块存在哪些局限性

千兆光模块是目前使用最广泛的光模块之一&#xff0c;可以实现1Gbps的传输速度。随着科技的进步和应用场景的多样性&#xff0c;千兆光模块也因其固有的局限性而面临越来越多的挑战。以下是千兆光模块的局限性和如何克服这些局限性的讨论&#xff1a; 千兆光模块可以实现最大…

7.继承与多态 对象村的优质生活

7.1 民法亲属篇&#xff1a;继承&#xff08;inheritance&#xff09; 了解继承 在设计继承时&#xff0c;你会把共同的程序代码放在某个类中&#xff0c;然后告诉其他的类说此类是它们的父类。当某个类继承另一个类的时候&#xff0c;也就是子类继承自父类。以Java的方式说&…

【JVM面试题】JVM分代年龄为何是15次?能设置为16吗?

系列文章目录 【JVM系列】第一章 运行时数据区 【JVM面试题】第二章 从JDK7 到 JDK8, JVM为啥用元空间替换永久代&#xff1f; 【JVM面试题】第三章 JVM分代年龄为何是15次&#xff1f;能设置为16吗&#xff1f; 大家好&#xff0c;我是青花。拥有多项发明专利&#xff08;都是…

【TES720D】青翼科技基于复旦微的FMQL20S400全国产化ARM核心模块

板卡概述 TES720D是一款基于上海复旦微电子FMQL20S400的全国产化核心模块。该核心模块将复旦微的FMQL20S400&#xff08;兼容FMQL10S400&#xff09;的最小系统集成在了一个50*70mm的核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&#xff0c;特别是用…

CSS的美化(文字、背景) Day02

一、文字控制属性 分为&#xff1a;字体样式属性 、文本样式属性 1.1 CSS字体样式属性 1.color定义元素内文字颜色2.font-size 字号大小3 font-family 字体4 font-weight 字体粗细5.font-style 字体风格6.font 字体综合属性 1.1.1 > 文字颜色 color 属性名: color color …

海量小文件数据传输如何确保安全性

在当今的信息化社会&#xff0c;企业需要处理和传输的文件越来越多&#xff0c;越来越大。其中&#xff0c;海量小文件数据是一种特殊的数据类型&#xff0c;它由数亿级别的小文件&#xff08;通常小于1MB&#xff09;组成&#xff0c;它在图片网站、物联网设备、日志分析等场景…

【Eclipse】取消按空格自动补全,以及出现没有src的解决办法

【Eclipse】设置自动提示 教程 根据上方链接&#xff0c;我们已经知道如何设置Eclipse的自动补全功能了&#xff0c;但是有时候敲变量名的时候按空格&#xff0c;本意是操作习惯&#xff0c;不需要自动补全&#xff0c;但是它却给我们自动补全了&#xff0c;这就造成了困扰&…

Unity游戏开发中ngui和ugui区别与优缺点详解

Unity3D是一款跨平台的游戏开发引擎&#xff0c;它支持多种平台&#xff0c;包括PC、移动设备和主机。在Unity3D中&#xff0c;UI系统是游戏开发中非常重要的一部分&#xff0c;它负责游戏中的用户界面的显示和交互。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;…

全国400电话办理,简单步骤帮您申请成功

导语&#xff1a;随着企业业务的扩展和市场需求的增加&#xff0c;越来越多的企业开始关注全国400电话的申请。本文将为您介绍全国400电话的办理步骤&#xff0c;帮助您顺利完成申请过程。 正文&#xff1a; 一、了解全国400电话 全国400电话是一种虚拟电话号码&#xff0c;…

百度发布全新 AI 互动式搜索:百度简单搜索

本心、输入输出、结果 文章目录 百度发布全新 AI 互动式搜索&#xff1a;百度简单搜索前言主要能力 相关资料能力介绍 百度搜索升级发文告用户如何获取百度简单搜索百度简单搜索的定位百度简单搜索在 APP 上面的体验讨论和点评我们关注的几个问题 弘扬爱国精神 百度发布全新 AI…