Skip to content

Commit d7afe24

Browse files
committed
Smoother menu
1 parent d77fad3 commit d7afe24

2 files changed

Lines changed: 35 additions & 16 deletions

File tree

src/components/Navbar.css

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,21 @@
55
z-index: 40;
66
}
77

8+
.staggered-menu-panel,
9+
.sm-prelayer {
10+
will-change: transform;
11+
}
12+
13+
.staggered-menu-wrapper:not([data-open]) .staggered-menu-panel,
14+
.staggered-menu-wrapper:not([data-open]) .sm-prelayer {
15+
will-change: auto;
16+
}
17+
18+
.sm-icon,
19+
.sm-toggle-textInner {
20+
will-change: transform;
21+
}
22+
823
.staggered-menu-header,
924
.staggered-menu-panel,
1025
.sm-toggle,

src/components/Navbar.tsx

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,11 @@ export const Navbar = ({
9595
preLayerElsRef.current = preLayers;
9696

9797
const offscreen = position === 'left' ? -100 : 100;
98-
gsap.set([panel, ...preLayers], { xPercent: offscreen });
99-
gsap.set(plusH, { transformOrigin: '50% 50%', rotate: 0 });
100-
gsap.set(plusV, { transformOrigin: '50% 50%', rotate: 90 });
101-
gsap.set(icon, { rotate: 0, transformOrigin: '50% 50%' });
102-
gsap.set(textInner, { yPercent: 0 });
98+
gsap.set([panel, ...preLayers], { xPercent: offscreen, force3D: true });
99+
gsap.set(plusH, { transformOrigin: '50% 50%', rotate: 0, force3D: true });
100+
gsap.set(plusV, { transformOrigin: '50% 50%', rotate: 90, force3D: true });
101+
gsap.set(icon, { rotate: 0, transformOrigin: '50% 50%', force3D: true });
102+
gsap.set(textInner, { yPercent: 0, force3D: true });
103103
if (toggleBtnRef.current) gsap.set(toggleBtnRef.current, { color: menuButtonColor });
104104
});
105105
return () => ctx.revert();
@@ -141,15 +141,15 @@ export const Navbar = ({
141141
const tl = gsap.timeline({ paused: true });
142142

143143
layerStates.forEach((ls, i) => {
144-
tl.fromTo(ls.el, { xPercent: ls.start }, { xPercent: 0, duration: 0.5, ease: 'power4.out' }, i * 0.07);
144+
tl.fromTo(ls.el, { xPercent: ls.start }, { xPercent: 0, duration: 0.5, ease: 'power4.out', force3D: true }, i * 0.06);
145145
});
146-
const lastTime = layerStates.length ? (layerStates.length - 1) * 0.07 : 0;
147-
const panelInsertTime = lastTime + (layerStates.length ? 0.08 : 0);
146+
const lastTime = layerStates.length ? (layerStates.length - 1) * 0.06 : 0;
147+
const panelInsertTime = lastTime + (layerStates.length ? 0.06 : 0);
148148
const panelDuration = 0.65;
149149
tl.fromTo(
150150
panel,
151151
{ xPercent: panelStart },
152-
{ xPercent: 0, duration: panelDuration, ease: 'power4.out' },
152+
{ xPercent: 0, duration: panelDuration, ease: 'power4.out', force3D: true },
153153
panelInsertTime
154154
);
155155

@@ -163,7 +163,8 @@ export const Navbar = ({
163163
rotate: 0,
164164
duration: 1,
165165
ease: 'power4.out',
166-
stagger: { each: 0.1, from: 'start' }
166+
force3D: true,
167+
stagger: { each: 0.06, from: 'start' }
167168
},
168169
itemsStart
169170
);
@@ -174,7 +175,7 @@ export const Navbar = ({
174175
duration: 0.6,
175176
ease: 'power2.out',
176177
'--sm-num-opacity': 1,
177-
stagger: { each: 0.08, from: 'start' }
178+
stagger: { each: 0.06, from: 'start' }
178179
},
179180
itemsStart + 0.1
180181
);
@@ -202,7 +203,8 @@ export const Navbar = ({
202203
opacity: 1,
203204
duration: 0.55,
204205
ease: 'power3.out',
205-
stagger: { each: 0.08, from: 'start' },
206+
force3D: true,
207+
stagger: { each: 0.06, from: 'start' },
206208
onComplete: () => {
207209
gsap.set(socialLinks, { clearProps: 'opacity' });
208210
}
@@ -247,6 +249,7 @@ export const Navbar = ({
247249
duration: 0.32,
248250
ease: 'power3.in',
249251
overwrite: 'auto',
252+
force3D: true,
250253
onComplete: () => {
251254
const itemEls = Array.from(panel.querySelectorAll('.sm-panel-itemLabel'));
252255
if (itemEls.length) {
@@ -270,9 +273,9 @@ export const Navbar = ({
270273
if (!icon) return;
271274
spinTweenRef.current?.kill();
272275
if (opening) {
273-
spinTweenRef.current = gsap.to(icon, { rotate: 225, duration: 0.8, ease: 'power4.out', overwrite: 'auto' });
276+
spinTweenRef.current = gsap.to(icon, { rotate: 225, duration: 0.8, ease: 'power4.out', overwrite: 'auto', force3D: true });
274277
} else {
275-
spinTweenRef.current = gsap.to(icon, { rotate: 0, duration: 0.35, ease: 'power3.inOut', overwrite: 'auto' });
278+
spinTweenRef.current = gsap.to(icon, { rotate: 0, duration: 0.35, ease: 'power3.inOut', overwrite: 'auto', force3D: true });
276279
}
277280
}, []);
278281

@@ -325,13 +328,14 @@ export const Navbar = ({
325328
seq.push(targetLabel);
326329
setTextLines(seq);
327330

328-
gsap.set(inner, { yPercent: 0 });
331+
gsap.set(inner, { yPercent: 0, force3D: true });
329332
const lineCount = seq.length;
330333
const finalShift = ((lineCount - 1) / lineCount) * 100;
331334
textCycleAnimRef.current = gsap.to(inner, {
332335
yPercent: -finalShift,
333336
duration: 0.5 + lineCount * 0.07,
334-
ease: 'power4.out'
337+
ease: 'power4.out',
338+
force3D: true
335339
});
336340
}, []);
337341

0 commit comments

Comments
 (0)