如何将现有的Blazor项目的主题切换写的更好看?

简介: 如何将现有的Blazor项目的主题切换写的更好看?

如何将现有的Blazor项目的主题切换写的更好看?

在现有的系统当中,我们的主题切换会比较生硬,下面我们将基于Masa Blazor实现好看的扩散主题切换的样式效果。

安装MASA.Template

dotnet new install MASA.Template

image.png

创建Masa Blazor项目

打开vs2022
image.png

选择server app模板

打开wwwroot/css/site.css
image.png

添加一下代码,这个代码是核心样式实现。 animation: clip .5s ease-in;的.5s则是扩散时间。


::view-transition-old(root) {
   
   
    animation: none;
}
::view-transition-new(root) {
   
   
    mix-blend-mode: normal;
    animation: clip .5s ease-in;
}

@keyframes clip {
   
   
    from {
   
   
        clip-path: circle(0% at var(--x) var(--y));
    }
    to{
   
   
        clip-path: circle(100% at var(--x) var(--y));
    }
}

打开Pages/_Host.cshtml

添加以下代码,请添加到body的内部的最尾部的位置。

    <script>
        window.switchTheme = function (dotNetHelper, x, y) {
   
   
            document.documentElement.style.setProperty('--x', x + 'px')
            document.documentElement.style.setProperty('--y', y + 'px')
            document.startViewTransition(() => {
   
   
                dotNetHelper.invokeMethodAsync('SwitchTheme');
            });

        }
    </script>

这个方法向window添加一个switchTheme的js方法,需要传递调用的实例,x,y则是扩散的开始位置,

然后会创建一个css的变量,这个变量对应到上面的clip里面的var(--x)和var(--y)

打开Shared\MainLayout.razor,修改成以下代码

@inherits LayoutComponentBase
@inject GlobalConfig GlobalConfig
@inject IJSRuntime JsRuntime
@inject MasaBlazor MasaBlazor

<MApp >
    <PPageTabsProvider>
        <CascadingValue Value="GlobalConfig.Culture.Name" Name="CultureName">
            <MAppBar  Elevation=0 App Height="100" Class="default-app-bar mx-6">
                 <div class="default-app-bar__actions @PageModeClass">
                     <Favorite />
                     <MSpacer />
                     <Search />
                     <MIcon Size=20 Class="ml-5" Color="neutral-lighten-3">mdi-message-processing-outline</MIcon>
                     <MIcon Size=20 Class="ml-5" Color="neutral-lighten-3" OnClick="() => _showSetting = true">mdi-cog-outline</MIcon>
                     <Language OnLanguageChanged="OnLanguageChanged" />
                     <MButton OnClick="ClickSwitchTheme">切换</MButton>
                     <Login />
                 </div>
                 <div class="default-app-bar__nav @PageModeClass">
                     @if (_pageTab == PageModes.PageTab)
                    {
                        <PageTabs @ref="_pageTabs" SelfPatterns="@s_selfPatterns" />
                    }
                    else
                    {
                        <Breadcrumb />
                    }
                </div>
            </MAppBar>

            <Navigation />

            <MMain Class="fill-lighten-1">
                <div class="pa-6">
                    @if (_pageTab == PageModes.PageTab)
                    {
                        <PPageContainer PageTabs="@_pageTabs?.PPageTabs" SelfPatterns="@s_selfPatterns">
                            @Body
                        </PPageContainer>
                    }
                    else
                    {
                        @Body
                    }
                </div>
            </MMain>
            <Settings @bind-PageModel="_pageTab" @bind-Show=_showSetting />
        </CascadingValue>
    </PPageTabsProvider>
</MApp>

@code {

    private DotNetObjectReference<MainLayout>? objRef;

    private bool dark = false;

    private static readonly string[] s_selfPatterns =
    {
        "/app/todo"
    };

    private bool? _showSetting;

    private string? _pageTab;

    private PageTabs? _pageTabs;

    private string PageModeClass => _pageTab == PageModes.PageTab ? "page-mode--tab" : "page-mode--breadcrumb";

    protected override void OnInitialized()
    {
        objRef = DotNetObjectReference.Create(this);
    }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        await base.OnAfterRenderAsync(firstRender);

        if (firstRender)
        {
            await GlobalConfig.InitFromStorage();
        }
    }

    void OnLanguageChanged(CultureInfo culture)
    {
        GlobalConfig.Culture = culture;
    }

    private void ClickSwitchTheme(MouseEventArgs args)
    {
        _ = JsRuntime.InvokeVoidAsync("switchTheme", objRef, args.ClientX, args.ClientY);
    }

    [JSInvokable]
    public void SwitchTheme()
    {
        dark = !dark;
        MasaBlazor.ToggleTheme();
    }

}

