diff --git a/components/Header.js b/components/Header.js index 23c0bba2..bbc8ee1d 100644 --- a/components/Header.js +++ b/components/Header.js @@ -1,7 +1,6 @@ import { useGlobal } from '@/lib/global' import { faArrowDown } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import throttle from 'lodash.throttle' import { useCallback, useEffect, useState } from 'react' import Typed from 'typed.js' @@ -23,23 +22,32 @@ export default function Header () { })) } }) - const scrollToCenter = () => { - document.getElementById('wrapper').scrollIntoView({ behavior: 'smooth' }) - } - const { theme } = useGlobal() // 监听滚动 let windowTop = 0 - const scrollTrigger = useCallback(throttle(() => { - if (window.scrollY > windowTop & window.scrollY < window.innerHeight) { - scrollToCenter() + let autoScroll = false + + const autoScrollEnd = () => { + windowTop = window.scrollY + autoScroll = false + console.log('滚动结束回调', windowTop) + } + const scrollTrigger = useCallback(() => { + console.log('触发 top', windowTop, 'y', window.scrollY, autoScroll) + if (window.scrollY > windowTop & window.scrollY < window.innerHeight & !autoScroll) { + // console.log('滚中间', windowTop, window.scrollY, window.innerHeight) + autoScroll = true + scrollTo(window.innerHeight, autoScrollEnd) } - if (window.scrollY < windowTop & window.scrollY < window.innerHeight) { - window.scroll({ top: 0, behavior: 'smooth' }) + if (window.scrollY < windowTop & window.scrollY < window.innerHeight & !autoScroll) { + // console.log('滚上', windowTop, window.scrollY, window.innerHeight) + autoScroll = true + scrollTo(0, autoScrollEnd) } windowTop = window.scrollY + updateTopNav() - }, 500)) + }) const updateTopNav = () => { if (theme !== 'dark') { @@ -65,7 +73,7 @@ export default function Header () {
-
+
{ scrollTo(window.innerHeight, autoScrollEnd) }} className='cursor-pointer w-full text-center text-2xl animate-bounce absolute bottom-10 text-white'>
} + +/** + * Native scrollTo with callback + * @param offset - offset to scroll to + * @param callback - callback function + */ +function scrollTo (offset, callback) { + const fixedOffset = offset.toFixed() + const onScroll = function () { + if (window.pageYOffset.toFixed() === fixedOffset) { + window.removeEventListener('scroll', onScroll) + callback() + } + } + + window.addEventListener('scroll', onScroll) + onScroll() + window.scrollTo({ + top: offset, + behavior: 'smooth' + }) +} diff --git a/components/SideAreaRight.js b/components/SideAreaRight.js index 5cb5a387..a3bc507d 100644 --- a/components/SideAreaRight.js +++ b/components/SideAreaRight.js @@ -74,7 +74,7 @@ const SideAreaRight = ({ -
+
{showToc && (
diff --git a/layouts/BaseLayout.js b/layouts/BaseLayout.js index 0efc1bfb..b73d0c80 100644 --- a/layouts/BaseLayout.js +++ b/layouts/BaseLayout.js @@ -1,6 +1,7 @@ import CommonHead from '@/components/CommonHead' import FloatDarkModeButton from '@/components/FloatDarkModeButton' import Footer from '@/components/Footer' +import Header from '@/components/Header' import JumpToBottomButton from '@/components/JumpToBottomButton' import JumpToTopButton from '@/components/JumpToTopButton' import LoadingCover from '@/components/LoadingCover' @@ -8,10 +9,9 @@ import SideAreaRight from '@/components/SideAreaRight' import TopNav from '@/components/TopNav' import { useGlobal } from '@/lib/global' import throttle from 'lodash.throttle' +import { useRouter } from 'next/router' import PropTypes from 'prop-types' import React, { useCallback, useEffect, useRef } from 'react' -import { useRouter } from 'next/router' -import Header from '@/components/Header' /** * 基础布局 采用左右两侧布局,移动端使用顶部导航栏 * @param children @@ -77,7 +77,7 @@ const BaseLayout = ({ {/* 首页头图 */} {router.asPath === '/' &&
} -
+
{/*