翼度科技»论坛 编程开发 .net 查看内容

Blazor实现菜单动画

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
想到动画,你可能会去安装Blazor的动画组件BlazorAnimate,然后使用它。本人初学,暂时我也不知道原理,先不用组件,自己实现吧。虽然项目中我用了AntDesignBlazor,但是我忘了使用它的菜单组件,我用的菜单组件还是VS2022自动生成的,后来我把这个菜单改造了一下,支持多级菜单,加了展示收缩箭头,那就在这基础上做吧。
1. 引用jQuery

这里使用jquery的animate方法实现动画
在wwwroot/js目录放一个jquery-1.9.1.js文件,然后在html(或_Layout.cshtml文件)中引入该js
  1. [/code][align=center][/align]
  2. [size=5]2. 为左侧菜单组件NavMenu.razor添加一个js文件:NavMenu.razor.js[/size]
  3. [align=center][/align]
  4. 内容如下:
  5. [code]export function animate(index) { //index是菜单编码 2位数是一级菜单,4位数是二级菜单,以此类推
  6.     let time = 200;
  7.     let content = $(".content" + index);
  8.     let h = content.height() + "px";
  9.     content.css("overflow", "hidden");
  10.     if (index <= 99 || content.hasClass("collapse")) { //index<=99表示一级菜单,一级菜单只有展开动画,没有收缩动画;content.hasClass("collapse")表示当前是收缩状态。
  11.         content.css("height", "0");
  12.         //展开动画
  13.         content.animate({
  14.             height: h
  15.         }, time, "linear", () => {
  16.             content.css("height", "auto");
  17.         });
  18.     } else { //不是一级菜单并且当前是展开状态,将执行收缩动画
  19.         content.css("height", "auto");
  20.         //收缩动画
  21.         content.animate({
  22.             height: 0
  23.         }, time, "linear", () => {
  24.             setTimeout(function () { //延迟执行,否则会导致闪烁
  25.                 content.css("height", "auto");
  26.             }, 100);
  27.         });
  28.         return [time]; //收缩时,需要等待收缩动画展示完成,再隐藏菜单容器div
  29.     }
  30.     return [0];
  31. }
复制代码
3. 在Blazor组件NavMenu.razor文件中引入该js
  1. @inject IJSRuntime _js;
  2. @code {
  3.     IJSObjectReference _module;
  4.     protected override async void OnAfterRender(bool firstRender)
  5.     {
  6.         if (firstRender)
  7.         {
  8.             _module = await _js.InvokeAsync<IJSObjectReference>("import", "./Shared/NavMenu.razor.js");
  9.         }
  10.     }
  11. }
复制代码
4. 调用js方法实现菜单动画
  1. @code{
  2.     ...省略此处的代码
  3.    
  4.     private async Task ToggleMenuClick(int index)
  5.     {
  6.         object[] args = new object[] { index };
  7.         object[] objs = await _module.InvokeAsync<object[]>("animate", args);
  8.         int time = ((JsonElement)objs[0]).GetInt32();
  9.         if (time > 0) { await Task.Delay(time); } //time大于0,表示需要等待收缩动画展示完成,再隐藏菜单容器div
  10.         if (index > 99)
  11.         {
  12.             if (_dict.ContainsKey(index))
  13.             {
  14.                 _dict[index] = !_dict[index]; //记录非一级菜单的展开状态
  15.             }
  16.             else
  17.             {
  18.                 _dict[index] = false; //记录非一级菜单的展开状态
  19.             }
  20.         }
  21.         else
  22.         {
  23.             _index = index; //_index是当前展示的菜单编码
  24.         }
  25.     }
  26.     ...省略此处的代码
  27. }
复制代码
效果图


