Allows current and previous route to exist enabling page transition animations.
Sometimes you need to show transitions between page routes but Blazor, by default, only allows one. This Razor component library provides the ability to remember the last route and allows you to perform transitions out and in, on the old and new route views. You can also use this information to contextually perform different transitions based on the route page types being transitioned.
- .NET 6 (and prior .net standard 2.1 using v3.1.0 or before)
- Two transition implementation options; Blazor coded or jsInterop
- Transition data provided allowing different transitions based on context
- Optionally remember previous page state
- Works with browser navigation history, forward and back
- Very simple to use, only a couple of file changes required
Install-Package BlazorTransitionableRoute
or
dotnet add package BlazorTransitionableRoute
Add reference to _Imports.razor file
@using BlazorTransitionableRoute
Add registrations for the dependency injection framework in Program.cs
, for example
builder.Services.AddScoped<BlazorTransitionableRoute.IRouteTransitionInvoker, MyRouteTransitionInvoker>();
Or BlazorTransitionableRoute.DefaultRouteTransitionInvoker
if you implement transitions via Blazor code and not via jsInterop.
You will need to change App.razor
to use the newly provided TransitionableRoutePrimary/Secondary
components
Modify the App.razor file
Modify the App.razor file to take advantage of the transitionable route layouts and view. This means moving the MainLayout
to be more explicit in the app router and providing a more container like MyViewLayout
as the default layouts. You can see below the simple use of primary and secondary route views. The TransitionableRoutePrimary / Secondary
modify the RouteData
passed to each inner TransitionableRouteView
based on the active state, which is swapped after each navigation to preserve component instances.
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<LayoutView Layout="@typeof(MainLayout)">
<TransitionableRoutePrimary RouteData="@routeData" ForgetStateOnTransition="true">
<TransitionableRouteView DefaultLayout="@typeof(MyViewLayout)" />
</TransitionableRoutePrimary>
<TransitionableRouteSecondary RouteData="@routeData" ForgetStateOnTransition="true">
<TransitionableRouteView DefaultLayout="@typeof(MyViewLayout)" />
</TransitionableRouteSecondary>
</LayoutView>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
Create your own transitiong view
This example code shows the Blazor coded implementation. For jsInterop see the example usage section below.
@inherits TransitionableLayoutComponent
<div class="@transitioningClass">
@Body
</div>
@code {
private string transitioningDirection => Transition.Backwards ? "Up" : "Down";
private string transitioningClass => Transition.FirstRender ? "" : Transition.IntoView
? $"animate__fadeIn{transitioningDirection} animate__faster animate__animated"
: $"animate__fadeOut{transitioningDirection} animate__faster animate__animated";
}
Transition
parameter is provided by the inherited TransitionableLayoutComponent
Notes on usage
- This library does not provide animation styles, it simply provides the means to hook into how and when to trigger them.
- If you need to remember page state, to keep track of scroll position for example, you will need to set
ForgetStateOnTransition
tofalse
- If so, depending on your transition library used, you will need to use z-order, pointer-events, offset position, or other means, of the layout views to cope with interacting with the current route where the switched route is still present but hidden.
- If you need to handle in-app back buttons then use the jsInterop to call the native back i.e.
window.history.back();
- If you use
AuthorizeRouteView
then you will have to create you own razor component similar toTransitionableRouteView
and consume in theApp.razor
file. See the 'Example Usage' section below for details.
The library provides a simple set of properties to aid you in adding transitions to your projects.
The TransitionableLayoutComponent
, which you may inherit, providing
Transition
propertiesIntoView
- true, if the route should be made visibleBackwards
- true, if you want to reverse animations, for instanceFirstRender
- true, if you want to stop transitioning because of first loadRouteData
reference data you may like to useSwitchedRouteData
reference data you may like to use
TransitionType
a tuple property to allow custom transitions based on what is being transitionedfromType
is the previous routePageType
toType
is the active routePageType
There is also IRouteTransitionInvoker
that you implement when using jsInterop for transitions
InvokeRouteTransitionAsync
- provides theTransition
parameter and where you invoke JS interop.
You can find detailed documentation on example usage here
These demos show examples of the Blazor coded transition option (for the Javascript interop transition option, see the detailed documentation mentioned above).
- The
BlazorTransitionableRouteDemoWasm
demo for WebAssembly Apps. see commit for implementation details- For
AuthorizeRouteView
changes see this commit
- For
- The
BlazorTransitionableRouteDemoServer
demo for Server Apps. see commit for implementation details- For
AuthorizeRouteView
changes see this commit
- For
- Version 4.0.0 .NET 6 component, previously .NET Standard 2.1.
- Version 3.1.0 - previous documentation
- Addition of
TransitionDurationMilliseconds
to clear switched route view after transition. Only whenForgetStateOnTransition
is set to true.
- Addition of
- Version 3.0.0 - previous documentation
- Implemented new
Transition.SwitchedRouteData
along withTransition.RouteData
to provide means to perform custom transitions. i.e. parent/child views.
- Implemented new
- Version 2.1.0 - previous documentation and v3 breaking changes
- Addition of
ForgetStateOnTransition
option to reset page state when returning to previous route via navigation.
- Addition of
- Version 2.0.0 - previous documentation
- Simplified implemention and usage
- Transitions can now also be done via Blazor code as well as jsInterop
- Adjust transition behaviour on first render via
Transition.FirstRender
- Get the transition direction from
Transition.Backwards
- Version 1.0.0 - documentation and v2 breaking changes
- Check behaviour for slow loaded pages and handle transition when in ready state or suggest best practice for pages that exhibit this.
- Make
ForgetStateOnTransition
configurable to specific page types - Potentially move increasing numbers of parameter settings to configuration options
- Remember scroll positions and set when transition.