是否有小伙伴在使用tab的时候想进行滑动切换Tab?

并且有滑动左出左进,右出右进的效果 ,本文将讲解怎么在Blazor中去通过滑动切换Tab

本文中的UI组件使用的是MASA Blazor,您也可以是其他的UI框架,这个并不影响实际的运行效果,本文案例是兼容PC和Android的,演示效果是android中执行的,在PC中执行效果依然有效(亲测)

首先安装MASA Blazor 根据 MASA Blazor安装MASA Blazor

准备工作

  1. 创建 AppBar.razor文件

  2. 修改MainLayout.razor文件代码

@inherits LayoutComponentBase

<MApp>
<AppBar>
<div class="body">
@Body
</div>
</AppBar>
</MApp> <style>
.body {
/*设置内容高度 需要减去导航栏的高度*/
height: calc(100vh - 48px);
max-height: calc(100vh - 48px);
}
</style>
  1. 创建 AppBar.razor.css 文件并且添加相关代码 ,以下代码是为了实现切换的时候有一个出入效果,具体代码案例来自Animista - On-Demand CSS Animations Library


    /*左边滑动出*/
    .slide-out-left {
    -webkit-animation: slide-out-left 0.5s;
    animation: slide-out-left 0.5s;
    } /*右边滑动出*/
    .slide-out-right {
    -webkit-animation: slide-out-right 0.5s;
    animation: slide-out-right 0.5s;
    } /*右边滑动进*/
    .slide-in-right {
    -webkit-animation: slide-in-right 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
    animation: slide-in-right 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
    } /*左边滑动进*/
    .slide-in-left {
    -webkit-animation: slide-in-left 0.5s;
    animation: slide-in-left 0.5s;
    } @-webkit-keyframes slide-out-left {
    0% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
    opacity: 1;
    } 100% {
    -webkit-transform: translateX(-1000px);
    transform: translateX(-1000px);
    opacity: 0;
    }
    } @keyframes slide-out-left {
    0% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
    opacity: 1;
    } 100% {
    -webkit-transform: translateX(-1000px);
    transform: translateX(-1000px);
    opacity: 0;
    }
    } @-webkit-keyframes slide-out-right {
    0% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
    opacity: 1;
    } 100% {
    -webkit-transform: translateX(1000px);
    transform: translateX(1000px);
    opacity: 0;
    }
    } @keyframes slide-out-right {
    0% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
    opacity: 1;
    } 100% {
    -webkit-transform: translateX(1000px);
    transform: translateX(1000px);
    opacity: 0;
    }
    } @-webkit-keyframes slide-in-left {
    0% {
    -webkit-transform: translateX(-1000px);
    transform: translateX(-1000px);
    opacity: 0;
    } 100% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
    opacity: 1;
    }
    } @keyframes slide-in-left {
    0% {
    -webkit-transform: translateX(-1000px);
    transform: translateX(-1000px);
    opacity: 0;
    } 100% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
    opacity: 1;
    }
    }
    @-webkit-keyframes slide-in-right {
    0% {
    -webkit-transform: translateX(1000px);
    transform: translateX(1000px);
    opacity: 0;
    } 100% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
    opacity: 1;
    }
    } @keyframes slide-in-right {
    0% {
    -webkit-transform: translateX(1000px);
    transform: translateX(1000px);
    opacity: 0;
    } 100% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
    opacity: 1;
    }
    }
  2. 创建AppBar的模型用于动态添加导航栏, 创建AppBarDto.cs文件并添加相关代码

public class AppBarDto
{
public string Key { get; set; } /// <summary>
/// 标题
/// </summary>
public string Title { get; init; } /// <summary>
/// 图标
/// </summary>
public string? Icon { get; set; } /// <summary>
/// 路由
/// </summary>
public string Href { get; init; } public AppBarDto(string title, string href, string? icon = null)
{
Title = title;
Icon = icon;
Href = href;
Key = Guid.NewGuid().ToString("N");
}
}
  1. 添加相关页面,在Pages文件夹下,分别创建Index.razor,Feature.razor,Friend.razor,PersonalCenter.razor

文件相关代码:

Index.razor

@page "/"
<h3>Index</h3>

Feature.razor

@page "/feature"
<h3>Feature</h3>

Friend.razor

@page "/friend"
<h3>Friend</h3>

PersonalCenter.razor

@page "/personal-center"
<h3>PersonalCenter</h3>
  1. 修改AppBar.razor代码


<div class="@Class" @ontouchstart="TouchStart" @ontouchend="TouchEnd" @onmousedown="Mousedown" @onmouseup="Mouseup" style="height: 100%">
@ChildContent
</div> @*这里也可以是其他组件的Tab,其实只是记录当前的导航的数据*@
<MTabs Centered
BackgroundColor="indigo"
ShowArrows="false"
Value="selectModel.Key"
Dark>
@foreach (var i in AppBars)
{
<MTab Value="i.Key" OnClick="()=>GoHref(i)">
@if (!string.IsNullOrEmpty(i.Icon))
{
<MIcon Dark>@i.Icon</MIcon>
}
@i.Title
</MTab>
}
</MTabs>
  1. 创建AppBar.razor.cs 添加以下代码

