fix(ui): improve GSAP page transition smoothness

This commit is contained in:
LTbinglingfeng
2026-01-24 14:03:15 +08:00
parent 7e56d33bf0
commit 305ddef900
2 changed files with 19 additions and 24 deletions

View File

@@ -14,6 +14,8 @@
gap: $spacing-lg; gap: $spacing-lg;
min-height: 0; min-height: 0;
flex: 1; flex: 1;
backface-visibility: hidden;
transform: translateZ(0);
// During animation, exit layer uses absolute positioning // During animation, exit layer uses absolute positioning
&--exit { &--exit {
@@ -22,17 +24,15 @@
z-index: 1; z-index: 1;
overflow: hidden; overflow: hidden;
pointer-events: none; pointer-events: none;
will-change: transform, opacity;
} }
} }
&--animating &__layer { &--animating &__layer {
will-change: transform, opacity; will-change: transform, opacity;
backface-visibility: hidden;
transform-style: preserve-3d;
} }
// When both layers exist, current layer also needs positioning &--animating &__layer:not(.page-transition__layer--exit) {
&--animating &__layer:not(&__layer--exit) {
position: relative; position: relative;
z-index: 0; z-index: 0;
} }

View File

@@ -71,10 +71,6 @@ export function PageTransition({
? 'forward' ? 'forward'
: 'backward'; : 'backward';
let cancelled = false;
queueMicrotask(() => {
if (cancelled) return;
setTransitionDirection(nextDirection); setTransitionDirection(nextDirection);
setLayers((prev) => { setLayers((prev) => {
const prevCurrent = prev[prev.length - 1]; const prevCurrent = prev[prev.length - 1];
@@ -86,11 +82,6 @@ export function PageTransition({
]; ];
}); });
setIsAnimating(true); setIsAnimating(true);
});
return () => {
cancelled = true;
};
}, [ }, [
isAnimating, isAnimating,
location, location,
@@ -152,8 +143,12 @@ export function PageTransition({
opacity: 1, opacity: 1,
duration: TRANSITION_DURATION, duration: TRANSITION_DURATION,
ease: 'power2.out', // smooth settle ease: 'power2.out', // smooth settle
clearProps: 'transform,opacity',
force3D: true, force3D: true,
onComplete: () => {
if (currentLayerRef.current) {
gsap.set(currentLayerRef.current, { clearProps: 'transform,opacity' });
}
},
}, },
ENTER_DELAY ENTER_DELAY
); );