Scroll-driven animations is a good name. They are… animations… that are… scroll-driven. As you scroll you can make something happen. The most basic kind, where a @keyframe
is ran 0% to 100% as the element is scrolled 0% to 100% is particularly easy to wrap your mind around.
I also think it’s fun to mess with the expectations of scrolling.
In very light, fun-only, non-crucial ways. Not in ways that would hurt the access of content.
Like what if we made an element that definitely scrolled:
.scrolling-element {
height: 100dvh;
/* ... make something inside it taller than it is ... */
}
Code language: CSS (css)
But then all the content within it was position: fixed;
so it didn’t move normally when the element was scrolled.
.scrolling-element {
height: 100dvh;
> * {
position: fixed;
}
}
Code language: CSS (css)
Instead, we could have the elements react the scroll position however we wanted.
.scrolling-element {
scroll-timeline-name: --my-scroller;
scroll-timeline-axis: block;
> * {
position: fixed;
animation: doSomethingCool linear;
animation-timeline: --my-scroller;
}
}
@keyframes doSomethingCool {
100% {
rotate: 2turn;
}
}
Code language: CSS (css)
Here’s that basic setup:
I bet you could imagine that this is the same exact trick for a “scroll position indicator” bit of UI. Position that <div>
as like a 2px tall bar and have the scaleX
transform go from 0 to 100% and donezo.
I’ll use the same spirit here to have a whole grid of cells use that “scale to zero” animation to reveal a hidden picture.
I think that hidden picture thing is fun! I’m imagining a game where you have to guess the picture by scrolling down as little as possible. Like “name that tune” only “name that movie still” or whatever.
In this next one I took the idea a bit further and create randomized positions for each of the grid cells to “fly off” to (in SCSS).
I find that extraordinary that that kind of interaction can be done in HTML and CSS these days.