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

news2025/1/16 8:55:41

动手实现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.coloradmin.cn/o/1104592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3点击表格某个单元格文本就切换成输入框,其他单元格不变化

<el-table :data"data.tableData" height"60vh" border scrollbar-aways-on><el-table-column label"序号" type"index" width"80" fixed /><el-table-column label"操作" width"120" f…

Linux知识点 -- 高级IO(二)

Linux知识点 – 高级IO&#xff08;二&#xff09; 文章目录 Linux知识点 -- 高级IO&#xff08;二&#xff09;一、IO多路转接 -- poll1.poll接口2.poll实现3.poll优缺点 二、IO多路转接 -- epoll1.epoll接口2.epoll的工作原理3.epoll服务器实现4.epoll的优点5.epoll的工作模式…

在线加解密(支持SM2、SM3、SM4)

https://the-x.cn/zh-cn/cryptography/Sm4.aspx

SAS国际认证考试报名流程

文章目录 注册SAS账号登录SAS账号预约考试考试注意事项 注册SAS账号 SAS考试报名入口&#xff1a;https://home.pearsonvue.com/sas 注册SAS账号 邮箱验证 点击上述邮件发送来的链接&#xff0c;跳转到如下界面。输入密码即可。 完成注册。选择login。 登录SAS账号 输入Email …

MongoDB 未授权访问漏洞

简介 MongoDB是一个基于分布式文件存储的数据库&#xff0c;是一个介于关系数据库和非关系数据库之间的产品&#xff0c;它的特点是高性能、易部署、易使用&#xff0c;存储数据非常方便&#xff0c;默认情况下是没有认证的这就导致不熟悉它的研发人员部署后没有做访问控制导致…

NAND存储器转储分析 - 使用ECC修复位错误与UBI镜像固件分析

一、 简介 这篇研究论文将通过黑客的视角&#xff0c;详细阐述如何操作 NAND dump 以及如何获取 dump 文件中的所有文件。每一步骤以及所使用的方法均会细致解析&#xff0c;并配以实例说明。本文主要关注的是物理 NAND dump&#xff0c;这是从通用编程器中提取出的 dump 文件…

重磅!中科院1区TOP被踢?共7本被剔除!10月SCIE/SSCI期刊目录更新!

期刊动态&#xff1a;2023年10月SCI、SSCI期刊目录更新 2023年10月17日&#xff0c;科睿唯安更新了WOS期刊目录&#xff0c;继上次9月WOS期刊目录剔除7本SCIE&SSCI期刊之后&#xff0c;此次10月更新又有7本期刊发生变动&#xff0c;其中有5本SCIE期刊&#xff0c;1本SSCI期…

软键盘怎么打开?3招快速打开!

“我的键盘好像出现了一些问题&#xff0c;现在没法输入文字。听说电脑上有个工具叫软键盘&#xff0c;我想暂时先用这个来代替键盘。有什么方法可以把它打开的吗&#xff1f;” 软键盘是一个虚拟键盘&#xff0c;它不是物理键盘&#xff0c;而是出现在计算机屏幕上的可视化输入…

java的注解接口Target

java.lang.annotation.Target是Java中预定义的一个注解接口&#xff0c;用在注解接口的声明上&#xff0c;指明注解接口适用的上下文。 Target注解接口只有一个元素value&#xff0c;该元素的类型是java.lang.annotation.ElementType的数组&#xff0c;其中ElementType是一个枚…

vue使用pdf 导出当前页面,(jspdf, html2canvas )

需要安装两个插件 npm install html2canvas jspdfyarn add html2canvas jspdf<div class"app-container" id"pdfPage">我是内容 </div><el-button size"mini" click"onExportPdf">导出数据</el-button>onexp…

SAP MM物料移动取总账科目逻辑,debug 标准bapi BAPI_GOODSMVT_CREATE

