diff --git a/src/packages/sidebar/sidebar.taro.tsx b/src/packages/sidebar/sidebar.taro.tsx index 1a9d40a26e..534064310e 100644 --- a/src/packages/sidebar/sidebar.taro.tsx +++ b/src/packages/sidebar/sidebar.taro.tsx @@ -111,14 +111,26 @@ export const SideBar: FC> & { const titleRectRef = useRef([]) const [scrollTop, setScrollTop] = useState(0) const scrollDirection = (to: number) => { + if (sidebarDuration === 0) { + setScrollTop(to) + return + } + + const from = scrollTop + const frames = Math.round(sidebarDuration / 16) let count = 0 - const frames = sidebarDuration === 0 ? 1 : Math.round(sidebarDuration / 16) + function animate() { - setScrollTop(to) - if (++count < frames) { + const progress = count / frames + const current = from + (to - from) * progress + setScrollTop(current) + + if (count < frames) { + count++ raf(animate) } } + animate() } const scrollIntoView = (index: number) => {