A morphing or full page transition enabled slide creation starter kit that uses View Transitions to do all the work.
Until View Transitions are supported across all browsers, this API and starter kit only works in Chrome Canary with chrome://flags/#view-transition-on-navigation enabled.
Inside the /pages
folder you create your slides, each slide is it's own Astro component that uses the /src/layouts/Slide.astro
layout.
There's one component called Controls.astro
that handles making and placing the next arrow.
It's all generally handled for you! Just use <h1>
elements, or images or links. Inside the /src/styles/transitions.css
you'll find the unique names given to the elements that tells the browser which shared elements should morph. Like if you have a code snippet on one page, and the next page also has one, the browser will transition between those snippets.
Full page transitions can be enabled on a per slide basis, by simply passing animation="page"
as a property to the Layout
/ Slide
component. This will on the other hand will automatically disable slide page morphing.
To write custom page transitions, you can simply hook into the functionality already provided by morphull. Currently, there are two data attributes that are written to the <html>
when the page is initialized that form the basis for all animations.
Attribute | Values | Description |
---|---|---|
data-view-transition-direction |
'forward' , 'back' , 'reload' |
The direction of navigation. Reload means that a page refresh is initiated. |
data-view-transition |
'page' , 'element' , Custom |
Default: 'element' . Animation identifier used within CSS |
With the help of these attributes and open-props custom page transitions can be written as easy as:
html:not([data-view-transition-direction="reload"])[data-view-transition="slide"] {
&::view-transition-new(root) {
animation: var(--animation-slide-in-left) forwards;
}
&::view-transition-old(root) {
animation: var(--animation-slide-out-left) forwards;
}
&[data-view-transition-direction="back"] {
&::view-transition-new(root) {
animation: var(--animation-slide-in-right) forwards;
}
&::view-transition-old(root) {
animation: var(--animation-slide-out-right) forwards;
}
}
}
In particular, we use :not([data-view-transition-direction="reload"])
in this example to prevent transitions from being replayed on page refresh. There is currently an ongoing discussion about this behavior right here.
A working example identical to the code above can be found in src/pages/example-3.astro
.