Javascript IntersectionObserverEntry.intersectionRatio等于1,然后在刷新页面时更改为0
我试图延迟某些乐蒂动画,直到容器div完全(100%)在视图中。我正在使用Javascript IntersectionObserverEntry.intersectionRatio等于1,然后在刷新页面时更改为0,javascript,reactjs,next.js,styled-components,intersection-observer,Javascript,Reactjs,Next.js,Styled Components,Intersection Observer,我试图延迟某些乐蒂动画,直到容器div完全(100%)在视图中。我正在使用react,样式化组件,next.js。我还直接使用了IntersectionObserver 预期行为:如果元素完全在视图中,则返回true。否则返回false 实际行为:刷新页面时,如果元素不在视图中,则返回true,然后返回false:)。这会触发我的useffect,它最终会播放不在视图中的动画 我首先尝试了包react intersection observer。它产生了同样的结果。所以我想自己去实现它。 当实
react
,样式化组件
,next.js
。我还直接使用了IntersectionObserver
预期行为:如果元素完全在视图中,则返回true
。否则返回false
实际行为:刷新页面时,如果元素不在视图中,则返回true
,然后返回false
:)。这会触发我的useffect
,它最终会播放不在视图中的动画
我首先尝试了包react intersection observer
。它产生了同样的结果。所以我想自己去实现它。
当实例化IntersectionObserver
并为其提供1
或[0,1]
时,我尝试使用阈值
选项。它给出了同样的行为。所以我最后自己检查了intersectionRatio,这也没有解决问题
使用IntersectionObserver代码:
function useIntersectionObserver() {
const targetRef = useRef<HTMLDivElement>(null);
const [isIntersecting, setIsIntersecting] = useState(false);
useEffect(() => {
const observer = new IntersectionObserver(
([entry]) => {
console.log(entry);
setIsIntersecting(entry.intersectionRatio === 1);
},
{
root: window.document.body,
threshold: [0, 1]
}
);
if (targetRef.current) observer.observe(targetRef.current);
return () => {
observer.disconnect();
};
}, [targetRef]);
return { targetRef, isIntersecting };
}
猜猜:这可能是因为SSR吗?。查看是否所有元素的日志都显示在控制台中。如果是这种情况,可以在设置相交之前添加process.browser检查。
useEffect(() => {
console.log(isIntersecting);
if (isIntersecting) {
setTimeout(
() => {
lottieWeb.play('green-graph-lottie');
},
isInitialLoad ? BASE_DELAY * 1000 : 50
);
}
}, [isIntersecting]);