Loosen scroll reveal trigger for mobile

This commit is contained in:
2025-11-18 23:04:02 +08:00
parent 80d0b236c5
commit 351a1a2f70

View File

@@ -21,24 +21,40 @@ export function ScrollReveal({
const el = ref.current; const el = ref.current;
if (!el) return; if (!el) return;
if (!('IntersectionObserver' in window)) {
setVisible(true);
return;
}
let cancelled = false;
const observer = new IntersectionObserver( const observer = new IntersectionObserver(
(entries) => { (entries) => {
entries.forEach((entry) => { entries.forEach((entry) => {
if (entry.isIntersecting) { if (entry.isIntersecting) {
setVisible(true); if (!cancelled) setVisible(true);
if (once) observer.unobserve(entry.target); if (once) observer.unobserve(entry.target);
} else if (!once) { } else if (!once) {
setVisible(false); if (!cancelled) setVisible(false);
} }
}); });
}, },
{ {
threshold: 0.15 threshold: 0.05,
rootMargin: '0px 0px -20% 0px'
} }
); );
observer.observe(el); observer.observe(el);
return () => observer.disconnect();
const fallback = window.setTimeout(() => {
if (!cancelled) setVisible(true);
}, 500);
return () => {
cancelled = true;
observer.disconnect();
window.clearTimeout(fallback);
};
}, [once]); }, [once]);
return ( return (
@@ -56,4 +72,3 @@ export function ScrollReveal({
</div> </div>
); );
} }