diff --git a/src/components/reader/pager/HorizontalPager.tsx b/src/components/reader/pager/HorizontalPager.tsx index cc854dc2..4d15f2fe 100644 --- a/src/components/reader/pager/HorizontalPager.tsx +++ b/src/components/reader/pager/HorizontalPager.tsx @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { MouseEvent as ReactMouseEvent, useEffect, useRef } from 'react'; +import { MouseEvent as ReactMouseEvent, useEffect, useLayoutEffect, useRef } from 'react'; import { Box } from '@mui/material'; import { IReaderProps } from '@/typings'; import { Page } from '@/components/reader/Page'; @@ -107,12 +107,18 @@ export function HorizontalPager(props: IReaderProps) { } }; - useEffect(() => { - // Delay scrolling to next cycle - setTimeout(() => { - // scroll last read page into view when initialPage changes - pagesRef.current[initialPage]?.scrollIntoView({ inline: 'center' }); - }, 0); + useLayoutEffect(() => { + const initialPageElement = pagesRef.current[initialPage]; + if (!initialPageElement) { + return () => {}; + } + + const resizeObserver = new ResizeObserver(() => { + initialPageElement.scrollIntoView({ inline: 'center' }); + }); + resizeObserver.observe(initialPageElement); + + return () => resizeObserver.disconnect(); }, [initialPage]); useEffect(() => { diff --git a/src/components/reader/pager/VerticalPager.tsx b/src/components/reader/pager/VerticalPager.tsx index c404557b..ea139f81 100644 --- a/src/components/reader/pager/VerticalPager.tsx +++ b/src/components/reader/pager/VerticalPager.tsx @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { useCallback, useEffect, useRef } from 'react'; +import { useCallback, useEffect, useLayoutEffect, useRef } from 'react'; import { Box } from '@mui/material'; import { IReaderProps } from '@/typings'; import { Page } from '@/components/reader/Page'; @@ -165,12 +165,18 @@ export function VerticalPager(props: IReaderProps) { }; }, [go]); - useEffect(() => { - // Delay scrolling to next cycle - setTimeout(() => { - // scroll last read page into view when initialPage changes - pagesRef.current[initialPage]?.scrollIntoView(); - }, 0); + useLayoutEffect(() => { + const initialPageElement = pagesRef.current[initialPage]; + if (!initialPageElement) { + return () => {}; + } + + const resizeObserver = new ResizeObserver(() => { + initialPageElement.scrollIntoView(); + }); + resizeObserver.observe(initialPageElement); + + return () => resizeObserver.disconnect(); }, [initialPage]); return (