debug 标准bapi BAPI_GOODSMVT_CREATE perform mb_create_goods_movement function MB_CREATE_GOODS_MOVEMENT function MB_CREATE_MATERIAL_DOCUMENT perform buchen_aufbereiten perform F-SEGMENTE_GENERIEREN perform f-segmente_erstellen perform f-segmente_erzeugen p…

C语言参悟-函数

C语言参悟-函数 一、概述二、函数1. 函数的构成2. 函数参数3. 函数名4. 函数返回值5. 函数的工作1. 程序栈2、栈帧的组织 三、函数递归四、函数指针 一、概述 首先&#xff0c;什么是函数&#xff1f;函数&#xff08;function&#xff09;是完成特定任务的独立程序代码单元。…

五金仓库管理员的工作内容

近几年来&#xff0c;很多企业会发现&#xff0c;经营增长的压力越来越大&#xff0c;主要原因包括外部局势的巨变&#xff0c;市场捉摸不定&#xff1b;企业之间竞争越来越剧烈&#xff0c;企业的利润空间不断被压缩&#xff1b;员工越来越个性化、多元化&#xff0c;管理困难…

文档外发控制与安全:实现高效协作与数据安全的关键

随着企业数据量的不断增加&#xff0c;文档外发成为了一个不可避免的需求。然而&#xff0c;很多企业在文档外发过程中存在着很多问题&#xff0c;如数据泄露、信息误用等。因此&#xff0c;如何保证文档外发的安全性和高效性成为了企业亟待解决的问题。飞驰云联Ftrans的文件收…

软件工程与计算(十四)详细设计中面向对象方法下的模块化

一.面向对象中的模块 1.类 模块化是消除软件复杂度的一个重要方法&#xff0c;每个代码片段相互独立&#xff0c;这样能够提高可维护性。在面向对象方法中&#xff0c;代码片段最重要的类&#xff0c;整个类的所有代码联合起来构成独立的代码片段。 模块化希望代码片段由两部…

以烟草行业为例,聊聊如何基于 PLC + OPC + TDengine,快速搭建工业生产监测系统

在烟草工业场景里&#xff0c;多数设备的自动控制都是通过 PLC 可编程逻辑控制器来实现的&#xff0c;PLC 再将采集的数据汇聚至 OPC 服务器。传统的 PI System、实时数据库、组态软件等与 OPC 相连&#xff0c;提供分析、可视化、报警等功能&#xff0c;这类系统存在一些问题&…

Tortoise SVN 察看本地缓存密码

1、打开设置&#xff08;Settings&#xff09; 2、查看保存的数据 3、打开鉴权数据 4、查看密码 CTRLSHIFT双击表格&#xff0c;就会出现一列密码列 &#xff08;我的是Mac PD虚拟Win11&#xff0c;CTRLSHIFTOPTION双击表格&#xff09; 原文见这里&#xff1a; Recover SVN …

解密新一代商业智能软件百度GBI,看看它有多牛!

10月17日&#xff0c;2023百度世界大会开幕了&#xff0c;大家都关注了吗&#xff1f;本次大会上发布了关于商业智能&#xff08;Business Intelligence&#xff09;的工具百度GBI。那么首先给大家列出2022年全球商业智能(BI)和分析平台市场的相关数据&#xff1a; 总规模&…

HTML 常用标签及练习

常用标签 <head>中的标签 概述 head中的内容不显示到页面上 标签说明<title>定义网页的标题<meta>定义网页的基本信息&#xff08;供搜索引擎&#xff09;<style>定义CSS样式<link>链接外部CSS文件或脚本文件<script>定义脚本语言<…

Docker逃逸---CVE-2019-5736浅析

一、产生原因 Docker执行命令时&#xff0c;先向镜像管理的containerd发送gRPC请求&#xff0c;containerd收到请求后&#xff0c;再发送给具体的容器管理containerd-shim&#xff0c;shim根据OCI协议将命令发送给runc执行&#xff0c;所以实际上执行命令的是runc 漏洞大概意思…