NavMenu.razor页面完整代码如下
  1. @using System.Text.Json;
  2. @inject IJSRuntime _js;
  3. await ToggleMenuClick(01))">
  4.    
  5.         <a  target="_blank" href="https://www.cnblogs.com/javascript:void(0);">任务管理</a>
  6.         <button title="Navigation menu" >
  7.             
  8.         </button>
  9.         
  10.    
  11.     <nav >
  12.         
  13.             <NavLink  href="kpTask/taskList">
  14.                  任务列表
  15.             </NavLink>
  16.         
  17.         
  18.             <NavLink  href="kpTask/taskRunList">
  19.                  任务执行记录
  20.             </NavLink>
  21.             
  22.             <NavLink  target="_blank" href="https://www.cnblogs.com/javascript:void(0);" @onclick="@(()=> ToggleMenuClick(0101))" >
  23.                  测试二级菜单组
  24.                
  25.             </NavLink>
  26.             
  27.             
  28.                 <nav >
  29.                     
  30.                         <NavLink  href="counter">
  31.                              测试二级菜单
  32.                         </NavLink>
  33.                         
  34.                         <NavLink  target="_blank" href="https://www.cnblogs.com/javascript:void(0);" @onclick="@(()=> ToggleMenuClick(010101))" >
  35.                              测试三级菜单组
  36.                            
  37.                         </NavLink>
  38.                         
  39.                         
  40.                             <nav >
  41.                                 
  42.                                     <NavLink  href="counter">
  43.                                          测试三级菜单
  44.                                     </NavLink>
  45.                                 
  46.                             </nav>
  47.                         
  48.                     
  49.                     
  50.                         <NavLink  href="counter">
  51.                              测试二级菜单2
  52.                         </NavLink>
  53.                     
  54.                 </nav>
  55.             
  56.         
  57.     </nav>
  58. await ToggleMenuClick(02))">
  59.    
  60.         <a  target="_blank" href="https://www.cnblogs.com/javascript:void(0);">任务管理</a>
  61.         <button title="Navigation menu" >
  62.             
  63.         </button>
  64.         
  65.    
  66.     <nav >
  67.         
  68.             <NavLink  href="kpTask/taskList">
  69.                  任务列表
  70.             </NavLink>
  71.         
  72.         
  73.             <NavLink  href="kpTask/taskRunList">
  74.                  任务执行记录
  75.             </NavLink>
  76.             
  77.             <NavLink  target="_blank" href="https://www.cnblogs.com/javascript:void(0);" @onclick="@(()=> ToggleMenuClick(0201))" >
  78.                  测试二级菜单组
  79.                
  80.             </NavLink>
  81.             
  82.             
  83.                 <nav >
  84.                     
  85.                         <NavLink  href="counter">
  86.                              测试二级菜单
  87.                         </NavLink>
  88.                     
  89.                 </nav>
  90.             
  91.         
  92.     </nav>
  93. await ToggleMenuClick(03))">
  94.    
  95.         <a  target="_blank" href="https://www.cnblogs.com/javascript:void(0);">任务管理</a>
  96.         <button title="Navigation menu" >
  97.             
  98.         </button>
  99.         
  100.    
  101.     <nav >
  102.         
  103.             <NavLink  href="kpTask/taskList">
  104.                  任务列表
  105.             </NavLink>
  106.         
  107.         
  108.             <NavLink  href="kpTask/taskRunList">
  109.                  任务执行记录
  110.             </NavLink>
  111.             
  112.             <NavLink  target="_blank" href="https://www.cnblogs.com/javascript:void(0);" @onclick="@(()=> ToggleMenuClick(0301))" >
  113.                  测试二级菜单组
  114.                
  115.             </NavLink>
  116.             
  117.             
  118.                 <nav >
  119.                     
  120.                         <NavLink  href="counter">
  121.                              测试二级菜单
  122.                         </NavLink>
  123.                     
  124.                 </nav>
  125.             
  126.         
  127.     </nav>
  128. @code {
  129.     int _index = 01;
  130.     Dictionary<int, bool> _dict = new Dictionary<int, bool>();
  131.     IJSObjectReference _module;
  132.     protected override async void OnAfterRender(bool firstRender)
  133.     {
  134.         if (firstRender)
  135.         {
  136.             _module = await _js.InvokeAsync<IJSObjectReference>("import", "./Shared/NavMenu.razor.js");
  137.         }
  138.     }
  139.     private async Task ToggleMenuClick(int index)
  140.     {
  141.         object[] args = new object[] { index };
  142.         object[] objs = await _module.InvokeAsync<object[]>("animate", args);
  143.         int time = ((JsonElement)objs[0]).GetInt32();
  144.         if (time > 0) { await Task.Delay(time); }
  145.         if (index > 99)
  146.         {
  147.             if (_dict.ContainsKey(index))
  148.             {
  149.                 _dict[index] = !_dict[index];
  150.             }
  151.             else
  152.             {
  153.                 _dict[index] = false;
  154.             }
  155.         }
  156.         else
  157.         {
  158.             _index = index;
  159.         }
  160.     }
  161.     private string MenuGroupContentClass(int index)
  162.     {
  163.         if (index > 99)
  164.         {
  165.             if (!_dict.ContainsKey(index) || _dict[index])
  166.             {
  167.                 return $"collapse content{index}";
  168.             }
  169.             else
  170.             {
  171.                 return $"content{index}";
  172.             }
  173.         }
  174.         else
  175.         {
  176.             if (index == _index)
  177.             {
  178.                 return $"content{index}";
  179.             }
  180.             else
  181.             {
  182.                 return $"collapse content{index}";
  183.             }
  184.         }
  185.     }
  186.     private string ArrowClass(int index)
  187.     {
  188.         if (index > 99)
  189.         {
  190.             if (!_dict.ContainsKey(index) || _dict[index])
  191.             {
  192.                 return "arrow-collapse arrow-float";
  193.             }
  194.             else
  195.             {
  196.                 return "arrow arrow-float";
  197.             }
  198.         }
  199.         else
  200.         {
  201.             if (index == _index)
  202.             {
  203.                 return "arrow";
  204.             }
  205.             else
  206.             {
  207.                 return "arrow-collapse";
  208.             }
  209.         }
  210.     }
  211. }
复制代码
来源:https://www.cnblogs.com/s0611163/archive/2023/01/07/17032770.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具