public partial class AppBar
{
#region Inject [Inject]
public required NavigationManager NavigationManager { get; set; } #endregion private readonly List<AppBarDto> AppBars = new(); [Parameter]
public RenderFragment ChildContent { get; set; } private AppBarDto selectModel; private string Class { get; set; } protected override void OnInitialized()
{
AppBars.Add(new AppBarDto("首页", "/", "home"));
AppBars.Add(new AppBarDto("好友", "/personal-center", "mdi-account-group-outline"));
AppBars.Add(new AppBarDto("功能", "/feature", "mdi-wrench"));
AppBars.Add(new AppBarDto("个人中心", "/personal-center", "mdi-badge-account-alert")); // 默认选择的导航标签
selectModel = AppBars[0]; base.OnInitialized();
} /// <summary>
/// 导航栏跳转
/// </summary>
/// <param name="appBar"></param>
private void GoHref(AppBarDto appBar)
{
// 防止重复点击
if(appBar == selectModel)
{
return;
} // 当点击导航的索引大于现在导航时启动滑动效果
if(AppBars.IndexOf(appBar) > AppBars.IndexOf(selectModel))
{
Class = "slide-out-left";
Task.Run(async () =>
{
// 由于特效时间为0.5s 这里是等待特效完成
await Task.Delay(450);
NavigationManager.NavigateTo(selectModel.Href);
Class = "slide-in-right";
_ = InvokeAsync(StateHasChanged);
});
}
// 当点击导航的索引小于现在导航时启动滑动效果
else if (AppBars.IndexOf(appBar) < AppBars.IndexOf(selectModel))
{
Class = "slide-out-right";
Task.Run(async () =>
{
// 由于特效时间为0.5s 这里是等待特效完成
await Task.Delay(450);
NavigationManager.NavigateTo(selectModel.Href);
Class = "slide-in-left";
_ = InvokeAsync(StateHasChanged);
});
}
selectModel = appBar;
NavigationManager.NavigateTo(appBar.Href);
} /// <summary>
/// 开始X坐标
/// </summary>
private double _startX; #region 移动端滑动处理 /// <summary>
/// 记录开始坐标
/// </summary>
/// <param name="args"></param>
private void TouchStart(TouchEventArgs args)
{
var touch = args.ChangedTouches[0];
_startX = touch.ScreenX;
} private void TouchEnd(TouchEventArgs args)
{
var touch = args.ChangedTouches[0];
Switchover((decimal)touch.ScreenX);
} #endregion #region PC滑动处理 /// <summary>
/// 记录开始坐标
/// </summary>
/// <param name="args"></param>
private void Mousedown(MouseEventArgs args)
{
_startX = args.ScreenX;
} private void Mouseup(MouseEventArgs args)
{
Switchover((decimal)args.ScreenX);
} #endregion private void Switchover(decimal screenX)
{
var index = AppBars.IndexOf(selectModel);
// 限制过度滑动
if (index == AppBars.Count || index > AppBars.Count)
{
return;
} // 设置滑动最大位限制,达到这个限制才滑动生效
var size = 200; // 需要滑动200才切换 如果开始坐标x大于 当前结束的x坐标往右边切换tab
if ((decimal)_startX - size > screenX)
{
// 如果右边往左边滑动 当前索引是当前最大数量的话不需要切换
if (index == AppBars.Count - 1)
{
return;
}
selectModel = AppBars[index + 1];
Class = "slide-out-left"; Task.Run(async () =>
{
// 由于特效时间为0.5s 这里是等待特效完成
await Task.Delay(450);
NavigationManager.NavigateTo(selectModel.Href);
Class = "slide-in-right";
_ = InvokeAsync(StateHasChanged);
});
}
else if ((decimal)_startX + size < screenX)
{
// 如果左边往右边滑动 当前索引是0的话不需要切换
if (index == 0)
{
return;
}
selectModel = AppBars[index - 1];
Class = "slide-out-right";
Task.Run(async () =>
{
// 由于特效时间为0.5s 这里是等待特效完成
await Task.Delay(450);
NavigationManager.NavigateTo(selectModel.Href);
Class = "slide-in-left";
_ = InvokeAsync(StateHasChanged);
});
}
}
}

运行效果:

一个热爱学习的token

qq交流群:737776595

微信交流群:

Blazor如何实现类似于微信的Tab切换?的更多相关文章

  1. Android Studio精彩案例(二)《仿微信动态点击底部tab切换Fragment》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 现在很多的App要么顶部带有tab,要么就底部带有tab.用户通过点击tab从而切换不同的页面(大部分情况时去切换fragment). ...

  2. 微信小程序写tab切换

    微信小程序之tab切换效果,如图: 最近在学习微信小程序并把之前的公司app搬到小程序上,挑一些实现效果记录一下(主要是官方文档里没说的,毕竟官方文档只是介绍功能) .wxml代码: <view ...

  3. 解决微信小程序的wx-charts插件tab切换时的显示会出现位置移动问题-tab切换时,图表显示错乱-实现滑动tab

    解决Echarts在微信小程序tab切换时的显示会出现位置移动问题 tab切换时,图表显示错乱 <canvas class="kcanvas" canvas-id=" ...

  4. 微信小程序基于swiper组件的tab切换

    代码地址如下:http://www.demodashi.com/demo/14010.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...

  5. 微信小程序--问题汇总及详解之tab切换

    设置背景颜色就直接在page里设置    page {background-color: rgb(242, 242, 242);} tab切换: navigator 页面链接 传参的格式为url=&q ...

  6. 微信小程序实现滑动tab切换和点击tab切换并显示相应的数据(附源代码)

    这里主要用到了swiper组件和三目运算,直接上代码, 样式只有三个class,简单粗暴,懒的小伙伴们可以直接拿来用,喜欢的点个支持 <view> <view class=" ...

  7. 【原】react做tab切换的几种方式

    最近搞一个pc端的活动,搞了一个多月,甚烦,因为相比于pc端,更喜欢移动端多一点.因为移动端又能搞我的react了. 今天主要总结一下react当中tab切换的几种方式,因为tab切换基本上都会用到. ...

  8. 关于scrollintoview()真的是有意思极了,结合普通tab切换一起看看

    scrollIntoView(alignWithTop) 是html5新特性中的一个元素,他主要是指滚动浏览器窗口或容器元素,以便在当前视窗的可见范围看见当前元素. alignWithTop是true ...

  9. 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  10. jQuery的DOM操作实例(1)——选项卡&&Tab切换

    一.原生JavaScript编写tab切换 二.jQuery编写tab切换 在用jQuery编写选项卡过程中,重要的事搞清楚 .eq() 和 .index() 的使用方法. .eq()是jQuery遍 ...

随机推荐

  1. Apple Low Power DisplayPort(ALP_DP)学习随笔

    edp是PC内置显示接口的主流标准,主用于笔记本电脑或PAD上,普遍用于中大尺寸PANEL. 系统架构如下: apple 的ALP_DP 源于edp 1.4(edp1.4又是源于DP V1.2a版本) ...

  2. 这次彻底读透 Redis

    1. Redis 管道 我们通常使用 Redis 的方式是,发送命令,命令排队,Redis 执行,然后返回结果,这个过程称为Round trip time(简称RTT, 往返时间).但是如果有多条命令 ...

  3. 获取不同机型微信小程序状态栏+导航栏高度

    获取不同机型微信小程序状态栏+导航栏高度 一. 前言 很多时候我们开发微信小程序,都需要先知道状态栏和导航栏的高度,才能去做其他功能 二. 获取微信小程序状态栏高度 用wx.getSystemInfo ...

  4. 九、docker swarm主机编排

    一. 什么是Docker Swarm Swarm 是 Docker 公司推出的用来管理 docker 集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/do ...

  5. Debian安装WPS的方法

    1.防止安装失败,请尽量重启电脑,关闭系统的软件商店,因为商店的权限可能会锁住pkg的配置文件,导致无法安装wps. 2.将原机残废的WPS卸载干净,卸载方法:手动或命令行操作. sudo apt r ...

  6. 聊一聊对一个 C# 商业程序的反反调试

    一:背景 1.讲故事 前段时间有位朋友在微信上找到我,说他对一个商业的 C# 程序用 WinDbg 附加不上去,每次附加之后那个 C# 程序就自动退出了,问一下到底是怎么回事?是不是哪里搞错了,有经验 ...

  7. netty系列之: 在netty中使用 tls 协议请求 DNS 服务器

    目录 简介 支持DoT的DNS服务器 搭建支持DoT的netty客户端 TLS的客户端请求 总结 简介 在前面的文章中我们讲过了如何在netty中构造客户端分别使用tcp和udp协议向DNS服务器请求 ...

  8. Microsoft Office MSDT代码执行漏洞(CVE-2022-30190)漏洞复现

    目录 免责声明: CVE-2022-30190漏洞复现 漏洞概述: 影响版本: 漏洞复现: 使用方法: 利用: 修复建议: 参考: 免责声明: 本文章仅供学习和研究使用,严禁使用该文章内容对互联网其他 ...

  9. 自学 TypeScript 第三天 使用webpack打包 TS 代码

    前言: 大家好啊,昨天介绍了 TS 编译器的配置,但在我们实际开发当中直接使用 TS 编译器去编译代码的情况会有,但没有很多,因为我们在开发大型项目的时候,一般我们都会用到打包工具,也不可能脱离打包工 ...

  10. 记一次 .NET 某自动化集采软件 崩溃分析

    一:背景 1.讲故事 前段时间有位朋友找到我,说他的程序在客户的机器上跑着跑着会出现偶发卡死,然后就崩掉了,但在本地怎么也没复现,dump也抓到了,让我帮忙看下到底怎么回事,其实崩溃类的dump也有简 ...