在这里我们提供了SwitchTheme用于提供个js调用从而切换主题。

我们在原有的基础上添加了一个按钮,并且这个按钮点击会触发ClickSwitchTheme事件,然后通过JsRuntim调用js的方法,并且将当前实例传递到js,args.ClientX,args.ClientY则是点击的位置,我们会用点击的位置作为扩散的位置。

下面是运行效果,由于Masa Pro并没有适配暗夜效果,所以看的并不明显。如果你想看到更好的效果可以查看open666.cn

screenshots.gif

这是使用的简单Demo的效果。
1.gif

技术交流群:

BlazorQQ群:452761192

来自token的分享。

目录
相关文章
|
2月前
|
开发框架 前端开发 JavaScript
构建响应式设计超赞!Blazor 与 Bootstrap 完美结合,开启高效 Web 开发新潮流!
【8月更文挑战第31天】在当前的网络环境中,响应式设计是打造优质用户体验的核心。为满足用户在不同设备上的需求,Blazor结合Bootstrap成为构建响应式设计的高效方案。Blazor作为C#和 .NET技术栈下的Web开发框架,实现了服务端与客户端同语言开发,提升了开发效率与代码维护性。而Bootstrap作为一个流行的前端框架,提供了丰富的CSS和JavaScript组件,便于快速搭建美观且响应式的用户界面。结合两者的优点,可以轻松实现复杂Web应用的高效开发。
29 0
|
2月前
|
前端开发 C# 开发者
WPF开发者必读:MVVM模式实战,轻松构建可维护的应用程序,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离关注点,提高了代码的可维护性和可扩展性。本文详细介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定与逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种模式,开发者可以更高效地构建桌面应用程序。希望本文能帮助你在WPF开发中更好地应用MVVM模式。
69 0
|
2月前
|
开发者 C# 存储
WPF开发者必读:样式与模板的艺术,轻松定制UI外观,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,样式与模板是实现美观界面与一致性的关键工具。样式定义了控件如字体、颜色等属性,而模板则允许自定义控件布局与子控件,两者均可存储于`.xaml`文件中。本文介绍了样式与模板的基础知识,通过示例展示了如何创建并应用它们来改变按钮的外观,从而提升用户体验。
34 0
|
5月前
|
搜索推荐 iOS开发 开发者
利用SwiftUI构建动态用户界面:iOS开发新篇章
【4月更文挑战第10天】在移动应用的世界中,流畅的用户体验和引人注目的界面设计是至关重要的。随着SwiftUI的推出,iOS开发者被赋予了创造高度动态且响应式界面的能力。本文将深入探讨如何利用SwiftUI的强大特性来实现一个动态用户界面,包括其声明性语法、状态绑定以及视图更新机制。我们将通过一个天气应用案例,了解如何有效地运用这些工具来提升应用的交互性和视觉吸引力。
|
5月前
|
Web App开发 传感器 编解码
移动WEB页面开发
移动WEB页面开发
|
11月前
|
前端开发 JavaScript C#
基于TDesign风格的Blazor企业级UI组件库
基于TDesign风格的Blazor企业级UI组件库
89 0
|
前端开发
Concis组件库 | 暗黑模式设计
Concis已开工半年时间,开源免费,欢迎大家体验、一起折腾。你可以通过以下方式来支持作者。
105 1
Concis组件库 | 暗黑模式设计
|
JavaScript 前端开发 C#
Blazor Hybrid (Blazor混合开发)更好的读取本地图片
Blazor Hybrid (Blazor混合开发)更好的读取本地图片
120 0
Blazor Hybrid (Blazor混合开发)更好的读取本地图片
|
前端开发 JavaScript UED
前端设计系统和UI组件库的搭建
前端设计系统和UI组件库的搭建
341 0
|
前端开发 API Android开发
封装库/工具库中重要概念之字体图标
在前端开发中,使用图标是非常常见的需求。传统的图像格式(例如PNG和JPEG)虽然可以实现图标展示,但它们具有一些不足之处,如文件大小较大、缩放不清晰等等。字体图标则是一种新型的解决方案,它将图标以字符形式嵌入到Web页面中,并且具有矢量属性,因此可以无限缩放而不失真。在本文中,我们将探讨前端中一些常用的字体图标封装库和工具库。
96 0
下一篇
无影云桌面