Skip to content

Commit 6db3a18

Browse files
committed
Easen up scrolling animations
1 parent b26c6fb commit 6db3a18

3 files changed

Lines changed: 26 additions & 55 deletions

File tree

src/components/ui/Reveal.astro

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
import { cn } from "@/utilities/classname";
33
4-
// Markup contract; paint/IO in scripts/reveal.ts, offsets in styles/style.css.
4+
// Eager entrance markup; paint/IO in reveal.ts, offsets in style.css.
55
// `delay` is a stagger index (0, 1, 2 ...) -> N * 15ms in CSS.
66
77
type Props = {
@@ -34,10 +34,10 @@ const {
3434
---
3535

3636
<Tag
37-
data-reveal
38-
data-reveal-variant={variant !== "up" ? variant : undefined}
37+
data-reveal={eager ? "" : undefined}
3938
data-reveal-eager={eager ? "" : undefined}
40-
style={`--reveal-delay: ${delay}`}
39+
data-reveal-variant={variant !== "up" ? variant : undefined}
40+
style={eager ? `--reveal-delay: ${delay}` : undefined}
4141
class={cn(className)}
4242
>
4343
<slot />

src/scripts/reveal.ts

Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,50 +6,21 @@ function revealImmediately(els: HTMLElement[]) {
66

77
function initReveal() {
88
const all = document.querySelectorAll<HTMLElement>(
9-
"[data-reveal]:not([data-revealed])",
9+
"[data-reveal-eager]:not([data-revealed])",
1010
);
1111
if (all.length === 0) return;
1212

13+
const reveals = Array.from(all);
1314
if (!isFirstLoad) {
14-
revealImmediately(Array.from(all));
15+
revealImmediately(reveals);
1516
return;
1617
}
1718

18-
const eager: HTMLElement[] = [];
19-
const scrolled: HTMLElement[] = [];
20-
for (const el of all) {
21-
if (el.hasAttribute("data-reveal-eager")) eager.push(el);
22-
else scrolled.push(el);
23-
}
24-
25-
if (eager.length > 0) {
19+
requestAnimationFrame(() => {
2620
requestAnimationFrame(() => {
27-
requestAnimationFrame(() => {
28-
revealImmediately(eager);
29-
});
21+
revealImmediately(reveals);
3022
});
31-
}
32-
33-
if (scrolled.length === 0) return;
34-
35-
if (typeof IntersectionObserver === "undefined") {
36-
revealImmediately(scrolled);
37-
return;
38-
}
39-
40-
const observer = new IntersectionObserver(
41-
(entries) => {
42-
for (const entry of entries) {
43-
if (!entry.isIntersecting) continue;
44-
const el = entry.target as HTMLElement;
45-
el.dataset.revealed = "true";
46-
observer.unobserve(el);
47-
}
48-
},
49-
{ rootMargin: "0px 0px -10% 0px", threshold: 0.05 },
50-
);
51-
52-
for (const el of scrolled) observer.observe(el);
23+
});
5324
}
5425

5526
if (document.readyState === "loading") {

src/styles/style.css

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@
180180
}
181181

182182
@layer utilities {
183-
[data-reveal] {
183+
[data-reveal-eager] {
184184
opacity: 0;
185185
transform: translateY(12px);
186186
transition:
@@ -190,46 +190,46 @@
190190
will-change: opacity, transform;
191191
}
192192

193-
html[data-spa-nav] [data-reveal] {
193+
html[data-spa-nav] [data-reveal-eager] {
194194
transition-duration: 250ms;
195195
transition-delay: 0ms;
196196
}
197-
html[data-spa-nav] [data-reveal] {
197+
html[data-spa-nav] [data-reveal-eager] {
198198
transform: translateY(6px);
199199
}
200-
html[data-spa-nav] [data-reveal][data-reveal-variant="down"] {
200+
html[data-spa-nav] [data-reveal-eager][data-reveal-variant="down"] {
201201
transform: translateY(-6px);
202202
}
203-
html[data-spa-nav] [data-reveal][data-reveal-variant="left"] {
203+
html[data-spa-nav] [data-reveal-eager][data-reveal-variant="left"] {
204204
transform: translateX(-8px);
205205
}
206-
html[data-spa-nav] [data-reveal][data-reveal-variant="right"] {
206+
html[data-spa-nav] [data-reveal-eager][data-reveal-variant="right"] {
207207
transform: translateX(8px);
208208
}
209-
html[data-spa-nav] [data-reveal][data-reveal-variant="fade"] {
209+
html[data-spa-nav] [data-reveal-eager][data-reveal-variant="fade"] {
210210
transform: none;
211211
}
212-
html[data-spa-nav] [data-reveal][data-reveal-variant="scale"] {
212+
html[data-spa-nav] [data-reveal-eager][data-reveal-variant="scale"] {
213213
transform: scale(0.98);
214214
}
215215

216-
[data-reveal][data-reveal-variant="down"] {
216+
[data-reveal-eager][data-reveal-variant="down"] {
217217
transform: translateY(-12px);
218218
}
219-
[data-reveal][data-reveal-variant="left"] {
219+
[data-reveal-eager][data-reveal-variant="left"] {
220220
transform: translateX(-16px);
221221
}
222-
[data-reveal][data-reveal-variant="right"] {
222+
[data-reveal-eager][data-reveal-variant="right"] {
223223
transform: translateX(16px);
224224
}
225-
[data-reveal][data-reveal-variant="fade"] {
225+
[data-reveal-eager][data-reveal-variant="fade"] {
226226
transform: none;
227227
}
228-
[data-reveal][data-reveal-variant="scale"] {
228+
[data-reveal-eager][data-reveal-variant="scale"] {
229229
transform: scale(0.96);
230230
}
231231

232-
[data-reveal][data-revealed="true"] {
232+
[data-reveal-eager][data-revealed="true"] {
233233
opacity: 1;
234234
transform: none;
235235
}
@@ -458,8 +458,8 @@
458458
scroll-behavior: auto !important;
459459
}
460460

461-
[data-reveal],
462-
[data-reveal][data-reveal-variant] {
461+
[data-reveal-eager],
462+
[data-reveal-eager][data-reveal-variant] {
463463
opacity: 1 !important;
464464
transform: none !important;
465465
transition: none !important;

0 commit comments

Comments
 (0)