当前位置: 首页 > news >正文

动手实现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%;
}

写在最后

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

相关文章:

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

动手实现H5仿原生app前进后退切换效果 前言 最近在优化H5页面&#xff0c;我注意到当开发完成的移动端H5页面嵌入到微信小程序或者原生app中时&#xff0c;当触发页面路由切换会与原生app看上去有点格格不入&#xff0c;因为H5页面<router-view>切换路由时是直接替换了…...

【标准化封装 SOT系列 】 D SOT-323 SOT-363

〇、关键词 SC70 。 一、D部分 SOT-323 SOT-363 这个应该叫SC-70可能更合适&#xff0c;典型特征 pin 间距 0.65mm ; body size 2.0mm1.25mm 这一节很像SOT-23&#xff0c;即A部分&#xff0c;因此也是最容易被混淆的。 二、SC70-3 / -5/ -6 鉴于此&#xff0c;封装最好给…...

软件测试肖sir__python之ui自动化实战和讲解03

python之ui自动化实战和讲解...

Kafka序列化反序列化解析、kafka schema

Kafka序列化反序列化解析、kafka schema。 kafka有自己的rpc协议,即nio bytebuf中的数据格式,详见之前的kafka相关介绍的文章。这里我们来看一下大家常用,有时又疑惑的序列化反序列化,对应rpc协议中的records,kafka叫Serdes,实际上也是字面上的意思serialize and deseri…...

谷歌浏览器中如何审查隐藏的元素

谷歌浏览器中如何审查隐藏的元素 方法1&#xff1a; 打开控制台 先鼠标移上先显示出来 快捷键按 CtrlShiftC&#xff0c;只能简单查看宽高&#xff0c;做不到复杂的的样式查询 方法2&#xff1a; 在控制台输入一个以下代码, 并保留光标在控制台闪烁&#xff0c;鼠标移上去显示…...

【vue】使用less报错:显示this.getOptions is not a function

在vue-cli中使用 lang“less” 时报错&#xff1a; Module build failed: TypeError: this.getOptions is not a function at Object.lessLoader 原因&#xff1a;版本过高所致&#xff0c;所用版本为 解决&#xff1a;降低版本&#xff1a;npm install less-loader4.1.0 --s…...

代码随想录第48天 | ● 739. 每日温度 ● 496.下一个更大元素 I

739. 每日温度 /*** param {number[]} temperatures* return {number[]}*/ var dailyTemperatures function(temperatures) {const ntemperatures.lengthconst resArray(n).fill(0)const stack[] // 递增栈&#xff1a;用于存储元素右面第一个比他大的元素下标stack.push(0…...

团购页面.

<!DOCTYPE html> <html><head><title>团购</title><meta http-equiv"content-type" content"text/html; charsetutf-8"/><meta name"apple-mobile-web-app-capable" content"yes"/><lin…...

linux-系统日志/var/log/简介

日志在排查文件的时候至关重要&#xff0c;在Linux上一般跟系统相关的日志默认都会放到/var/log下面。 1、/var/log/boot.log 一般包含系统启动时的日志&#xff0c;包括自启动的服务。 2、/var/log/btmp 记录所有失败登录信息。非文本文件&#xff0c;可以使用last -f /va…...

2022最新版-李宏毅机器学习深度学习课程-P26RNN-2

一、RNN网络结构 与时间有关的反向传播&#xff08;每次不同&#xff09; 损失函数 实验其实不容易跑&#xff0c;因为他的损失函数曲线幅度很大 画出来差不多是这个样子。突然一下升高是因为从右到左碰到陡峭的地方梯度一下变大了&#xff0c;所以弹回去了。 原作者在训练时…...

docker 配置mongoDB

## 拉取镜像 docker pull mongo## 设置默认账号密码 test:test 默认数据 test docker run -d --name mongo-container -e MONGO_INITDB_ROOT_USERNAMEtest -e MONGO_INITDB_ROOT_PASSWORDtest -e MONGO_INITDB_DATABASEtest -p 27017:27017 mongo...

基于PHP的宠物爱好者交流平台管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...

盘点数据采集中14种常见的反爬策略

引言 随着互联网的飞速发展, 爬虫技术不断演进, 为数据获取和信息处理提供了强大支持。然而, 滥用爬虫和恶意爬取数据的行为日益增多, 引发了反爬虫技术的兴起。在这场看似永无止境的 技术较量 中, 爬虫与反爬虫技术相互博弈、角力。本文将简单过下目前已知的几种反爬策略, 旨…...

直播预告:防御升级-SMC2精准对抗账号劫持和漏洞威胁

当邮箱账号出现疑似被盗风险和遭受外部攻击时&#xff0c;企业管理员需要尽快发现或排除潜在威胁&#xff0c;并采取处置措施&#xff0c;阻止威胁扩大。 那么面对账号失陷风险&#xff0c;企业管理员如何做到账号异常行为的精准检测和即时处置&#xff1f;当账号遭受外部攻击时…...

班主任好物 班级查询系统来啦

哈喽各位&#xff0c;作为一名教育博主&#xff0c;今天我要给大家分享一个班主任的好物——班级查询系统&#xff01;这个系统可真是太方便了呢&#xff0c;那么&#xff0c;这个神秘的班级查询系统到底是什么呢&#xff1f;别急&#xff0c;听我慢慢道来。 班级查询系统&…...

【性能测试】使用JMeter对code论坛进行压力测试

1.项目介绍 项目简介 code 论坛是一个技术交流社区。主要功能有发布帖子&#xff0c;查看帖子&#xff0c;评价帖子&#xff0c;删除帖子&#xff0c;点赞帖子&#xff0c;站内信&#xff0c;个人中心&#xff0c;修改个人信息等。是一个基于 Spring 的前后端分离项目。 项目链…...

Windows 事件日志监控

Windows 事件日志是记录 Microsoft 系统上发生的所有活动的文件&#xff0c;在 Windows 环境中&#xff0c;将记录系统上托管的系统、安全性和应用程序的事件&#xff0c;事件日志提供包含有关事件的详细信息&#xff0c;包括日期、时间、事件 ID、源、事件类型和发起它的用户。…...

pytorch里常用操作(持续更新)

对不起我脑子不太记事儿每次变换都得想想想所以干脆汇总一下算了&#xff0c;当然也有一些不是torch包里面的但是没有关系hhh 官方文档里有一堆不太常用的&#xff0c;这里整理的都是自己比较常用的 张量操作 torch.tensor&#xff1a;从Python列表或NumPy数组创建张量 torc…...

地铁大数据客流分析系统 设计与实现 计算机竞赛

文章目录 1 前言1.1 实现目的 2 数据集2.2 数据集概况2.3 数据字段 3 实现效果3.1 地铁数据整体概况3.2 平均指标3.3 地铁2018年9月开通运营的线路3.4 客流量相关统计3.4.1 线路客流量排行3.4.2 站点客流量排行3.4.3 入站客流排行3.4.4 整体客流随时间变化趋势3.4.5 不同线路客…...

00后都到适婚年龄啦!90后的还在低调什么?

当你的想法还停留在00后读书时代&#xff0c;其实大部分00后早已步入工作社会&#xff0c;还有不少人已经步入婚姻。广东金媒人婚恋&#xff0c;无论是广州、深圳、东莞、佛山举办活动的参与者中&#xff0c;00后的男生女生都占了不少。 广州深圳这样一二线城市的单身年轻人群&…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...